On-entry container attack - CVE-2016-9962

Public Date: January 16, 2017, 10:50
更新 June 15, 2017, 15:07 - Chinese, Simplified 英語 French Korean
Resolved 状態
Important Impact

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 バージョンにバックポートされた修正が含まれているかどうかを確認するには、このスクリプト をダウンロードして使用します。

対処方法

影響を受けるバージョンの docker を使用しているすべての Red Hat のお客様には、パッチのリリース時に docker を更新することが推奨されます。影響を受けるパッケージや推奨される軽減策の詳細は以下を参照してください。

影響を受ける製品の更新

製品パッケージアドバイザリー/更新
Red Hat Enterprise Linux 7docker-latest、docker、runcRHSA-2017-0116RHSA-2017-0123RHSA-2017-0127
Red Hat Openshift Container Hostdocker-latest、dockerパッチ適用済み
RHEL Atomic Hostdocker-latest、docker、runcパッチ適用済み

軽減策

ptrace およびその他の危険なカーネルコールはコンテナーで禁止することができます。カスタムの seccomp プロファイルを作成して、この動作を禁止することができます (vanilla docker、OpenShift、および Kubernetes によってサポートされます)。これにより、CVE-2016-9962 ベースの攻撃が完全に阻止されます。

Comments