On-entry container attack - CVE-2016-9962
この情報は役に立ちましたか?
Docker でコンテナーのエントリー上の脆弱性が発見され、 CVE-2016-9962 が割り当てられています。この不具合では、 ptrace
を使用して特定の攻撃が実行され、ファイル記述子が不適切にフラッシュされることによりコンテナー外部のコンテンツがアクセスされます。この攻撃は、特権コンテナーを実行している場合にのみリスクとなり、このリスクは SELinux によって軽減されます。
この問題は 2017 年 1 月 10 日に公開されました。
背景情報
この脆弱性は、通常は 1 つの名前空間で実行されるプロセスが別の名前空間で起動されたり、別の名前空間に移動された場合に発生します。プロセスは異なる名前空間内のプロセスを確認または操作することはできないため、名前空間は通常セキュリティーメカニズムとして動作します。問題は、プロセスが名前空間に移動されると、その名前空間にすでに存在するプロセスによって悪意のあるアクションが実行される可能性があることです。エントリー上の脆弱性によって、nsenter
または docker exec
を使用して コンテナーを結合するプロセスが攻撃されます。攻撃に成功すると、悪意のあるプロセスがシステムにアクセスしたり、その他の特権を得たりすることが可能になります。
たとえば、悪意のあるプロセスによってコンテナーが乗っ取られ、そのコンテナー内の root
が取得された場合、そのプロセスは「確認」できる他のプロセスを kill することができます。コンテナーの名前空間は、悪意のあるプロセスがホストプロセスや他のコンテナーのプロセスを検出または kill できないようにします。ただし、管理者が nsenter
を使用してシェルをそのコンテナーに移動し、問題を調査しようとすると、悪意のあるプロセスはそのシェルを特定し、操作 (および終了) することが可能です。
脆弱な Linux 機能
以下の正規の Linux 機能は、エントリー上の攻撃で悪用される可能性があります。SELinux
や seccomp
などの Linux セキュリティーメカニズムを使用して、このような悪用を防止してください。
- ptrace
「プロセストレース」またはptrace
は、Linux で使用できる強力なデバッグ機能です。必要な権限を持つプロセスは、ptrace
カーネルコールにてptrace
を別のプロセスに対して実行できます。ptrace
は、メモリーやリソース (ファイル記述子など) などの極めて低いレベルのアクセスや、 プロセスカーネルコールを傍受する機能を付与します。 - docker exec
docker exec
は、既存のコンテナー内で追加のプロセスを実行できるサービスで、docker デーモンによって提供されます。通常、これはコンテナーの検査や手動変更を行うために使用されます。たとえば、問題のあるコンテナー内で bash シェルを実行し、動作をデバッグするには、docker exec -it container-name /bin/bash
を使用できます。 - nsenter
nsenter
は、特定の名前空間内でプロセスを移動または起動するために使用する Linux ユーティリティーです。コンテナーは Linux 名前空間上に構築されるため、nsenter
は汎用バージョンのdocker exec
として使用することができます。 - カーネルの機能
Linux では、従来root
アカウントに付与された特別な権利が個別の権利に分割され、通常の管理権限よりも多くの権限が付与されることがあります。たとえば、CAP_SYS_TIME
はシステムクロックを設定する権利のみを付与します。これに対し、CAP_SYS_ADMIN
はマシンの管理に必要なさまざまな権限を付与します。各カーネルの機能はプロセスに対して個別に付与したり取り消したりできます。 - seccomp
Linux 機能seccomp
はカーネルコールへのアクセスを個別に許可します。
Red Hat セキュリティーレスポンスチームでは、本件によるセキュリティー上の影響度を中程度の影響 と評価しています。
影響を受ける製品
Red Hat 製品の次のバージョンに影響します。
- Red Hat Enterprise Linux 7
- Red Hat Openshift Container Platform
- RHEL Atomic Host
影響
CVE-2016-9962 の不具合は、docker exec
に安全対策がないために発生します。
アップストリーム docker 1.12.6 より前までは、docker exec
で起動されたプロセスに対してはコンテナー内部で ptrace
を実行することができ、起動プロセスはコンテナー外部のコンテンツにリンクされたファイル記述子を短時間保持しました。これは、ptrace
機能を持つコンテナー内のプロセスによって悪用される可能性がありました。悪意のあるプロセスが迅速に動作し、起動プロセスに対して ptrace
を実行することができれば、コンテナー外部のコンテンツにアクセスできました。この問題は docker 1.12.6 で対処され、これらのプロセスに対する「ptrace」の実行を阻止して (プロセス属性 DUMPABLE
を使用)、起動プロセスが移動される前にそのファイル記述子をフラッシュするようになりました。
バックポートなしでも、ほとんどのインストールは影響を 受けません。
- docker ランタイムはデフォルトで、
CAP_SYS_PTRACE
など多くのカーネル機能のコンテナーを取り除きます。つまり、この機能が明示的に追加されたコンテナー (または--privileged
スイッチで実行されているコンテナー) のみが問題を引き起す可能性があります。さらに、これらのコンテナー内の特権プロセスのみが問題を引き起こす可能性があります。これらのコンテナー内の特権のないユーザープロセスには問題の原因になるほどの権限はありません。そのため、「特権コンテナーを実行しない」および「コンテナー内で root プロセスを実行しない」という推奨事項に従っていれば、リスクは発生しません。 - SELinux が有効になっている Red Hat システムでは、特権コンテナーのリスクも軽減します。SELinux はコンテナープロセスが実際のファイル記述子にアクセスできても、コンテナープロセスによるホストコンテンツへのアクセスを阻止します。
- ほとんどのインストールでは、
nsenter
およびdocker exec
を手動のみで操作します。OpenShift はnsenter
を使用してポート転送を行いますが、 手動で操作しないと vanilla docker はプロセスをコンテナーに移動したり、コンテナー間で移動したりしません。
脆弱性の診断
対処方法
影響を受けるバージョンの docker を使用しているすべての Red Hat のお客様には、パッチのリリース時に docker を更新することが推奨されます。影響を受けるパッケージや推奨される軽減策の詳細は以下を参照してください。
影響を受ける製品の更新
製品 | パッケージ | アドバイザリー/更新 |
---|---|---|
Red Hat Enterprise Linux 7 | docker-latest、docker、runc | RHSA-2017-0116、RHSA-2017-0123、RHSA-2017-0127 |
Red Hat Openshift Container Host | docker-latest、docker | パッチ適用済み |
RHEL Atomic Host | docker-latest、docker、runc | パッチ適用済み |
軽減策
ptrace
およびその他の危険なカーネルコールはコンテナーで禁止することができます。カスタムの seccomp プロファイルを作成して、この動作を禁止することができます (vanilla docker、OpenShift、および Kubernetes によってサポートされます)。これにより、CVE-2016-9962 ベースの攻撃が完全に阻止されます。
Comments