Kernel Local Privilege Escalation "Dirty COW" - CVE-2016-5195
Red Hat セキュリティーレスポンスチームは、Linux カーネルの脆弱性について認識しており、この脆弱性は CVE-2016-5195 で対応されています。この問題は 2016 年 10 月 19 日 に公開され、重要な影響と評価されました。この問題はメディアでは「Dirty COW」として報道されています。
背景情報
Linux カーネルのメモリーサブシステムが、プライベートな読み取り専用メモリーマッピングのコピーオンライト (COW) の破壊に対処する方法で競合状態が発生することが判明しました。権限のないローカルユーザーがこの不具合を悪用すると、本来は読み取り専用であるメモリーマッピングに対する書き込み権限を取得できるため、システム上での権限の昇格が可能になる場合があります。
攻撃者がこの不具合を悪用すると、既存の setuid ファイルが権限を昇格する指示によって変更される可能性があります。この脆弱性を悪用したケースはすでに報告されています。これは、最近の Linux ディストリビューションのほとんどに影響します。
Red Hat セキュリティーレスポンスチームでは、本件によるセキュリティー上の影響度を重要な影響と評価しています。
影響を受ける製品
Red Hat 製品の次のバージョンに影響します。
- Red Hat Enterprise Linux 5
- Red Hat Enterprise Linux 6
- Red Hat Enterprise Linux 7
- Red Hat Enterprise MRG 2
- Red Hat Openshift Online v2
- Red Hat Virtualization (RHEV-H/RHV-H)
攻撃の詳細と影響
この不具合により、ローカルシステムのアカウントを持つ攻撃者は、適切な権限がなければ変更できない標準のパーミッションメカニズムを無視してディスク上のバイナリーを変更することができます。これは、mmap で実行可能ファイルのページをメモリーにマッピングしている状態で madvise(MADV_DONTNEED) システムコールを競合状態にすると実行できます。
脆弱性の診断
対処方法
影響を受けるバージョンのカーネルを実行する Red Hat のすべてのお客様には、パッチのリリース直後にカーネルを更新することが強く推奨されます。影響を受けるパッケージや推奨される軽減策の詳細は以下を参照してください。カーネルの更新を適用するには、システムを再起動する必要があります。
影響を受ける製品の更新
CVE-2016-5195 に関する修正は、Red Hat Enterprise Linux 7.3 の最新リリースに含まれています。
Red Hat Enterprise Linux 7.2 以降を実行しているお客様は、kpatch を利用できます。kpatch を利用する場合は、サポートケースを作成してください。
kpatch の詳細については、 RHEL 7 はライブカーネルパッチ (kpatch) をサポートしていますか? を参照してください。
製品 | パッケージ | アドバイザリー/更新 |
---|---|---|
Red Hat Enterprise Linux 7 | kernel | RHSA-2016:2098 |
Red Hat Enterprise Linux 7 | kernel-rt | RHSA-2016:2110 |
Red Hat Enterprise Linux 7.1 Extended Update Support (EUS: 延長アップデートサポート)* | kernel | RHSA-2016:2118 |
Red Hat Enterprise Linux 6 | kernel | RHSA-2016:2105 |
Red Hat Enterprise Linux 6.7 Extended Update Support (EUS: 延長アップデートサポート)* | kernel | RHSA-2016:2106 |
Red Hat Enterprise Linux 6.6 Advanced Update Support** | kernel | RHSA-2016:2128 |
Red Hat Enterprise Linux 6.5 Advanced Update Support** | kernel | RHSA-2016:2120 |
Red Hat Enterprise Linux 6.4 Advanced Update Support** | kernel | RHSA-2016:2133 |
Red Hat Enterprise Linux 6.2 Advanced Update Support** | kernel | RHSA-2016:2132 |
Red Hat Enterprise Linux 5 | kernel | RHSA-2016:2124 |
Red Hat Enterprise Linux 5.9 Advanced Update Support** | kernel | RHSA-2016:2126 |
Red Hat Enterprise Linux 5.6 Advanced Update Support** | kernel | RHSA-2016:2127 |
RHEL Atomic Host | kernel | イメージのリスピンを実行 (2016 年 11 月 3 日) |
Red Hat Enterprise MRG 2 | kernel-rt | RHSA-2016:2107 |
Red Hat Virtualization (RHEV-H/RHV-H) | kernel | 保留中 |
*このパッチを取得するには、有効な EUS サブスクリプションが必要です。
お持ちのアカウントに有効な EUS サブスクリプションがない場合は、詳細について Red Hat 営業部門または営業の担当者にお問い合わせください。
Red Hat Enterprise Linux Extended Update Support サブスクリプションとは何ですか?
**RHEL AUS のパッチを入手するには、有効な AUS サブスクリプションが必要です。
軽減策
Red Hat サポートでは、正式なパッチがリリースされるまでの一時的な措置として SystemTap スクリプトなどの軽減策を提供しています。SystemTap スクリプトのサポート期間は、最終パッチの GA リリース後 30 日間のみです。
systemtap による回避策のビルドおよび使用方法
systemtap による対策では、脆弱なシステムコールを傍受する systemtap スクリプトを使用して (ドライバーなどの) カーネルモジュールを作成します。これは、修正されたカーネルが影響を受けるマシンで起動されるまでの応急処置として使用されます。このソリューションは再起動を必要とせず、RHEL 5、6、および 7 に適用されます。
すべてのカーネルに適用されるモジュールを作成することはできません。ファミリー (RHEL 5、6、または 7 すべて) の場合も同様です。特定のカーネルバージョンごとに、そのカーネル (uname -r) の .ko を生成する必要があります。
要件
sytemtap モジュールをビルドするには、以下のパッケージが必要になります。
- systemtap-client
- systemtap-devel
- gcc (およびその依存関係)
- kernel-devel-`uname -r`
- kernel-debuginfo-`uname -r`
- kernel-debuginfo-common-`uname -r`
警告: 'kernel' パッケージは実行中のカーネルと同じバージョンである必要があります。最新バージョンをダウンロードすると systemtap が動作しなくなります。実行中のカーネルと同じバージョンをダウンロードしてください。
debuginfo パッケージの入手
KB ( https://access.redhat.com/solutions/9907 ) を参照してください。
モジュールのビルド方法
1. 必要なパッケージをインストールした後に、以下の内容が含まれる dirtycow.stp という名前のファイルを作成します。
probe kernel.function("mem_write").call ? { $count = 0 } probe syscall.ptrace { // includes compat ptrace as well $request = 0xfff } probe begin { printk(0, "CVE-2016-5195 mitigation loaded") } probe end { printk(0, "CVE-2016-5195 mitigation unloaded") }
2. ファイルを保存します。以下のコマンドを実行してコンパイルします。
# stap -g -p 4 -m dirtycow_`uname -r|tr -cd [:digit:]` dirtycow.stp dirtycow_26183985.ko
上記の例では、.ko ファイル名にカーネルバージョンを特定する番号があります。この例では 2.6.18-398.el5 になります。このモジュールは、debuginfo および development パッケージをインストールせずに、同じカーネルバージョンの他のシステムで使用することができます。必要なのは systemtap-runtime のみになります。同じカーネルバージョンを持つサーバーにモジュールファイルをコピーし、systemtap-runtime パッケージをインストールして、次の手順に進みます。
3. コマンド staprun -L <.ko file> を実行し、モジュールをロードします。以下は例になります。
# staprun -L dirtycow_26183985.ko
4. ロードされているかどうかを確認します。
# dmesg | grep CVE-2016-5195 CVE-2016-5195 mitigation loaded
5. モジュールをアンロードするには、システムを再起動するか、次に示すようにコマンド「staprun -A dirtycow_26183985」を実行して Ctlr+C で割り込みを行います。
# staprun -A dirtycow_26183985 ^C Message from syslogd@... kernel:CVE-2016-5195 mitigation unloaded
重要
- モジュールは起動後に維持されません。つまり、システムのブート後にリロードされません。
- 再起動後は、モジュールを手動で再ロードする必要があります。
- カーネルが更新または変更されていると、このモジュールは新しいカーネルにロードされません。
- 修正なしの別のカーネルでブートすると、新しい互換性のあるモジュールがロードされるはずです。
- 修正されたカーネルにモジュールをロードする必要はありません。
軽減策の詳細な手順は、バグ 1384344 を参照してください。
Comments