CVE ID: CVE-2026-52924
严重性: 严重(CVSS 9.8)
组件: Linux 内核 - SCTP(流控制传输协议)
类型: 释放后使用(CWE-416、CWE-825)
发布时间: 2026-06-24
状态: 已修复
该漏洞发生在 SCTP 状态机处理陈旧 COOKIE-ECHO 数据包的过程中。问题在于当关联回滚时,出站流队列未得到正确清理。
sctp_stream_update() 释放旧流表,安装新流表stream->out_curr 仍指向已释放的 sctp_stream_out 条目out_curr->extsctp_sf_do_5_2_6_stale():
├─ 接收陈旧 Cookie 错误
├─ 回滚关联状态
└─ 调用 sctp_stream_update()
├─ 释放旧流表
├─ 安装新流表
└─ 缺陷:stream->out_curr 未被失效 ❌
稍后出队时:
sctp_sched_fcfs_dequeue():
└─ 访问 stream->out_curr->ext(已释放内存)💥
BUG: KASAN: slab-use-after-free in sctp_sched_fcfs_dequeue+0x13a/0x140
Read of size 8 at addr ff1100004d4d3208 by task mini_poc/9312
CPU: 1 UID: 1001 PID: 9312 Comm: mini_poc Not tainted 7.1.0-rc1-00305-gbd3a4795d574 #5 PREEMPT(full)
Call trace:
sctp_sched_fcfs_dequeue+0x13a/0x140
sctp_outq_flush+0x1603/0x33e0
sctp_do_sm+0x31c9/0x5d30
sctp_assoc_bh_rcv+0x392/0x6f0
sctp_inq_push+0x1db/0x270
sctp_rcv+0x138d/0x3c10
一种简单的修复方式可能只是清除 stream->out_curr:
// 不充分的修复 ❌
stream->out_curr = NULL;
问题: 出站队列仍包含:
这些陈旧引用在被访问时仍会导致释放后使用。
解决方案: 在陈旧 Cookie 处理期间完全清除关联的出站队列。
// 正确修复 ✓
sctp_outq_free(&asoc->outqueue);
这确保:
文件: net/sctp/sm_statefuns.c
函数: sctp_sf_do_5_2_6_stale()
新增内容: 在 sctp_stream_update() 之前调用 sctp_outq_free(&asoc->outqueue)
enum sctp_disposition sctp_sf_do_5_2_6_stale(...)
{
// ... 现有代码 ...
// 在重建流状态之前清除出站队列
sctp_outq_free(&asoc->outqueue);
// 现在可以安全更新流
sctp_stream_update(&asoc->stream, &asoc->c.h_init_tag);
// ... 函数其余部分 ...
}
# 在内核配置中启用 KASAN
CONFIG_KASAN=y
CONFIG_KASAN_GENERIC=y
# 运行时输出显示:
BUG: KASAN: slab-use-after-free
# 查找未经验证的不安全 stream->out_curr 访问
grep -r "out_curr->ext" net/sctp/
grep -r "out_curr->" net/sctp/sched*.c
禁用 SCTP: 移除 SCTP 模块或阻止 SCTP 端口(132、132 UDP)
echo "install sctp /bin/true" >> /etc/modprobe.d/sctp-disable.conf
防火墙规则: 在网络边界阻止 SCTP 流量
iptables -A INPUT -p sctp -j DROP
内核版本: 升级至已修补版本
应用在 sctp_sf_do_5_2_6_stale() 中调用 sctp_outq_free() 的内核补丁。
sctp_outq_free() 能正确使 out_curr 失效作者: Elliot
文档版本: 1.0
最后更新: 2026-09-07
分类: 公开信息