返回资讯中心
外部精选
软件工程
#开发者实时流

微软FORGE Lab用MDASH扫描Linux内核,产出59份漏洞报告

来源标题:Lessons from 59 Linux Kernel Bug Reports

微软FORGE Lab利用代号MDASH的工具扫描Linux内核子系统,共产出59份公开上游报告并获分配33个CVE。其中8个CVE已确认存在可用的本地提权利用,38份报告的修复已并入主线内核。该工作由一名全职研究员和一名实习生历时三个月完成。

Hacker News 最新wondersky2026/11/12 · 今天25 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

Research 2026年11月11日 阅读时长7分钟 来自59份Linux内核缺陷报告的经验教训 作者:FORGE Lab,查看该作者的全部文章;以及Cen Zhang,查看该作者的全部文章 收听本文 / 1倍速 分享 链接已复制到剪贴板! 标签 前沿AI模型 Linux 威胁情报 漏洞与利用 内容类型 研究 产品与服务 Microsoft Defender 主题 可操作的威胁洞察 AI与智能体 本文内容 从扫描到报告 精选发现 结语 在Microsoft的FORGE Lab,我们于2026年5月底至6月中旬使用代号MDASH的工具扫描了Linux内核的一部分子系统。一名全职研究员和一名实习生主导了这项为期三个月的工作,迄今已产出59份公开上游报告和33个已分配的CVE。我们确认其中8个CVE存在可用的本地提权利用,并且我们报告中已有38份的修复被合并进主线。

发现缺陷只是工作的一部分。初步扫描在约两周内产生了26,502条原始发现,但要把这些结果转化为可复现的缺陷、上游报告和补丁,需要数月的专家调查以及与Linux维护者的协作。

在本文中,我们回顾如何从数千条潜在发现走到经过验证的漏洞和上游修复,以及在用AI扩展漏洞发现规模方面我们学到了什么。

我们聚焦于若干核心内核子系统,例如网络、文件系统和安全模块。选择标准很直接:我们挑选了对专用硬件没有明显依赖、安全敏感的组件,使基于QEMU的验证简单且统一。代码扫描主要使用Sonnet 4.6(占代码扫描token的71.1%)、GPT-5.4(20.1%)和GPT-5.5(7.1%)。

代号MDASH的扫描在两台服务器(64核/256 GB内存和32核/128 GB内存)上于约两周内产生了26,502条原始扫描发现,但把这一输出转化为补丁和报告花费了数月的专家工作。我们利用代号MDASH的置信度等级以及我们构建的独立快速筛查智能体,过滤掉低置信度的主张,将候选池缩减至11,769条。随后,PoC生成智能体尝试在QEMU中复现,主要使用GPT-5.5(占复现token的77.3%)、Opus 4.6(13.2%)和GPT-5.5-cyber(9.4%)。之后,专家审查了621个带有PoC证据的案例,以确定根本原因、合并重复项并准备上游提交。

大约每十个有PoC支撑的案例产生一份公开上游报告:621个案例中产出59份报告(9.5%)。在这些案例中,未单独提交新报告的主要原因包括:

提交时机解释了许多重叠案例(共133个)。这621个案例中的大多数在扫描结束时是新的(尽管有些可能已被他人提交中)。我们的第一份公开报告于2026年6月27日发出,距扫描开始已超过五周。到9月1日,59份报告中有55份已发布到公开邮件列表;其余4份在同一时间段内私下报告,并于10月中旬转至公开列表。

上游Linux通常要求漏洞报告附带可用的补丁。智能体帮助起草了初始修复,但人工验证、对子系统的理解以及在审查期间与维护者的迭代仍然至关重要。到目前为止,我们报告中已有38份的修复被合并进上游主线——其中一半在首次提交时即被接受,其余经过一到四次修订。从首个公开补丁到进入主线发布中位数耗时41天(最长108天),我们仍在就剩余报告与维护者合作。

有趣的是,我们报告的大多数缺陷已在核中存在多年。在这59份报告中,缺陷在我们首次公开报告时的平均年龄为8.1年。其中最古老的一个是cls_u32的移位越界缺陷(CVE-2026-74544),它已存在至少21年。

在此批次迄今分配的33个CVE中,24个被评为High或更高(CVSS v3.1评分至少7.0)。以下是我们已在受控实验室环境中确认存在本地root提权利用的8个CVE,其中一些案例需要非默认设置或关闭利用缓解措施:

CVE-2026-64563是rhashtable(Linux内核的共享可调整大小哈希表)中一个单行状态重置缺陷。由于调用方信任表遍历返回的对象指针,这个微小的库缺陷使得在Linux上实现稳定的本地提权成为可能——并且影响启用了SELinux强制模式的Android——无需特殊内核配置或用户命名空间。

许多内核子系统将活动对象(如套接字)存储在rhashtable中,并在用户空间请求列出它们时遍历该表。由于大型列表可能被拆分到多个回复中,一次遍历可能暂停并恢复。其迭代器保存了停止位置,包括指向最后访问条目的指针(iter->p)。然而,在遍历暂停期间,表仍可能发生变化:条目可能被移除并释放,调整大小可能替换底层桶表。

在2018年之前,rhashtable_walk_stop()在暂停时总是将iter->p = NULL清除。为了提高跨停止/启动周期的遍历稳定性,2018年的一次提交(5d240a8936f6)在walk_stop()期间保留了iter->p,并将重置移入rhashtable_walk_start_check()——但仅在其两条恢复路径中的一条上执行:

旧表因调整大小而被释放(iter->walker.tbl == NULL):第877–882行切换到新表,重置slot和skip,并提前返回-EAGAIN,而不清除iter->p: 旧表仍然存在(iter->walker.tbl != NULL):第884–919行在桶链中扫描iter->p,如果条目已被移除,则重置iter->p = NULL。 if (!iter->walker.tbl) { iter->walker.tbl = rht_dereference_rcu(ht->tbl, ht); iter->slot = 0; iter->skip = 0; return -EAGAIN;

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →