transparent huge page における"Dirty COW" のバリアント - CVE-2017-1000405
Red Hat Product セキュリティーチームは、Linux kernel 内の脆弱性について認識しています。この脆弱性には、CVE-2017-1000405 が割り当てられています。この問題は 2017年 11月 29 日に公開され、重要な影響 と評価されています。
背景情報
Linux カーネルのメモリーサブシステムが、メモリーマッピングをベースとしたプライベートな読み取り専用の huge-page のコピーオンライト (COW) を処理する方法において、競合状態が発生することが判明しました。
この不具合を悪用すると、権限のないローカルユーザーが、本来は読み取り専用であるメモリーマッピングへの書き込み権限を取得し、読み取り専用ページを修正できるようになるため、ユーザースペースのアプリケーションの動作に影響を及ぼすことが可能になります。
謝辞
Red Hat は、Eylon Ben Yaakov 氏と Daniel Shapiro 氏がこの問題を報告してくださったことに感謝いたします。
影響を受ける製品
以下の Red Hat 製品のバージョンが影響を受けます。
Red Hat Enterprise Linux 7 for ARM および Red Hat Enterprise Linux for Power LE
影響を受けない製品
以下の Red Hat 製品のバージョンでは、この問題をもたらすコミットをバックポートしていないので、影響を受けません。
- Red Hat Enterprise Linux 5、6、7
- Red Hat Enterprise MRG 2
Red Hat の Linux コンテナーは、今回の不具合のようなカーネル問題による直接の影響は受けませんが、Red Hat では最新版のコンテナーイメージを使用することを推奨しています。Red Hat Container Catalogue に含まれる Container Health Index を使用すると、お使いのコンテナーのセキュリティー状況を確認できます。
攻撃の詳細と影響
この不具合により、ローカルシステムのアカウントを持つ攻撃者は、適切なパーミッションなしでは編集できないようにする標準のパーミッションメカニズムを迂回して、従来は「読み取り専用」と考えられていた hugepage を変更することが可能になります。touch_pmd と can_follow_write_pmd のアクセスを競合させることで、COW サイクルを経ることなく pmd を「ダーティー」とすることができ、上記が可能になります。
攻撃者が実行できる最も初歩的な攻撃方法は、物理ページ 0 を変更することです。ELF フォーマットのアプリケーションバイナリーは、このページが読み取り専用にマッピングされ、その "BSS" セクションの一部として利用可能であることに依存しています。コンパイラーは、変数が未初期化されている (0 に設定) ことを想定して、コードを作成します。この不具合を利用すると、COW プロセスなしに物理ページ 0 のマッピングと書き込みが可能になります。このため、このページのすべてのマッピングには 0 の値のみが含まれるという不変式が壊されて、予想外で未定義の動作が発生します。
今回のバグは、攻撃者が変更できるメモリーページのタイプを勘案すると、元の "Dirty COW" ほど深刻なものではありません。通常のファイルは、transparent huge page を使ってマッピングできません。ただし、BSS セグメントがゼロにマッピングされていることを想定しているユーザースペースアプリケーションを悪用することで、権限のエスカレーションが可能になります。
脆弱性の診断
対処方法
影響を受けるバージョンのカーネルをご使用のお客様は、パッチのリリース直後にカーネルを更新することが強く推奨されます。影響を受けるパッケージや推奨される軽減策の詳細については、以下を参照してください。カーネルの更新を適用するには、システムを再起動する必要があります。
影響を受ける製品の更新
製品名 | パッケージ | アドバイザリー/更新 |
---|---|---|
Red Hat Enterprise Linux 7 for ARM および Red Hat Enterprise Linux for Power LE | kernel-alt | 保留中 |
軽減策
この不具合を悪用する際にはまず、ページ 0 を変更してユーザーのコンテンツで置き換えることになります。異なる攻撃方法が見つけられる可能性もあるので、ご使用の環境に適した軽減策を検討してください。1 次軽減策:
/sys ディレクトリー内の設定を以下のように修正すると、0 ページが huge page としてマッピングされることを回避できます。この方法により、今回の不具合の悪用を防ぐことができます。
# echo 0 > /sys/kernel/mm/transparent_hugepage/use_zero_page
この軽減策はシステムを再起動すると維持されないため、システムを起動するたびに適用する必要があります。
2 次軽減策:
システム上で hugepage を無効にすることで、この不具合を軽減することもできます。ユーザーのアプリケーションによっては、パフォーマンスを上げるために hugepage を必要とするものもあるので、hugepage なしで実行するとパフォーマンスが下がる場合もあります。
Red Hat では、transparent hugepages を無効にする方法を以下のページで説明しています。
- Red Hat Enterprise Linux 7 で transparent hugepages (THP) を無効にする: https://access.redhat.com/ja/solutions/1565043
お使いのアプリケーションで transparent huge pages を必要とする場合は、ソフトウェアベンダーに確認してください。
Ansible Playbook
Ansible playbook が利用可能です。正規のスクリプトであることを確認するために、GPG 分離署名 もダウンロードできます。
この Playbook は、HOSTS という名前の変数に対して実行され、以下の方法で起動できます (「hostname」がインベントリーファイルで定義されていることが前提)。
# ansible-playbook -e HOSTS=hostname cve-2017-1000405-mitigate.yml
この Playbook には root 権限が必要なため、適切なパーミッションのあるアカウントを使用する必要があります。
Comments