DiagSpill
一个 Linux 内核 SCTP 漏洞,由 16 位对端传输计数器溢出 引起,使计数器从 65535 回绕到 0。在 SCTP 诊断转储期间,回绕后的值可能导致 skb 载荷预留不足,随后发生对端地址数据的越界写入。
本仓库仅用于经授权的安全研究、内核漏洞分析、CTF 环境、内核调试和防御性测试。
请勿在未经明确授权的系统上使用概念验证代码。
| 字段 | 详情 |
|---|---|
| CVE | CVE-2026-74469 |
| 代号 | DiagSpill |
| 组件 | Linux 内核 |
| 子系统 | SCTP / sock_diag |
| 受影响文件 | net/sctp/associola.c |
| 主要函数 | sctp_assoc_add_peer() |
| 缺陷类别 | 整数溢出 / 越界写入 |
| 影响 | 内核内存破坏 |
| 潜在影响 | 本地权限提升 |
| CVSS v3.1 | 7.0 — 高 |
| 攻击向量 | 本地 |
| 攻击复杂度 | 高 |
| 所需权限 | 低 |
| 用户交互 | 无 |
| 状态 | 已修补 |
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
关键的安全属性是防止计数器发生回绕,同时为现有对端保留正常的查找语义。
| 安全属性 | 易受攻击 | 已修补 |
|---|---|---|
| 强制实施 16 位传输限制 | ❌ | ✅ |
| 防止计数器回绕 | ❌ | ✅ |
| 现有对端仍可使用 | ✅ | ✅ |
| 诊断负载大小可靠 | ❌ | ✅ |
| 防止 OOB skb 写入 | ❌ | ✅ |
| 缓解内核内存损坏 | ❌ | ✅ |
内存损坏可能导致:
披露后发布的公开研究报告称,在特定条件下可实现本地 root 利用,而原始 Linux Kernel 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 配置: