Docker セキュリティ(重要性低い)

このページではセキュリティぜい弱性一覧を示します。 Docker においては、バグに対する軽減対応がなされています。 もっとも Docker コンテナーにおいて起動するプロセスでは、たとえバグ修正されなくても、元からぜい弱性があるとは言えません。 ここではコンテナーの起動にあたって、ケーパビリティーは追加せず、あるいは --privileged としては起動していないことを前提とします。

以下は、バグ一覧とはとても言えないものです。 むしろこれは、ほんのわずかなバグの例にすぎず、セキュリティレビューやぜい弱性の公開を行うに至ったことから、バグとして気づいたものでしかありません。 おそらく報告されているバグよりも、報告されていないバグの方がはるかに多いはずです。 ただし Docker が採用するセキュアな手法は、デフォルトにおいて AppArmor や Seccomp の利用、そして限定的なケーパビリティーの利用を行っているため、既知のバグはもちろん、未知のバグを軽減できる可能性があります。

バグ(軽減対応あり)

  • CVE-2013-1956, 1957, 1958, 1959, 1979, CVE-2014-4014, 5206, 5207, 7970, 7975, CVE-2015-2925, 8543, CVE-2016-3134, 3135, など: 非特権ユーザーによる名前空間が導入されたことにより、非特権ユーザーでもアクセス可能な場所への攻撃が大幅に増えることになりました。 mount() のように従来なら root 権限でしかアクセスできなかったシステムコールが、非特権ユーザーであっても正当にアクセスできるようになってしまったからです。 ここにあげた CVE はすべて、ユーザー名前空間の導入にともなうセキュリティぜい弱性の例です。 Docker ではコンテナーの設定時にユーザー名前空間を利用します。 しかしデフォルトの seccomp プロファイルを通じて、コンテナー内のプロセスにおいては、ネスト化した名前空間の生成ができなくなっており、そのぜい弱性は悪用できなくなっています。
  • CVE-2014-0181, CVE-2015-3339: これは setuid バイナリを必要とするバグです。 Docker ではコンテナー内において、NO_NEW_PRIVS プロセスフラグとその他の仕組みによって setuid バイナリを無効にします。
  • CVE-2014-4699: ptrace() にあるバグであり、権限昇格を許してしまうものです。 Docker では、AppArmor、seccomp、そして CAP_PTRACE の削除により、コンテナー内での ptrace() を無効にしています。 ここでは三重の防御が行われているわけです。
  • CVE-2014-9529: 巧妙に仕掛けられた keyctl() 呼び出しを繰り返すことによって、カーネル DoS 攻撃やメモリ破壊を行います。 Docker では seccomp を利用して、コンテナー内部での keyctl() を無効にしています。
  • CVE-2015-3214, 4036: 仮想ドライバーによく見られるバグであり、ゲスト OS のユーザーがホスト OS 上のコードを実行できてしまうものです。 これを悪用するには、ゲスト内の仮想デバイスにアクセスする必要があります。 Docker では --privileged の指定がない場合は、そういったデバイスへの直接アクセスを隠蔽します。 ここがおもしろいところで、このケースが、VM よりもコンテナーの方が「より安全」と言えるかもしれない点です。 つまりコンテナーよりも VM の方が「より安全」とされる常識に反している例です。
  • CVE-2016-0728: 巧妙な keyctl() 呼び出しによる開放メモリへの use-after-free 攻撃により、権限昇格を可能とします。 Docker ではデフォルトの seccomp プロファイルの利用により、コンテナー内部での keyctl() を無効にしています。
  • CVE-2016-2383: eBPF におけるバグであり、seccomp フィルターのようなものを表現するために利用される特殊なカーネル内 DSL が、カーネルメモリの任意の読み込みを可能にします。 システムコール bpf() は、Docker コンテナー内部においては(皮肉なことに)seccomp を使ってブロックされます。
  • CVE-2016-3134, 4997, 4998: setsockopt の IPT_SO_SET_REPLACEARPT_SO_SET_REPLACEARPT_SO_SET_REPLACE を利用することで、メモリ破壊、ローカル権限昇格を可能にしてしまうバグです。 これらの引数は CAP_NET_ADMIN によってブロックでき、Docker ではデフォルトで許可していません。

バグ(対応 なし

  • CVE-2015-3290, 5157: カーネルのノンマスカブル割り込み処理におけるバグであり、権限昇格を可能にします。 Docker コンテナー内での悪用が可能です。 現時点においてシステムコール modify_ldt() が seccomp を使ってもブロックできないためです。
  • CVE-2016-5195: Linux カーネルのメモリサブシステムがコピーオンライト(copy-on-write; COW)を扱う際に、競合状態が発生し、プライベートな読み込み専用メモリのマッピングが破損してしまうことがわかりました。 この際にローカルの非特権ユーザーが、読み込み専用メモリへの書き込み権限を有してしまうことが起こります。 これは 「Dirty COW」とも呼ばれます。 部分的なバグ軽減: オペレーティングシステムの中には、このぜい弱性を軽減できているものがあります。 そこでは seccomp の ptrace に対するフィルタリングと、/proc/self/mem が読み込み専用であることを利用して対処しています。
Docker, Docker documentation, security, security non-events