コピー失敗:ページキャッシュを通じてルートアクセスを許可するLinuxの脆弱性

キーポイント:
  • 攻撃者はAF_ALGソケットを開き、認証アルゴリズムを要求する。
  • 攻撃者はsplice()関数を使用して、ターゲットファイルのキャッシュ(例:/usr/bin/su)からページをソケットに供給します。これらのページは出力ハッシュリスト(書き込み可能)の一部となります。
  • 攻撃者は、悪意を持って設計された関連認証データ(AAD)を含むメッセージ(sendmsg)を送信します。このメッセージの4~7バイト目には、攻撃者が書き込みたいデータ(例えば、悪意のあるコード)が含まれています。
  • 復号化がトリガーされると、authencesn は AAD から 4 バイトを取得し、一時的にバッファの末尾に書き込みます。インプレース最適化により、このバッファの末尾はファイルキャッシュページを直接指します。
  • 暗号化処理は失敗する(暗号文が無効である)が、4バイトの書き込みは既に行われており、元に戻されることはない。
  • 攻撃者はこのプロセスを繰り返して自身のコードを注入します。/usr/bin/suが実行されると、カーネルはメモリから改変されたバージョンをロードし、注入されたコードをroot権限で実行します。

コピー失敗

Linuxのセキュリティは、 脆弱性CVE-2026-31431、「コピー失敗」と名付けられました。 Xint Codeの研究者による。理論上の欠陥どころか、この設計上の問題は これにより、権限を持たないローカルユーザーが権限を昇格させ、完全なアクセス権を取得できるようになります。 予測可能かつ静かな方法でスーパーユーザーとして行動する。

研究者らは、この脆弱性がUbuntu、Amazon Linux、RHEL、SUSEなどの主要なディストリビューションで悪用されていることを確認し、 バージョン4.14より後のカーネルを実行しているシステム、 維持 AF_ALGソケットのサポートを有効にすると、潜在的に脆弱性が生じる可能性があります。 この攻撃に対して。

インプレース操作とページキャッシュのオーバーフロー

判決に関して、これは これは、2017年にカーネルの暗号化API(AF_ALG)に導入された最適化に遡ります。 この修正は 不要なバッファリングをなくしたかったのです。 認証付き暗号化(AEAD)操作を同じメモリ空間内で直接実行すること。これは「インプレース」操作として知られています。

El この最適化をsplice()関数と組み合わせると重大な問題が生じます。 この方式では、データを物理的にコピーするのではなく、カーネルページキャッシュへの直接参照を転送することで、ファイルディスクリプタ間でデータを転送します。復号化を要求すると、メモリ構造が構成され、本来はユーザーの一時的な領域であるはずの宛先バッファが、システムファイルデータを含むキャッシュページに直接リンクされるようになります。

メモリの制限を超えた認証と書き込み

El この脆弱性の最終的な引き金は、認証アルゴリズムの異常な動作にある。 宛先バッファの境界を厳密に尊重する他の暗号化ルーチンとは異なり、 この特定のアルゴリズムは、ユーザーのメモリ空間を一時的な作業領域として使用します。 (メモ帳)認証タグ計算中にバイトシーケンスを並べ替える。

このプロセスでは、アルゴリズムは出力領域に設定された制限を超えて 4 バイト書き込みます。インプレース最適化と splice() によって作成された参照チェーンにより、この一見無害な文章は、ユーザーの記憶の境界を越える。 そして、処理中のファイルに関連付けられたカーネルキャッシュページに直接アクセスします。

この一連の論理的失敗 これにより、攻撃者は特定のキャッシュ位置にある4バイトを任意に上書きする能力を得る。 読み取れるファイルごとにページ数を計算します。一連の計算されたリクエストを送信することで、 攻撃者は悪意のあるコードを注入することができる ユーザー切り替えツールなど、suidビットが設定された重要な実行可能ファイルのメモリ内バージョン。

すべての読み取り操作は最初にページキャッシュを照会するため、次に正当なユーティリティが呼び出されると、 システムはメモリから注入されたコードを実行し、即座にルート権限を付与します。 ハードドライブ上の物理ファイルを一切変更することなく、攻撃を実行できます。さらに深刻なのは、コンテナ分離は基盤となるホストのページキャッシュを共有するため、この脆弱性はKubernetesクラスタなどの仮想化環境から脱出し、プライマリノードを侵害するための直接的な入り口となることです。

緊急パッチと緩和策

この判決の重大性を考えると、 保守チームは緊急アップデートを展開しました。 決定的な解決策は algif_aead.c ファイル内のインプレース最適化を元に戻し、ソースメモリリストとデスティネーションメモリリストを厳密に分離します。 キャッシュされたページが書き込み可能なパスに保存されるのを防ぐため。

これらのパッチは既にカーネル6.18.22、6.19.12、および7.0に統合されており、長期サポートブランチにもバックポートされています。サーバーをすぐに再起動または更新できない管理者は、algif_aeadカーネルモジュールが外部でコンパイルされている場合はそれを無効にするか、SELinuxなどのセキュリティポリシーを使用してAF_ALGソケットの作成を厳しく制限することをお勧めします。SELinuxは、例えば現在のAndroidデバイスをこの脅威から保護してきた保護機能です。

最後に、さらに詳しく知りたい場合は、次のリンクで詳細を確認できます。


Googleで優先ソースとして追加する