DiagSpill
一个 Linux 内核 SCTP 漏洞,由 16 位对等传输计数器溢出 引起,允许计数器从 65535 回绕到 0。在 SCTP 诊断转储期间,回绕后的值可能导致 skb 载荷预留不足,随后发生对等地址数据的越界写入。
本仓库仅用于授权的安全研究、内核漏洞分析、CTF 环境、内核调试和防御性测试。
未经明确授权,请勿将概念验证代码用于任何系统。
Linux 内核 CVE 公告将该问题描述为 SCTP 中的 16 位 transport_count 溢出,随后导致 INET_DIAG_PEERS 分配过小,并在诊断转储期间发生越界写入。
存在漏洞的代码使用 16 位计数器维护唯一对等传输的数量:
transport_count
每添加一个新的唯一对等方,计数器就会递增。
关键边界是:
65535
再添加一个唯一传输会导致:
65535 + 1
↓
0
由此产生的回绕造成以下两者之间的不一致:
transport_count
与:
transport_addr_list
诊断子系统随后在计算响应缓冲区大小时信任回绕后的计数器,同时仍然遍历完整的对等地址列表。
该漏洞可以表示为:
SCTP Association
│
▼
Add unique peers
│
▼
transport_count
uint16_t
│
▼
65,535 peers
│
▼
+ 1 unique peer
│
▼
Integer wrap
│
▼
transport_count = 0
│
▼
SCTP sock_diag
│
▼
Reserve incorrect payload
│
▼
Iterate complete peer list
│
▼
Out-of-bounds skb write
上游公告明确指出,第 65,536 个传输会使计数器回绕为零。
诊断代码实际上依赖于同一状态的两种不同视图。
transport_count
│
▼
payload size
transport_addr_list
│
▼
copy every peer address
整数回绕后:
transport_count = 0
transport_addr_list =
[peer 1]
[peer 2]
[peer 3]
...
[peer 65536]
因此分配器基于以下内容预留空间:
0 peers
而复制操作仍可处理:
65536 peer addresses
这种不匹配导致了内存安全违规。
Linux 内核公告将由此产生的诊断转储描述为预留空载荷,然后写入约 8 MiB 的对等地址,超出 skb 尾部。
概念上:
Expected skb:
┌───────────────────────────────┐
│ INET_DIAG header │
├───────────────────────────────┤
│ Peer addresses │
└───────────────────────────────┘
▲
│
valid end
Actual vulnerable state:
┌───────────────────────────────┐
│ INET_DIAG header │
└───────────────────────────────┘
▲
│
skb tail
↓
Peer address writes
↓
Peer address writes
↓
Peer address writes
↓
OUT-OF-BOUNDS WRITE
Red Hat 将该缺陷归类为 CWE-787:越界写入。
相关路径可以概括为:
SCTP association
│
▼
sctp_assoc_add_peer()
│
▼
transport_count++
│
▼
16-bit overflow
│
▼
SCTP sock_diag
│
▼
INET_DIAG_PEERS
│
▼
skb payload reservation
│
▼
transport_addr_list iteration
│
▼
Out-of-bounds write
受影响的源文件是:
net/sctp/associola.c
Linux 内核 CVE 公告明确指出了该文件。
上游修复为:
bd0e9289e2642f6a5c54faad304ce0f41e926d22
提交:
sctp: prevent peer transport count overflow
该修复在以下情况下拒绝新的唯一对等方:
transport_count >= U16_MAX
重要的是,该检查发生在 现有对等方查找之后。
这样即使在关联已达到限制时,仍能检索已存在的传输。
New peer
│
▼
transport_count++
│
▼
Possible 16-bit wrap
│
▼
Diagnostic size mismatch
│
▼
OOB write
New peer
│
▼
Existing peer?
│
┌─┴──────────┐
│ │
YES NO
│ │
▼ ▼
Reuse Check U16_MAX
transport │
▼
Reject at limit
重要的安全特性是防止计数器回绕,同时保留对现有对等方的正常查找语义。
内存破坏可能导致:
披露后发布的公开研究报告称,在特定条件下可实现本地 root 利用,而原始 Linux 内核 CNA 评分使用 AV:L/AC:H/PR:L/UI:N。
该漏洞还被描述为在非常特定的 SCTP/地址配置情况下可能可远程触达,但这不应被视为等同于一般可远程利用的漏洞。
推荐的隔离拓扑:
┌───────────────────────────────────────────┐
│ Linux VM │
│ │
│ ┌───────────────────┐ │
│ │ SCTP Association │ │
│ └─────────┬─────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────┐ │
│ │ Multiple SCTP │ │
│ │ Peer Transports │ │
│ └─────────┬─────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────┐ │
│ │ SCTP sock_diag │ │
│ └─────────┬─────────┘ │
│ │ │
│ ▼ │
│ INET_DIAG_PEERS │
│ │
└───────────────────────────────────────────┘
有用的工具:
ip sctp
ss
ss -a
ss -A sctp
dmesg -w
gdb
pwndbg
crash
检查 SCTP 支持:
lsmod | grep sctp
检查内核配置:
grep CONFIG_IP_SCTP /boot/config-$(uname -r)
检查正在运行的内核:
uname -r
检查 SCTP 配置:
grep -E 'CONFIG_IP_SCTP|CONFIG_SCTP' \
/boot/config-$(uname -r)
检查已加载的 SCTP 模块:
lsmod | grep -i sctp
检查 SCTP 套接字:
ss -A sctp
用于受控内核研究:
01. Build vulnerable kernel
↓
02. Boot isolated VM
↓
03. Enable SCTP
↓
04. Create controlled SCTP association
↓
05. Populate unique peer transports
↓
06. Reach transport-count boundary
↓
07. Trigger SCTP diagnostic dump
↓
08. Monitor skb diagnostics
↓
09. Capture kernel behavior
↓
10. Apply upstream fix
↓
11. Repeat test
↓
12. Compare vulnerable vs patched
监控内核输出:
sudo dmesg -w
用于调试:
gdb vmlinux
或:
pwndbg vmlinux
CVE-2026-74469-DiagSpill/
│
├── README.md
│
├── exploit/
│ ├── poc.c
│ └── Makefile
│
├── analysis/
│ ├── root-cause.md
│ ├── sctp-transport-count.md
│ ├── sock-diag.md
│ ├── skb-overflow.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
如果不需要 SCTP,管理员还可以根据其环境和运营需求考虑禁用受影响的 SCTP 功能。公开研究特别指出,当这些组件未使用时,禁用 SCTP / sctp_diag 可作为即时缓解措施。
上游稳定版公告列出了以下已修复版本:
这些版本来自 Linux 内核 CVE 公告;发行版可能会将修复向后移植到版本号不同的软件包中。
16 位计数器有硬性最大值:
U16_MAX = 65535
安全敏感代码必须显式处理该边界。
用于分配缓冲区的大小必须与实际复制到其中的对象数量相对应。
当内部状态变得不一致时,内核诊断 API 可能成为内存破坏攻击面。
原始原语是整数溢出,但由此产生的安全影响是越界内核写入。
SCTP 关联可能包含大量对等传输,这使得计数器限制和列表管理逻辑对安全至关重要。
net/sctp/associola.csctp_assoc_add_peer()sctp: prevent peer transport count overflowbd0e9289e2642f6a5c54faad304ce0f41e926d22Linux Kernel · SCTP · sock_diag · OOB Write · Kernel Security
Research • Analyze • Reproduce • Harden
| 字段 | 详情 |
|---|
| CVE | CVE-2026-74469 |
| 代号 | DiagSpill |
| 组件 | Linux 内核 |
| 子系统 | SCTP / sock_diag |
| 受影响文件 | net/sctp/associola.c |
| 主要函数 | sctp_assoc_add_peer() |
| 缺陷类别 | 整数溢出 / 越界写入 |
| 影响 | 内核内存破坏 |
| 潜在影响 | 本地权限提升 |
| CVSS v3.1 | 7.0 — 高 |
| 攻击向量 | 本地 |
| 攻击复杂度 | 高 |
| 所需权限 | 低 |
| 用户交互 | 无 |
| 状态 | 已修补 |
| 安全特性 | 存在漏洞 | 已修补 |
|---|
| 强制执行 16 位传输限制 | ❌ | ✅ |
| 防止计数器回绕 | ❌ | ✅ |
| 现有对等方仍可使用 | ✅ | ✅ |
| 诊断载荷大小可靠 | ❌ | ✅ |
| 防止 OOB skb 写入 | ❌ | ✅ |
| 缓解内核内存破坏 | ❌ | ✅ |
| 分支 | 已修复版本 |
|---|
| 5.10 | 5.10.265 |
| 5.15 | 5.15.216 |
| 6.1 | 6.1.183 |
| 6.6 | 6.6.151 |
| 6.12 | 6.12.103 |
| 6.18 | 6.18.44 |
| 7.1 | 7.1.8 |
| 7.2 | 7.2-rc6 |