摘要
CVE‑2026‑64564,代号SCTPhantom,是埋藏在Linux内核长达18年的Use‑After‑Free漏洞,代码最早随2.6.25版本合入主线内核,2026‑08‑06正式对外披露。漏洞攻击入口为SCTP协议ASCONF动态地址重配置逻辑,攻击者仅需要普通本地账号权限,无需网络远程访问,就可以完成内核内存篡改,拿到宿主机root权限;在Docker、K8s容器内部,普通容器用户可直接突破命名空间隔离实现容器逃逸,控制底层宿主机。
漏洞不是远程可利用漏洞。外部互联网攻击者不能直接打进来,风险点集中在已经拿到低权限shell、被入侵业务容器、共享服务器多租户环境。研究团队内部已经完成完整利用链,公开EXP暂未发布,随着漏洞细节公开,EXP流出属于高概率事件,企业需要提前做检测与缓解处置。
本文从协议背景、漏洞根因、内存破坏触发链路、完整利用链、现场检测脚本、临时缓解配置、容器环境加固、内核补丁原理、同类SCTP历史漏洞复盘、真实业务风险边界、攻防对抗思考完整展开,附带可直接复制运行的shell检测脚本、modprobe黑名单配置、seccomp安全配置、Falco监控规则,同时给出生产环境业务取舍判断逻辑。
1 SCTP协议与ASCONF机制业务背景
SCTP流控制传输协议,RFC4960定义,最初为电信信令系统设计,对比TCP/UDP,原生支持多宿主多路径、链路故障快速切换、消息边界保留,4G/5G核心网、电信IMS信令、部分高可用集群软件会启用这个协议栈。
RFC5061定义ASCONF扩展,允许SCTP关联建立之后,不中断连接,动态新增、删除、修改本端与对端IP地址,就是漏洞触发的核心模块DEL‑IP、ADD‑IP指令。内核参数net.sctp.addip_enable控制这个功能开关,默认绝大多数发行版该值等于1,开启动态地址修改能力。
很多服务器运维人员几乎不会主动使用SCTP,但是主流Linux发行版内核配置默认把SCTP编译为可加载模块,系统只要收到SCTP报文或者用户态调用socket(AF_SCTP),内核自动加载sctp模块。大量云主机、容器镜像内置该模块,业务全程没有使用SCTP,攻击面却一直暴露。
结构体层面,每一条SCTP路径对应struct sctp_transport,保存对端IP、重传计时器、RTT统计;struct sctp_association代表一条完整SCTP连接,内部持有primary_path、active_path指针指向transport对象。ASCONF处理函数sctp_process_asconf()会把当前正在处理的transport缓存到asconf‑>transport局部指针变量,这个缓存指针就是漏洞的源头。
2 CVE‑2026‑64564漏洞根因拆解
2.1 校验逻辑割裂问题
内核处理DEL‑IP删除地址请求时,做两套独立校验:
- 安全校验D8检查:拿数据包外层源IP做合法性校验,判断这个删除操作是否合法;
- 实际执行删除逻辑:读取ASCONF报文内部携带的地址参数,找到对应的
sctp_transport传输对象,执行释放,使用的是asconf‑>transport缓存指针。
两套逻辑使用不同来源地址,内核没有做指针一致性校验。D8检查放行操作之后,内核释放transport内存,但是asconf‑>transport还保留这份已经释放内存的悬空指针,后续代码继续读取这个指针,触发UAF释放后重用漏洞。
攻击者在同一个ASCONF块内编排一组有序参数序列,完成内存释放+悬空指针残留:
- 构造ASCONF块,第一条参数DEL‑IP指定地址L;D8校验通过,内核调用释放函数,把
asconf‑>transport指向的transport对象释放回slab内存池; - 紧接着同一块内下发第二条参数,通配符DEL‑IP
0.0.0.0; - 代码走到
sctp_assoc_set_primary()、sctp_assoc_del_nonprimary_peers(),直接读取已经被释放的asconf‑>transport悬空指针,读写已经归还slab的内存,完成内核内存破坏。
2.2 为什么潜伏18年才被发现
第一,漏洞触发条件必须整套ASCONF逻辑完整执行,需要用户态打开SCTP socket,构造复杂的分块ASCONF报文,普通fuzz工具很难覆盖这种多参数有序依赖的报文路径;传统单数据包模糊测试很难命中同一chunk内多条参数序列这种场景。本次漏洞是Corvus AI自动化漏洞挖掘系统,定向对SCTP协议状态机做符号执行+灰盒fuzz才挖掘出来。
第二,SCTP属于小众协议,绝大多数业务不使用,安全研究员日常内核审计优先看TCP、UDP相关代码,SCTP模块代码审查频次偏低。历史上SCTP爆出过若干高危本地提权漏洞,但是没有引起运维圈足够重视,很多系统直接保留默认开启配置。
第三,漏洞触发之后不一定立刻崩溃,取决于slab内存复用情况。部分触发场景只会产生静默内存损坏,不会输出明显KASAN报错日志,现场很难定位,很多时候只会随机出现偶现内核panic,运维容易归为硬件故障。
注意:KASAN开启的调试内核可以稳定复现UAF告警;生产内核没有KASAN,触发漏洞之后行为不可预测,随机panic或者稳定利用二种情况都会出现。
3 完整利用链技术拆解(基于公开漏洞报告)
研究团队实现的完整EXP不需要传统ROP,不需要内核shellcode,整套链路完全依靠SCTP子系统原生对象操作完成提权,降低利用稳定性门槛。
- 用户态普通非root进程,创建SCTP socket,构造本地回环ASCONF恶意报文,触发UAF,释放
sctp_transport对象,保留悬空指针; - 触发slab内存泄露,读取slab内残留对象内容,泄露内核虚拟地址,绕过KASLR地址随机化;
- 用户态反复分配释放相近大小的用户可控对象,抢占已经释放的slab内存位置,伪造部分
sctp_transport结构体内容; - 继续调用SCTP socket系统调用,内核通过悬空指针访问我们伪造的对象,篡改
sctp_association内部函数指针或者成员; - 控制内核执行流调用
commit_creds(prepare_kernel_cred(0)),把当前进程cred凭证替换为root凭证; - 用户态进程直接获得root权限。
容器场景下,内核漏洞执行路径运行在宿主机内核上下文。容器内部仅仅做用户态、网络、pid命名空间隔离,内核内存完全共享。容器内普通用户触发这套利用链,拿到的是宿主机全局root权限,直接完成容器逃逸,不受容器capabilities限制,哪怕容器CAP_SYS_ADMIN被剥夺依旧可以逃逸成功。
重要边界:漏洞前提条件,容器环境内核开启SCTP模块,net.sctp.addip_enable=1。如果已经黑名单禁用sctp模块,漏洞无法触发。
4 本地检测脚本:判断主机是否受CVE‑2026‑64564影响
下面脚本可普通用户或者root直接运行,输出系统风险状态;检测维度包含内核版本、sctp模块是否可加载、sysctl addip开关、是否存在modprobe黑名单。脚本不执行漏洞触发,只做配置层面审计,不会导致系统panic。
#!/bin/bash# check_CVE_2026_64564.sh CVE‑2026‑64564风险检测脚本set-eecho"==== CVE‑2026‑64564 SCTPhantom 漏洞检测 ===="KERN_VER=$(uname-r)echo"当前内核版本:$KERN_VER"# 判断sctp模块是否被黑名单BLACKLIST_STATUS="未黑名单"ifgrep-rq"blacklist sctp"/etc/modprobe.d/2>/dev/null;thenBLACKLIST_STATUS="已黑名单禁用sctp模块"fiifgrep-rq"install sctp /bin/false"/etc/modprobe.d/2>/dev/null;thenBLACKLIST_STATUS="已强制拦截sctp模块加载"fiecho"sctp modprobe状态:$BLACKLIST_STATUS"# 查看当前模块是否已经加载iflsmod|grep-q"^sctp";thenecho"⚠️ sctp模块当前已经载入内核"elseecho"✅ sctp模块当前未加载"fi# 获取net.sctp.addip_enable配置ADDIP_SYSCTL=$(sysctl-nnet.sctp.addip_enable2>/dev/null||echo"模块未加载,无法读取")echo"net.sctp.addip_enable =$ADDIP_SYSCTL"echo""echo"==== 风险判定 ===="RISK=0if[["$BLACKLIST_STATUS"=="未黑名单"]];thenif[["$ADDIP_SYSCTL"=="1"]];thenRISK=1fifiif[$RISK-eq1];thenecho"❌ 当前系统存在CVE‑2026‑64564风险"echo"缓解选项:1.升级内核到修复版本;2.黑名单禁用sctp;3.sysctl net.sctp.addip_enable=0"elseecho"✅ 当前配置层面已经缓解该漏洞风险,请确认内核是否打上补丁"fiecho""echo"修复内核版本参考:7.1.6 / 6.18.42 /6.12.101 /6.6.148及以上"echo"上游修复commit:9b2854f"保存为check_CVE_2026_64564.sh,执行:
chmod+x check_CVE_2026_64564.sh ./check_CVE_2026_64564.sh脚本只能做配置风险筛查。只有升级内核到修复commit版本,才是完整彻底修复。临时sysctl、黑名单属于缓解手段,不是根源修复。
5 生产环境缓解方案完整配置
分三种场景:业务完全不用SCTP;业务必须使用SCTP协议;容器K8s集群环境。
5.1 场景一:业务完全不需要SCTP(优先推荐)
modprobe黑名单阻止sctp模块加载,内核不会加载漏洞代码路径。
创建/etc/modprobe.d/blacklist‑sctp.conf
blacklist sctp install sctp /bin/false blacklist sctp_diag install sctp_diag /bin/falseDebian/Ubuntu更新initramfs镜像:
update-initramfs-uRHEL/Rocky/OpenCloudOS系重建dracut镜像:
dracut-f执行完成之后重启主机。重启后modprobe sctp返回失败,模块无法载入,漏洞代码不会执行。
已经运行不能立刻重启的主机:可以临时卸载已经加载模块
rmmod sctp,但是用户态程序触发socket调用依旧会尝试加载,必须配合上面modprobe配置,重启之后永久生效。
5.2 场景二:业务依赖SCTP协议(电信5G核心网、信令设备)
业务不能直接拉黑sctp模块。此时不能依靠sysctl关闭addip作为最终方案,必须升级内核到修复版本。
临时应急缓解,关闭动态地址重配置ASCONF功能:
sysctl-wnet.sctp.addip_enable=0echo"net.sctp.addip_enable = 0">>/etc/sysctl.confsysctl-p业务代价:SCTP无法动态增删对端IP地址,链路多宿主切换功能失效。需要评估业务是否可以接受该损失。如果业务强依赖ADD‑IP/DEL‑IP,该缓解手段不可用,只能内核升级。
5.3 场景三:Docker / Kubernetes容器集群加固
内核漏洞的攻击面在宿主机内核。哪怕容器镜像里面没有sctp,只要宿主机内核加载sctp模块,容器内进程调用socket(AF_SCTP),就会走到宿主机漏洞代码。加固需要从宿主机层面、容器运行时两层处理。
1)宿主机层面优先执行上面modprobe黑名单或者内核升级。
2)seccomp配置,在容器系统调用层面拦截AF_SCTP socket创建。seccomp‑sctp‑block.json配置片段:
{"defaultAction":"SCMP_ACT_ALLOW","architectures":["SCMP_ARCH_X86_64"],"syscalls":[{"names":["socket"],"action":"SCMP_ACT_ERRNO","args":[{"index":0,"op":"SCMP_CMP_EQ","value":13}]}]}AF_SCTP宏等于13;seccomp过滤socket第一个参数等于13的调用,阻止容器内部创建SCTP socket,攻击入口被切断。
K8s可以通过SecurityContext设置seccompProfile;Docker启动参数传入--security‑opt seccomp=seccomp‑sctp‑block.json。
3)Falco运行时检测规则,监控容器内尝试创建SCTP socket行为,发现直接告警。
-rule:Container try create SCTP socketdesc:CVE‑2026‑64564攻击前置行为,容器创建AF_SCTP socketcondition:>container and syscall.type=socket and args[0]=13output:"容器尝试创建SCTP socket (user=%user.name container=%container.name cmd=%proc.cmdline)"priority:WARNINGtags:[container,vulnerability,cve‑2026‑64564]4)K8s安全基线检查:禁止容器开启privileged,不随便授予CAP_SYS_MODULE能力;PodSecurityPolicy/PSA限制危险权限。注意:该漏洞不需要CAP_SYS_MODULE,普通权限即可触发,所以仅仅削减capabilities不能防御本漏洞,很多运维会踩这个坑。
6 内核补丁原理解析(commit 9b2854f)
上游补丁代码逻辑很直接:在处理DEL‑IP指令的时候,增加判断,如果待删除transport对象正好等于当前asconf‑>transport缓存对象,直接拒绝这个DEL‑IP操作,禁止释放正在本次ASCONF处理流程中正在使用的transport对象。
过去D8校验只校验数据包源地址,补丁新增保护逻辑,不让当前ASCONF上下文正在使用的transport被DEL‑IP释放掉。从根源杜绝“释放对象,但是上下文还持有悬空指针”这个状态。
补丁没有删除ASCONF功能,没有关闭SCTP协议,保留全部原有业务能力,仅仅修复指针生命周期不一致的逻辑bug。
发行版内核需要确认已经backport该commit,部分老发行版比如CentOS7内核版本很低,上游主线没有直接对应版本,要看厂商是否单独移植补丁。CentOS7内核2.6.32是基于老分支,但是大量RHEL向后移植SCTP子系统,实际同样受影响,很多运维误以为老内核不受影响,属于常见误区。
7 SCTP子系统历史同类漏洞复盘
SCTP模块过去多年持续爆出本地UAF、缓冲区溢出类漏洞,绝大多数攻击入口都是普通本地用户,不需要root权限:
- CVE‑2026‑46227 SCTP发送逻辑竞争条件UAF,本地提权,依靠sctp_peeloff迁移关联制造悬空指针;
- CVE‑2026‑53246 SCTP COOKIE_ECHO缓冲区越界读取;
- CVE‑2021‑3772 SCTP INIT标签处理缺陷,可以重置现有SCTP关联;
可以看到SCTP代码整体攻击面并不小。现实生产环境,绝大多数Linux服务器业务根本不跑SCTP信令业务,却默认开启编译支持。从安全架构第一性原理看:系统不使用的协议栈,应该尽可能关闭或者模块黑名单,缩小内核攻击面。很多运维忽略这点,内核开启大量永远不会被调用的网络协议,埋下长期安全隐患。
8 真实企业风险边界分析
很多企业看完漏洞通告容易产生误判,这里把风险边界梳理清楚。
❌错误认知1:这是远程漏洞,外网可以直接打。
纠正:本地漏洞,攻击者必须已经拥有服务器普通shell或者容器内执行代码能力,外网无法直接触发。风险来自入侵之后的权限横向提升。
❌错误认知2:容器只要不给CAP_SYS_ADMIN就安全。
纠正:该漏洞完全不需要任何capabilities,普通无特权容器用户就可以触发,漏洞破坏发生在内核内存层面,和容器cap隔离无关。
❌错误认知3:CentOS7老内核版本号低,不受这个漏洞影响。
纠正:CentOS/RHEL会把新SCTP子系统向后移植到老内核,只要代码引入了有缺陷的ASCONF处理逻辑,就受漏洞影响,不能只看大内核版本号判断风险,要看发行版是否已经打上对应补丁。
✅高风险业务场景清单:
- 对外暴露应用,存在代码执行漏洞,攻击者拿到普通web shell的Linux主机;
- K8s平台,存在被入侵业务Pod,Pod允许运行普通用户态代码;
- 公有云多租户容器服务,用户可以上传代码运行容器;
- 电信4G/5G核心网服务器,原生启用SCTP;
- 内部共享服务器,多个业务人员拥有普通本地账号。
✅低风险场景:
- 已经modprobe黑名单禁用sctp模块;
- 内核已经合入commit:9b2854f修复补丁;
- 容器层面seccomp拦截AF_SCTP socket创建,宿主机也禁用sctp。
9 攻防对抗视角思考(对抗式审查)
站在攻击者视角:漏洞价值很高。拿到低权限shell之后,不需要找其他内核漏洞,依靠SCTPhantom直接一步root;容器渗透场景,拿到Pod之后直接逃逸宿主机,接管整个节点,横向扩散集群。即使没有公开EXP,攻击者可以基于公开漏洞细节自己编写EXP。
站在防御视角,分层防御:
- 第一层边界:攻击入口,关闭不用的内核模块,seccomp拦截危险socket调用;
- 第二层:内核层,及时更新稳定内核版本;
- 第三层:运行时检测,Falco监控异常SCTP socket创建,监控内核oops日志;
- 第四层:限制初始入口,尽可能不让攻击者拿到普通本地shell,做好Web应用防护。
很多企业安全体系只重视外部边界防火墙,忽略本地内核攻击面。攻击者渗透流程往往是外网打业务→拿到普通低权限shell→本地内核提权到root。内核本地漏洞是渗透链中非常关键的一环。
还有一个点值得思考:一个bug潜伏18年。代码合入主线之后,无数次内核编译发布,经过无数fuzz测试,但是直到AI辅助漏洞挖掘出现才被找到。传统人工审计、普通模糊测试,对这种状态机多参数依赖逻辑覆盖能力有限,未来AI辅助内核漏洞挖掘会爆出更多埋藏多年的老漏洞。运维团队不能抱有“代码跑十几年没有出事,应该就没有漏洞”的心态。
10 处置优先级与落地检查清单
可以直接复制给运维同事执行落地检查。
- 全部Linux主机运行检测脚本
check_CVE_2026_64564.sh,输出风险清单; - 区分业务是否依赖SCTP协议:
- 不依赖SCTP:modprobe黑名单sctp,重建initramfs/dracut,计划窗口重启主机;
- 依赖SCTP:评估业务,安排内核升级到修复版本;临时应急设置
net.sctp.addip_enable=0,评估业务兼容性;
- K8s/Docker集群:更新宿主机,部署seccomp策略,部署Falco告警规则;
- 漏洞修复之后,持续观察系统日志
dmesg,留意sctp相关oops、KASAN报错; - 资产台账标记电信信令服务器为高优先级内核升级资产。
互动思考
- 你们线上业务是否在真实使用SCTP协议?生产环境直接黑名单sctp模块有没有遇到业务报错?
- 在你看来,企业运维应该对这类长期潜伏的内核小众协议漏洞,建立怎样常态化检测机制?
本文所有配置脚本可以直接复制使用,实际生产部署前建议在测试环境验证兼容性,避免业务中断。
我之前也写过类似的文章,更多相关内容、心得经验可以来我博客看看~