TUNderflow
一个存在于 TUN/TAP 网络子系统中的 Linux 内核内存破坏漏洞,由接收 headroom 边界限制不足以及数据包分配路径中的整数下溢引起。
本仓库仅用于经授权的安全研究、漏洞分析、CTF 环境、内核调试和防御性测试。
请勿在未获得明确授权的情况下对系统使用概念验证代码。
| 字段 | 详情 |
|---|---|
| CVE | CVE-2026-81000 |
| 代号 | TUNderflow |
| 组件 | Linux 内核 |
| 子系统 | TUN/TAP |
| 受影响代码 | drivers/net/tun.c |
| 主要函数 | tun_get_user() |
| 缺陷类别 | 整数下溢 / 越界内存访问 |
| 影响 | 内核内存破坏 |
| 潜在影响 | 本地权限提升 |
| CVSS v3.1 | 7.8 — 高危 |
| 攻击向量 | 本地 |
| 所需权限 | 低 |
| 用户交互 | 无 |
| 状态 | 已修复 |
CVE 公告将该问题描述为一种整数下溢,可能导致 skb->data 被定位到已分配的 skb head 之外。
该漏洞存在于 Linux 内核的 TUN/TAP 接收路径中。
受影响的代码将 TUN 设备配置的接收 headroom 同时用作数据包 headroom,并在计算应保留多少数据包数据为线性数据时使用该值。
因此,过大的 headroom 值可能在以下位置产生无效计算:
SKB_MAX_HEAD(align)
当提供的值超过可用的一页 skb 头部空间时,计算可能会发生下溢。
概念上:
Oversized receive headroom
│
▼
SKB_MAX_HEAD()
│
▼
Integer underflow
│
▼
Negative value
│
▼
size_t wrap
│
▼
Invalid skb data placement
│
▼
Kernel memory corruption
存在漏洞的实现位于:
drivers/net/tun.c
其中 tun_get_user() 是漏洞路径的核心。
底层问题是 TUN 接收 headroom 的边界限制不足。
内核可以通过网络设备路径接收一个过大的 headroom 请求,这些路径会将该值传播到 TUN/TAP。
当复杂的虚拟网络配置导致一个较大的 headroom 值到达 TUN 设备时,该漏洞变得尤为值得关注。
公开披露描述了一个涉及以下内容的场景:
Netkit
│
▼
VXLAN
│
▼
Open vSwitch
│
▼
TUN
一个示例配置可以向原始 TUN 端口传播约 4160 字节的余量,导致存在漏洞的算术运算发生下溢。
该破坏发生在内核网络内存管理逻辑中。
潜在后果包括:
公开披露将该漏洞报告为一组 Linux 本地 root 漏洞之一,并指出已发布的 PoC 可在受支持的目标上实现非特权本地用户到 root 的执行。
可利用性取决于环境,并且需要相关的 TUN/网络设备配置及配套功能。
ATTACKER
│
▼
Oversized network headroom
│
▼
Virtual network device
│
▼
Open vSwitch
│
▼
TUN/TAP
│
▼
tun_get_user()
│
▼
SKB_MAX_HEAD(align)
│
▼
Integer underflow
│
▼
size_t wraparound
│
▼
Invalid skb->data offset
│
▼
Kernel memory corruption
重要组件包括:
drivers/net/tun.c
│
├── tun_set_headroom()
│
├── tun_get_user()
│
└── tun_alloc_skb()
易受攻击的关系可以简化为:
tun->align
│
├── skb headroom
│
└── linear-data calculation
在两次计算中使用同一个超大值,会在所请求的 headroom 与实际 skb head 预算之间形成不安全的关系。
关键安全属性在概念上可以表示为:
usable_head < requested_headroom
这可能导致:
SKB_MAX_HEAD(align) < 0
后跟一个无符号转换:
negative value
↓
size_t
↓
very large unsigned value
这最终可能影响 skb 分配/数据放置。
官方描述特别指出,当结果值赋给 size_t 类型的 linear 变量时会发生回绕。
上游修复为:
447c9303942c439a117d9b76ce6d6e2116c38ee7
提交:
net: tun: bound receive headroom
该修复将 TUN 存储的 headroom 限制在可用的一页 skb head 预算和最大有效的 16 位 skb 头部偏移范围内。它还确保为原始 TUN 和 TAP 处理提供足够的线性数据。
User / network device
│
▼
Large headroom
│
▼
tun->align
│
▼
Unsafe arithmetic
│
▼
Potential OOB access
User / network device
│
▼
Large headroom
│
▼
Bounded headroom
│
▼
Safe skb calculation
│
▼
Normal packet processing
| 安全属性 | 易受攻击版本 | 已修补版本 |
|---|---|---|
| Headroom 有界 | ❌ | ✅ |
| 大 headroom 被安全处理 | ❌ | ✅ |
| 下溢条件被阻止 | ❌ | ✅ |
| skb 数据放置受保护 | ❌ | ✅ |
| 畸形网络配置被安全拒绝 | ❌ | ✅ |
推荐的实验室拓扑:
┌─────────────────────────────────────────┐
│ Linux VM / Host │
│ │
│ ┌─────────┐ ┌──────────────┐ │
│ │ Netkit │────▶│ VXLAN │ │
│ └─────────┘ └──────┬───────┘ │
│ │ │
│ ┌──────▼───────┐ │
│ │ Open vSwitch │ │
│ └──────┬───────┘ │
│ │ │
│ ┌──────▼───────┐ │
│ │ TUN/TAP │ │
│ └──────────────┘ │
│ │
└─────────────────────────────────────────┘
实用工具:
uname -a
ip link
ip tuntap
bridge link
ovs-vsctl show
dmesg -w
用于内核调试:
GDB
GDB + GEF
GDB + pwndbg
crash
objdump
readelf
pahole
检查正在运行的内核:
uname -r
检查内核配置:
grep CONFIG_TUN /boot/config-$(uname -r)
预期配置:
CONFIG_TUN=y
或:
CONFIG_TUN=m
检查模块是否已加载:
lsmod | grep tun
公开披露提供了一个专门的 TUNderflow PoC 仓库,用于 受控验证。
安全的研究流程:
1. Build vulnerable kernel
2. Boot isolated VM
3. Configure TUN/TAP
4. Reproduce oversized headroom
5. Monitor kernel messages
6. Capture crash/corruption behavior
7. Apply upstream patch
8. Repeat test
9. Compare results
监控内核:
sudo dmesg -w
该实验的目标是演示存在漏洞的行为与已修补行为之间的差异,而不是攻击生产系统。
CVE-2026-81000-TUNderflow/
│
├── README.md
│
├── exploit/
│ ├── poc.c
│ └── Makefile
│
├── analysis/
│ ├── root-cause.md
│ ├── kernel-path.md
│ ├── integer-underflow.md
│ └── patch-analysis.md
│
├── kernel/
│ ├── vulnerable/
│ └── patched/
│
├── lab/
│ ├── setup.sh
│ ├── cleanup.sh
│ └── topology.md
│
├── screenshots/
│
├── docs/
│ └── research-notes.md
│
└── LICENSE
推荐的缓解措施是安装包含上游安全修复或相应发行版向后移植的内核。
对于 Debian/Kali:
sudo apt update
sudo apt full-upgrade
然后重启:
sudo reboot
验证:
uname -r