【漏洞预警】Linux三年前补上的洞,又一次被挖开了
YGnight
YGnight
night安全
2026年9月3日 08:15
四川
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
一、漏洞描述
收到一个linux的提权漏洞的情报,目前POC已被公开,编号是CVE-2026-52933, 这个漏洞产生的位置在 Linux 内核 io\_uring 的 poll 请求所有权判断上。请求被取消后,内核本该拦住后续唤醒,实际测试发现是拦不住的,唤醒路径还能再拿走一次。请求完成两遍,文件引用跟着释放两次,用户态剩下的描述符成了悬空指针。
| CVE 编号 | CVE-2026-52933,评分 7.8 高危,向量 AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| 影响组件 | io\_uring/poll.c 的 io\_poll\_get\_ownership() |
| 成因 | 有符号比较让取消标记失效,请求重复完成,文件引用重复释放 |
| 引入版本 | 提交 a26a35e9 之后,该提交本身是 CVE-2023-0468 的修复补丁 |
| 受影响版本 | 主线 6.1 到 7.0;5.15.82 起的 5.15.y,6.0.11 起的 6.0.y |
| 修复版本 | 6.1.175、6.6.140、6.12.86、6.18.27、7.0.4,主线 7.1 起不受影响 |
| 利用条件 | 本地账号且能调用 io\_uring,完整链条还要 perf\_event\_open 与 mmap 开放 |
| 情报备注 | NVD 归到 CWE-835,与成因不符,去重别按此标签合并 |
二、漏洞原理
io\_uring 给每个 poll 请求挂了一个 32 位的计数器,叫 poll\_refs。一个变量塞了三样东西。
bit 31 取消标记
bit 30 重试标记
bit 29~0 引用计数
define IO\_POLL\_CANCEL\_FLAG BIT(31) /\ 0x80000000 \/
define IO\_POLL\_RETRY\_FLAG BIT(30) /\ 0x40000000 \/
define IO\_POLL\_REF\_MASK GENMASK(29, 0)
define IO\_POLL\_REF\_BIAS 128
低 30 位是引用计数,同时兼作所有权标记。谁要动这个请求,得先把计数从 0 加成 1,抢到的那个才算拿到所有权。入口长这样。
static inline bool io\_poll\_get\_ownership(struct io\_kiocb \*req)
{
if (unlikely(atomic\_read(&req->poll\_refs) >= IO\_POLL\_REF\_BIAS))
return io\_poll\_get\_ownership\_slowpath(req);
return !(atomic\_fetch\_inc(&req->poll\_refs) & IO\_POLL\_REF\_MASK);
}
第一行是道闸。当前值看着大于等于 128,就不硬加了,交给慢路径。慢路径会先看低 30 位是不是还被人占着,占着直接拒绝。第二行是正常情况下的抢锁动作。
闸坏在类型上。atomic\_read 返回的是 int,带符号。取消请求的时候要往最高位或上取消标记,也就是 0x80000000。这一位一置,整个数按有符号读出来是负数。负数跟 128 比大小,永远比不过,第一行恒为假,慢路径压根进不去。
代码直接掉到第二行。第二行只跟低 30 位做与运算,对最高位的取消标记视而不见。只要低 30 位此刻正好是 0,返回值就是真。唤醒路径从内核手里拿走了一个已经被取消的请求。
要触发得凑两件事,请求已取消,低 30 位归零。公开利用的凑法分三步。
- 注册一个监听 eventfd 的 POLL\_ADD,然后给属主任务发 SIGSTOP 把自己停住。
- 父进程发一个 ASYNC\_CANCEL 把请求标成已取消。完成任务挂在停住的任务上,一直跑不掉。
- 往 eventfd 里灌唤醒,数量取 2 的 30 次方减一,也就是
(1ULL << 30) - 1。
慢路径被跳过后,每来一次唤醒,第二行都老老实实把计数加一。加到 2 的 30 次方,低 30 位绕回 0,整个值只剩最高位那个取消标记。有符号比较照样把它当负数放行。唤醒回调看到低 30 位是 0,认定这是个空闲请求,同一个完成任务被挂了第二次。
两次完成跑完,文件引用减了两次,eventfd 的 struct file 提前回收,用户态描述符成了悬空指针。
从悬空指针到 root 还有一段路。公开利用拿 perf\_event\_open 批量开事件,把刚空出来的 file 槽位占回去,再用 kcmp 逐个比对,确认哪个 perf 描述符跟那个悬空描述符指向同一个对象。接着关掉两个描述符,perf 的缓冲区释放了,之前 mmap 出来的映射还活着。再堆 4096 个 2MB 的共享内存,把那页抢回来当页表页。页表项归攻击者改,等于能把任意物理地址映射进用户空间,内核地址随机化形同虚设。最后把 SELinux 的 enforcing 字节清零,把 core\_pattern 改成 |/proc/%P/exe %P,故意崩一次,内核以 root 身份把攻击者自己的程序拉起来。
这条链全程没用用户命名空间。利用代码里注明 perf\_event\_open 和 mmap 在 uid 65534 上就能用,perf\_event\_paranoid 是 2。靠禁用非特权命名空间挡内核提权的常规做法,对这条链不起作用。
三、修复建议
- 参考漏洞描述中的修复版本进行升级到对应的兼容版本。
- 暂时无法升级的先把 io\_uring 关了。
可以参考这段命令
sysctl -w kernel.io_uring_disabled=2
近期值得重点关注的漏洞预警
【紧急漏洞预警】nacos爆出权限绕过漏洞,可以创建管理员账户,经过分析有点出处(已复现,exp脚本已编写)
【漏洞预警】自己注册个号,就能搬空别人的 Magento 订单和支付卡(POC已公开)
【漏洞预警】Next.js 爆出新漏洞,不用登录实现命令执行(POC已公开)
【漏洞补丁绕过预警】Redis CVE-2026-23479变种高危漏洞,EXP已公开
【漏洞补丁绕过】超 30 万 WordPress 站点受影响,Forminator 文件上传漏洞(附POC)
【漏洞预警】Exchange爆出RCE漏洞,利用Exchange 帮另一台 Exchange 开门(POC已公开)
【漏洞预警】不用登录,一个请求就能让 GeoServer 乖乖执行命令(POC已公开)
【漏洞预警】Keycloak不登录就能接管任意账户,双重验证也拦不住
【漏洞预警】 8月WebLogic公布了9个漏洞,有一个需要重点关注
【漏洞预警】近期MongoDB 公布了5个漏洞,最严重的一个可以不认证、远程就能拿下你电脑
【0DAY漏洞】 全球5G手机芯片厂商之一的紫光展锐SOC存在RCE漏洞,影响数十家手机厂商,还未发布补丁
【漏洞告警】安卓 14 到 16 全中招,通讯录 SQL 注入漏洞正在抄家(POC已公开)
【漏洞预警】不用输密码,对方已经接管你的Mac:官方补丁公布macOS存在未鉴权RCE漏洞
【0day漏洞预警】MariaDB 13 爆 9.8 分 RCE 链:最低 USAGE 权限就能远程执行命令
VMware 爆 5 个洞,两个 9.8 不用密码就能打穿 vCenter
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论