
Linux 向けローカル権限昇格エクスプロイト。CVE-2026-31431 を悪用し、AF_ALG 暗号 API を splice() と組み合わせてページキャッシュを改ざんし、root シェルを起動します。
このリポジトリには、CVE-2026-31431(別名「Copy Fail」)に対するLinuxローカル権限昇格PoCが含まれています。
このエクスプロイトは、AF_ALGユーザースペース暗号APIにおけるLinuxカーネルのalgif_aeadパスを標的としています。AF_ALGとsplice()を組み合わせて使用し、カーネルに/usr/bin/suのページキャッシュへ4バイト単位で書き込ませた後、ページキャッシュが変更された状態でsuを実行します。
copy_fail_exp.py内のPoCは4つの処理を行います:
authencesn(hmac(sha256),cbc(aes))を使用してaead用のAF_ALGソケットを開きます。setsockopt()値でリクエストを設定します。splice()呼び出しを使用して、ターゲットファイルからAF_ALGリクエストパス(バグのあるカーネルパス)へデータを移動します。/bin/shを含むELFスタブです。zlibブロブはランダムデータではありません。これは/usr/bin/suの先頭部分をページキャッシュ内で置き換え、次回のsu実行時にルートシェルが起動するようにするためのコンパクトなペイロードです。
脆弱なコードはLinuxカーネル4.14時代のalgif_aead変更で導入され、インプレース最適化を元に戻すアップストリーム修正が適用されるまで存在し続けました。
algif_aeadインプレースパスを含むLinuxカーネル。AF_ALG暗号APIが有効なシステム(ほとんどの汎用Linuxディストリビューションではデフォルトで有効)。| ディストリビューション | カーネル |
|---|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 |
| RHEL 10.1 |
6.18.226.19.127.0ダウンストリームのLTSブランチは、ベンダーのバックポートが実際に実行しているカーネルパッケージに適用された後にのみ安全です。
所有しているラボ用VMまたはコンテナホストを使用してください。本番システムでは実行しないでください。
/usr/bin/suが存在し、setuid-rootであることを確認します。python3 copy_fail_exp.py
/usr/bin/suをパッチし、その後suを呼び出します。環境に応じて、ルートシェルまたはルートプロンプトが表示されます。このスクリプトには、Python 3標準ライブラリ以外の追加依存関係はありません。
python3 copy_fail_exp.py
ターゲットを事前に検査したい場合、スクリプトは現在デフォルトで/usr/bin/suを使用します。
ダウンストリームカーネルを保守している場合、正しい修正方法は、インプレースAEAD最適化を削除するアップストリームのリバートをバックポートすることです:
a664bf3d603dc3bdcf9ae47cc21e0daec706d7a572548b093ee3インプレース変更をほぼ元に戻します。ダウンストリームカーネルツリーでの推奨ワークフロー:
git cherry-pick a664bf3d603dc3bdcf9ae47cc21e0daec706d7a5
make olddefconfig
make -j"$(nproc)"
make modules_install
make install
reboot
自分でカーネルを再ビルドしない場合は、バックポートを含むベンダーカーネルパッケージをインストールし、それで再起動してください。
パッチ適用が遅れる場合、一時的な措置としてモジュールパスを無効にします:
echo "install algif_aead /bin/false" > /etc/modprobe.d/disable-algif-aead.conf
rmmod algif_aead 2>/dev/null
これは緩和策であり、修正ではありません。
6.12.0-124.45.1.el10_1 |
| SUSE 16 | 6.12.0-160000.9-default |