
# CVE-2026-31431 用ローカル権限昇格エクスプロイト LinuxカーネルのAF_ALG + spliceページキャッシュ上書きに対するローカル権限昇格エクスプロイトです。PoC、BPFtrace検出スクリプト、および認可されたセキュリティ研究用のQEMUテスト環境が含まれています。
AF_ALG + splice によるページキャッシュ上書きを利用した Linux カーネルローカル権限昇格
認可されたセキュリティ研究、ペネトレーションテスト、および教育目的のみに使用してください。 所有していないシステム、または明示的な書面による許可を得ていないシステムに対しては使用しないでください。
CVE-2026-31431 は、Linux カーネルにおけるローカル権限昇格(LPE)の脆弱性です。権限のないローカルユーザーが、AF_ALG ソケットインターフェースと splice() を組み合わせることで、setuid バイナリが属するページキャッシュページへの認証済み書き込みを直接実行し、root アクセスを獲得できます。
このエクスプロイトは、ディスク上の inode を変更することなくページキャッシュ内の su バイナリを上書きし、ファイルメタデータやブロックレベルのチェックサムのみに依存する整合性メカニズムを回避します。
.
├── exploit.py # PoC — ページキャッシュ上書きと権限昇格
├── detect.bt # リアルタイム検出用 BPFtrace スクリプト
├── run-vm.sh # QEMU テスト環境自動化(任意)
├── PAYLOAD.md # ペイロードエンコーディング解析(hex → zlib → ELF → shellcode)
└── LICENSE
脆弱なシステム上で exploit.py を権限のないローカルユーザーとして実行します — sudo は不要です:
python3 exploit.py
このスクリプトは以下の手順を実行します:
AF_ALG(algif_aead)のカーネルサポートを検証し、su バイナリを特定します。su バイナリを生のファイルディスクリプタとして開き、AF_ALG + sendfile を介してページキャッシュページを上書きします。対応アーキテクチャ:
detect.bt を使用して、エクスプロイト試行をリアルタイムで監視します。root 権限が必要です:
sudo bpftrace detect.bt
# または
doas bpftrace detect.bt
このスクリプトは、@suspect[pid] のビットマスクを使用して PID ごとに 3 つの指標を追跡します:
同じ PID で 3 つのビットすべてが設定された場合(@suspect[pid] == 0x7)、アラートが発動します。
exploit.pyAF_ALG/algif_aead モジュールがロードされた Linux カーネルdetect.btbpftrace ≥ 0.12# Ubuntu/Debian
sudo apt install bpftrace
# RHEL/CentOS/Fedora
sudo dnf install bpftrace
# Amazon Linux
sudo yum install bpftrace
# SUSE
sudo zypper install bpftrace
# Alpine
sudo apk add bpftrace
ディストリビューションのカーネルパッケージを、メインラインコミット
a664bf3d603d
を含むバージョンに更新してください。このコミットは 2017 年の algif_aead インプレース最適化をリバートし、ページキャッシュページが書き込み可能な宛先 scatterlist に含まれないようにします。現在、ほとんどの主要ディストリビューションがこの修正を提供しています。
algif_aead の無効化(パッチ適用までの間)blacklist は明示的な modprobe algif_aead で回避できます。install .../bin/false ディレクティブはインストールコマンドを完全に上書きし、すべてのロード試行を失敗させます:
echo "install algif_aead /bin/false" | sudo tee /etc/modprobe.d/disable-algif.conf
sudo rmmod algif_aead 2>/dev/null || true
「なし」の行のサブシステムは、カーネル内暗号 API を直接使用します — AF_ALG を経由することはありません。パフォーマンスは通常のユーザースペース暗号ライブラリにフォールバックしますが、これは他のほぼすべてのものがすでに使用しているものです。
無効化する前に、システム上で AF_ALG をアクティブに使用しているものがあるか確認するには:
lsof | grep AF_ALG
ss -xa | grep alg
パッチ適用状態に関係なく、信頼できないワークロードに対して socket(AF_ALG, ...) の作成を拒否します。seccomp の拒否リストに AF_ALG(ファミリ 38)を追加するか、権限のないプロセスの socket 呼び出しを制限する AppArmor/SELinux ポリシーを使用します。
detect.bt による監視即座にパッチ適用やロックダウンができないホストには、同梱の検出スクリプトをデプロイします。完全な 3 ステップのエクスプロイトプリミティブを実行するプロセスがあれば、アラートが発動します。
run-vm.sh は、管理された環境でのテスト用に Ubuntu 24.04 QEMU VM の作成を自動化します。exploit.py と detect.bt は脆弱なホスト上で直接実行できます — QEMU は必須ではありません。
| 依存関係 | 備考 |
|---|---|
qemu-system-x86_64 + KVM | 以下のインストールコマンドを参照 |
wget または curl | クラウドイメージのダウンロード |
cloud-image-utils | シードイメージの生成(非 Debian ホストでは Docker で代替可能) |
# Ubuntu/Debian
sudo apt install qemu-system-x86 cloud-image-utils wget
# Fedora/RHEL
sudo dnf install qemu-system-x86 wget
# Arch
sudo pacman -Sy qemu
# Alpine
sudo apk add qemu-system-x86 qemu-ui-gtk wget
sh run-vm.sh
1. VM の起動/作成
2. SSH で接続
3. VM にファイルをアップロード(exploit.py、detect.bt)
4. VM 内でエクスプロイトを実行
5. VM 内で detect.bt を実行
6. VM のステータスを確認
7. VM を停止
8. VM ファイルをクリーンアップ
0. 終了
| フィールド | 値 |
|---|---|
| ユーザー | ubuntu |
| パスワード | cve123 |
| SSH ポート | 2222 |
crypto/af_alg.c — カーネルソースmm/splice.c — カーネルソースこのプロジェクトは GNU General Public License v3.0 以降 の下でライセンスされています。 全文は LICENSE を参照してください。
免責事項: このリポジトリは、認可されたセキュリティ研究、ペネトレーションテスト、および教育目的のみで提供されています。著者は、本ソフトウェアの誤用または損害について一切の責任を負いません。
| フィールド | 値 |
|---|
| CVE ID | CVE-2026-31431 |
| 種別 | ローカル権限昇格(LPE) |
| CVSS v3.1 スコア | 7.8 High — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H(出典: kernel.org) |
| カーネルサブシステム | crypto/af_alg.c, mm/splice.c |
| 攻撃ベクトル | ローカル — 権限のないユーザーアカウントが必要 |
| 根本原因 | algif_aead が AEAD ソケット上で sendfile() を受け入れる際、splice() が転送を完了する前にマップされたページキャッシュページに対してコピーオンライト(CoW)セマンティクスを強制しない |
| ディストリビューション | カーネルバージョン | アーキテクチャ |
|---|
| Ubuntu 24.04 LTS | 6.17.0-1007-aws | x86_64 |
| Amazon Linux 2023 | 6.18.8-9.213.amzn2023 | x86_64 |
| RHEL 10.1 | 6.12.0-124.45.1.el10_1 | x86_64 |
| SUSE 16 | 6.12.0-160000.9-default | x86_64 |
| Raspberry Pi OS (Pi 5) | 6.12.75+rpt-rpi-2712 | aarch64 |
| アーキテクチャ | バリアント |
|---|
| x86_64 | — |
| aarch64 | — |
| riscv64 | — |
| ppc64le | — |
| arm | armv5l, armv6l, armv7l |
| x86 32-bit | i386, i486, i586, i686 |
| MIPS 64-bit | mips64, mips64el |
| LoongArch | loong64, loongarch64 |
| s390x | — |
| ビット | システムコール | 指標 |
|---|
0x1 | socket(AF_ALG, SOCK_SEQPACKET) | AF_ALG ソケット作成 |
0x2 | setsockopt(SOL_ALG, ...) | 暗号操作の設定 |
0x4 | sendmsg(MSG_MORE) + splice() | ページキャッシュ上書きの試行 |
| 影響? | サブシステム/ユースケース |
|---|
| なし | dm-crypt/LUKS、kTLS、IPsec/XFRM、カーネル内 TLS |
| なし | OpenSSL、GnuTLS、NSS のデフォルトビルド |
| なし | SSH、カーネルキーリング暗号 |
| 可能性あり | afalg エンジンを明示的に有効にした OpenSSL |
| 可能性あり | 組み込み暗号オフロードパス、または aead/skcipher/hash ソケットを直接バインドするアプリ |