セキュリティ研究者が、一般のローカルユーザーをrootに昇格させるLinuxの脆弱性を発見しました。注目すべき点は、ディスク上のファイルを一切変更せずに攻撃が成立することです。悪意ある変更はファイル本体ではなくメモリ上のコピーに存在するため、整合性チェックでは何も検出されない場合があります。
この脆弱性にはCVE-2026-46331という識別子と「pedit COW」という通称が付けられています。Linuxカーネル内のネットワークトラフィックを管理するトラフィックコントロールサブシステムに潜んでいます。より具体的には、パケットヘッダーをオンザフライで書き換えるact_peditアクションにバグが存在します。Red HatはこれをImportant(重要)と評価しており、CVEが6月16日に公開されたわずか1日後には実証済みのエクスプロイトが一般公開されました。
pedit COWが危険な理由
最も懸念されるのは、その攻撃手法です。このエクスプロイトはディスク上のファイルを書き換えないため、バイナリに通常の痕跡を残しません。代わりに、攻撃者は/bin/suのようなsetuid-rootプログラムのキャッシュされたメモリ内コピーを汚染します。次に小さなコードを埋め込み、変更されたイメージをroot権限で起動します。
ディスク上のファイルは無傷のまま残ります。そのため、攻撃者がすでにrootシェルを掌握している状態であっても、標準的な整合性スキャンはシステムをクリーンと報告する可能性があります。
攻撃に必要な2つの条件
攻撃者には2つの条件が必要です。1つ目は、システムにact_peditモジュールがロードされていること。2つ目は、一般ユーザーが非特権ユーザー名前空間を利用できることです。この名前空間内で攻撃者はローカルのCAP_NET_ADMIN権限を取得でき、脆弱なカーネルパスに到達するにはそれで十分です。テストしたRHELおよびDebianのシステムでは、両方の条件が満たされていました。
根本原因:コピーオンライトの実装不備
問題の根本は、コピーオンライト(CoW)の実装に欠陥があることです。tcツールはpeditアクションを通じてパケットヘッダーを編集できます。編集前に、カーネル関数tcf_pedit_act()はデータのプライベートコピーを作成する必要があります。しかし残念ながら、境界チェックが最終的なオフセットの計算よりも早い段階で実行されてしまいます。
ここに問題の核心があります。一部のpeditルールは実行時にのみ正確なオフセットを取得します。その結果、書き込みがプライベートコピーの範囲を超えてしまい、カーネルは分離されたバッファではなく共有のページキャッシュページを変更してしまいます。そのページがキャッシュされたファイルに属している場合、ファイルのメモリ内イメージが破損します。
類似する脆弱性の系譜
この脆弱性は、Dirty Pipe、Copy Fail、DirtyClone、Dirty Fragといった既知の脆弱性と類似した構造を持っています。いずれのケースでも、高速なカーネルパスがカーネルの排他的な所有ではないメモリページに書き込みを行い、ページキャッシュがその影響を受けます。
ただし、pedit COWはその侵入口において一線を画しています。一般ユーザーがホスト上で実際の管理者権限を持たなくても、ユーザー名前空間内でtcアクションを設定し、必要なCAP_NET_ADMINを取得できます。実際、実証済みのProof of Conceptが一連の攻撃チェーン全体を実演しています。
影響を受けるディストリビューション
PoC作者は、RHEL 10およびDebian 13 trixieでのroot昇格に成功したと報告しています。いずれのシステムでも、非特権ユーザー名前空間がデフォルトで開放されています。Ubuntu 24.04では、ユーザー名前空間を許可するAppArmorプロファイルが存在する場合に攻撃が成立しました。Ubuntu 26.04はデフォルトでこのパスをブロックしており、AppArmorプロファイルが非特権ユーザー名前空間を制限していますが、カーネル自体は依然として脆弱です。
修正状況はディストリビューションによって異なります。Debianはすでにセキュリティチャンネルを通じてtrixieにパッチを適用していますが、Debian 11および12は当初のアドバイザリでは依然として脆弱とされています。6月25日時点で、Ubuntuは18.04から26.04までのすべてのサポート対象リリースを影響あり(affected)として掲載しています。Red HatはRHEL 8、9、10を対象として挙げており、RHEL 7はブレティンに記載されていません。
システムの防御方法
最優先の対策はシンプルです。パッチが適用されたカーネルをインストールし、マシンを再起動してください。特に、ローカルユーザーが必ずしも信頼されたユーザーとは限らないサーバーを優先的に対応してください。この対象には、マルチユーザーホスト、CI/CDランナー、Kubernetesノード、ビルドマシン、研究環境、教育用ラボなどが含まれます。
一時的な緩和策
カーネルを迅速に更新できない場合もあります。そのような状況では、攻撃チェーンを2つの方法で断ち切ることができます。
tc peditルールを必要としないシステムでは、lsmod | grep act_peditでモジュールがロードされているか確認してください。その後、install act_pedit /bin/trueを/etc/modprobe.d/disable-act_pedit.confに追加することで、今後のロードをブロックできます。
または、非特権ユーザー名前空間を無効化する方法もあります。RHELではuser.max_user_namespaces=0を、DebianおよびUbuntuではkernel.unprivileged_userns_clone=0を使用します。この手順でエクスプロイトが依存するローカル権限を取り除けます。ただし、rootlessコンテナ、CIサンドボックス、ブラウザの分離機能が動作しなくなる可能性があるため、まずステージング環境でテストしてください。
検出とクリーンアップ
この攻撃はメモリキャッシュを標的とするため、通常のファイルチェックでは侵害を見逃す可能性があります。echo 3 > /proc/sys/vm/drop_cachesでページキャッシュをフラッシュすれば、破損したメモリ内コピーをクリアできます。ただし、すでに開かれているrootシェルを閉じることはできません。したがって、エクスプロイトがホスト上で実行された可能性がある場合は、そのマシンが侵害されたものとして扱ってください。
脆弱性開示タイミングの教訓
特に注目すべき点があります。パッチは5月下旬にnetdevメーリングリストに提出されていましたが、その際は単なる通常のデータ破損修正として提示されていました。数週間にわたり、このバグの悪用可能な意味合いは、CVEも専用のセキュリティ警告も付与されないまま、誰でも閲覧できる状態に置かれていました。
CVEが登録されたのは6月16日にフィックスがマージされた後のことであり、完成したPoCはわずか1日後に公開されました。ページキャッシュ系のバグにおいて、このスピードは明確な教訓を示しています。スキャナールールの更新を待つのでは、単純に手遅れです。
翻訳元: https://meterpreter.org/linux-pedit-cow-vulnerability/