漏洞简介
CVE-2026-64564 代号 SCTPhantom,是发现于 Linux 内核 SCTP(流控制传输协议)子系统的重大安全漏洞。该漏洞属于 Use-After-Free(UAF)类型,存在于 SCTP 动态地址重配置(ASCONF)的 DEL-IP 处理逻辑中。
核心问题在于 DEL-IP 操作存在身份不匹配缺陷:校验阶段使用数据包的源地址 S 来判断是否允许删除某个 transport,执行阶段却通过 Address Parameter L 来选择要操作的 transport。当 S ≠ L 时,攻击者可以构造恶意 ASCONF chunk,使内核释放掉一个 transport,但 association 仍然保留对该 transport 的悬空指针引用,从而导致 UAF。
该漏洞的影响链路:发现运行受影响内核的主机或容器 → 利用 SCTP socket 发送恶意 ASCONF 数据包 → 触发 UAF → 内核地址泄露 → KASLR 绕过 → 伪造内核对象图 → commit_creds() → 全局 root 权限(可进一步用于容器逃逸到宿主机)
影响范围
验证方法:运行
uname -r检查内核版本,若版本低于上述范围且未打厂商补丁,则受影响。
漏洞原理
SCTP 是一种支持多宿主的消息传输协议,一个 association 可以包含多条路径。Linux 使用以下结构体表示关键对象:
struct sctp_association {
// ...
struct sctp_transport *primary_path; // 主路径
struct sctp_transport *active_path; // 活跃路径
struct list_head peer.transport_addr_list; // transport 链表
// ...
};
struct sctp_transport {
// ...
__be32 cwnd; // 拥塞窗口 (4字节)
__be32 srtt; // 平滑往返时间
struct dst_entry *dst;
struct inet_peer *af;
// ...
};ASCONF(Address Configuration)chunk 是 RFC 5061 定义的动态地址重配置功能,包含 ADD-IP(添加新地址)、DEL-IP(删除地址)、SET-PRIMARY(设置主路径)三种操作。
图解说明:sctp_association 持有 primary_path 和 active_path 两个指针指向 sctp_transport。当 DEL-IP 释放 transport 后,association 中的这两个指针变成悬空指针,后续访问触发 UAF。
构造以下有序操作序列即可触发漏洞:
[Address Parameter L] [DEL-IP L] [DEL-IP 0.0.0.0执行流程:DEL-IP L 时内核用源地址 S 校验通过,释放 transport(L);DEL-IP 0.0.0.0 通配符删除操作将 transport(L) 的指针作为待保留路径;最终 association 的 primary_path 和 active_path 指向已释放的 transport。
漏洞根因代码位置(net/sctp/sm_make_chunk.c):
修复前缺少关键检查:
peer = sctp_assoc_lookup_paddr(asoc, &addr);
if (!peer)
return SCTP_ERROR_DNS_FAILED;
// 缺少检查!未验证 peer == asconf->transport
sctp_assoc_rm_peer(asoc, peer);修复后增加身份校验:
peer = sctp_assoc_lookup_paddr(asoc, &addr);
if (!peer)
return SCTP_ERROR_DNS_FAILED;
if (peer == asconf->transport)
return SCTP_ERROR_REQ_REFUSED; // ✅ 防止删除正在使用的 transport
sctp_assoc_rm_peer(asoc, peer);漏洞复现
准备环境
步骤 1:环境检查
检查内核版本与 SCTP 模块状态:
# 检查内核版本
uname -r
# 检查 SCTP 模块是否加载
lsmod | grep sctp
# 若未加载,手动加载
sudo modprobe sctp
# 检查 SCTP 相关 sysctl
cat /proc/sys/net/sctp/addip_enable
cat /proc/sys/net/sctp/auth_enable步骤 2:编译 PoC
# 安装依赖
sudo apt update
sudo apt install build-essential libsctp-dev
# 编译 PoC
gcc -O2 -static -o CVE-2026-64564 CVE-2026-64564_SCTPhantom.c -lsctp步骤 3:执行利用
# 以普通用户身份运行
./CVE-2026-64564步骤 4:预期输出
成功时终端输出:
[*] SCTPhantom LPE PoC - CVE-2026-64564
[*] Compilado para Debian 13 kernel 6.12.95
[+] ASCONF malicioso enviado (UAF triggerado)
[+] UAF1 page: 0xffff9a8fXXXXX000 (1 attempts)
[+] KASLR slide: 0xXXXXX (IDT 0xXXXX)
[+] credential security: 0xffff9a8fXXXXX
[*] graph: transport=0xffff9a8fXXXXX asoc=1 af=1 base_sk=1
[*] trigger: sprayed=xxx uid=1000 before=0
[*] result: uid=1000 before=0 after=1
[+] global root confirmed
[+] shadow: root:$y$j9T$...
[+] marker written: /root/SCTP_LPE_SUCCESS
[+] SHELL ROOT OBTIDO!利用链详解
SCTPhantom 的完整利用链分为以下阶段,整体流程如下:
阶段一:UAF 触发与内存回收。恶意 ASCONF 数据包投递后,DEL-IP 释放 transport,packet socket pg_vec 回收到 kmalloc-1024 缓存,direct-map 页面被复用并包含原始 transport 数据。
阶段二:内核地址泄露。通过 SCTP_STATUS getsockopt 读取 cwnd/srtt 字段,将其解释为页指针,还原 64 位内核地址,获取 direct-map 映射的用户空间访问权。
阶段三:KASLR 绕过。利用任意读原语读取 IDT 映射,通过固定虚拟地址 0xfffffe0000000000 重建 asm_exc_divide_error 运行时地址,计算 KASLR slide。
阶段四:内核对象图伪造。SCTP authentication-key 分配到 kmalloc-1024,构造伪造对象链:fake transport(fake af + fake asoc)→ fake association(fake sk + fake cred)→ fake socket(伪造 uid=0 credential)。
阶段五:权限提升。SO_LINGER abortive close 触发 commit_creds(fake_cred),获得全局 root 权限,验证方式为读取 /etc/shadow 并写入 /root/SCTP_LPE_SUCCESS。
容器逃逸变体:除本地提权外,SCTPhantom 还可用于容器逃逸。在容器内执行 exploit 利用共享宿主内核的 UAF,commit_creds() 调用 call_usermodehelper_exec(),在宿主机初始 namespace 中执行命令,获得宿主机 root shell。关键优势在于无需 CAP_NET_ADMIN,无需修改 sysctl,仅需普通容器权限。
FOFA 语法
os="linux" && header="sctp"或精确匹配内核版本:
banner="6.12" && os="linux" && header="sctp"SCTP 服务端口探测:
port="2905" || port="3641" || port="3868"批量扫描思路:
# 检测目标是否运行受影响内核
def check_vulnerable(target):
kernel = get_kernel_version(target)
if kernel < "6.12.101" and has_sctp_module(kernel):
return True, f"VULNERABLE: {kernel}"
return False, f"PATCHED or no SCTP: {kernel}"