その他の 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 のバグです。特別なカーネル内の DSL が、seccomp ファイルかのように装うことで、カーネルメモリを任意に読み込み可能にします。コンテナ内で(皮肉にも) seccomp を使ってブロックされます。
CVE-2016-3134、 4997、 4998: setsockopt の
IPT_SO_SET_REPLACE
、ARPT_SO_SET_REPLACE
、ARPT_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 security non-events