Automatic Detection of Reference Counting Bugs in Linux Kernel Drivers
本文介绍了DrvHorn,这是一种自动化工具,它将引用计数验证简化为断言检查,从而成功检测出Linux内核驱动程序中424个此前未知的漏洞,并促成了45个补丁的合并。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
想象一下 Linux 操作系统是一座庞大而繁忙的城市。在这座城市中,设备驱动程序就像是一支支专业的施工队,负责建设和维护特定的街区(比如你的无线网卡、显卡或打印机)。因为这些施工队与城市规划者本身拥有同等的高级别权限,所以如果某支施工队犯了错误,就可能导致整座城市崩溃或面临安全风险。
这些施工队最常犯的错误之一就是引用计数。
“借阅书籍”的类比
将计算机中的每一块硬件都想象成一本图书馆的书籍。
- 引用计数就是图书馆追踪当前有多少人借出了该书的方式。
- 当驱动程序(一支施工队)需要使用这本书时,他们将其“借出”,计数增加。
- 当他们完成使用时,将其“归还”,计数减少。
- 规则:如果计数归零,图书馆就知道这本书可以安全地销毁(释放内存)。
存在的缺陷:
- 内存泄漏:施工队借出了书却忘记归还。计数居高不下,图书馆因为认为该书仍在使用而耗尽了空间。
- 释放后使用(UAF):施工队在其他人仍在阅读时过早地归还了书(计数归零)。图书馆将书扔掉,而读者试图阅读一堆灰尘,导致崩溃。
引入 DrvHorn:自动化检查员
这篇论文的作者是 Joe Hattori 及其团队,他们开发了一个名为 DrvHorn 的工具。你可以将 DrvHorn 想象成一位超高速的自动化建筑检查员,它不仅仅查看蓝图,还会模拟整个施工过程,以便在建筑完工前发现错误。
以下是 DrvHorn 的工作原理,分解为简单的步骤:
1. “如果”情景(核心思想)
DrvHorn 并不试图检查驱动程序运行的每一个瞬间(因为代码过于庞大,这不可能做到),而是专注于一个特定的情景:如果施工队未能启动会发生什么?
作者们发现了一条简单的规则:如果驱动程序开始构建随后崩溃或失败,它必须归还借出的每一本书。 如果它未能归还一本书,那就存在缺陷。DrvHorn 将这条规则转化为一个数学问题:“如果驱动程序失败,借出的书籍总数是否恰好为零?”
2. 简化城市(建模)
Linux 内核是一座巨大而复杂的城市。如果检查员试图理解每一块砖和每一根管道,那将耗费无穷无尽的时间。
- 技巧:DrvHorn 创建了一张简化的城市地图。它用简单的“虚拟”版本替换了复杂的现实世界交互。
- 示例:与其模拟整个 USB 总线,它只需说:“好的,如果你请求一个 USB 设备,这里有一个通用的 USB 设备。”这使检查员不会在细枝末节中迷失,同时仍能捕捉到主要错误。
3. 剔除噪音(程序切片)
即使有了简化的地图,代码仍然过于庞大。DrvHorn 使用了一种称为程序切片的技术。
- 隐喻:想象你正在一本 1000 页的小说中寻找特定的拼写错误。你不需要阅读关于天气的描述或角色的童年故事。你只需要阅读角色手中拿着“书”(引用计数)的句子。
- DrvHorn 激进地剔除所有不影响书籍计数的内容。它扔掉了天气描述和童年故事,只留下关键的句子。这使得检查速度快到足以在数千个驱动程序上运行。
4. 大脑(求解器)
一旦代码被简化和切片,DrvHorn 就将剩余的谜题交给一个强大的逻辑引擎(称为 SeaHorn)。这个引擎就像一位超级聪明的侦探,试图证明当驱动程序失败时,“借出的书籍计数”是否可能不为零。如果侦探找到了计数出错的方法,它就会标记出一个缺陷。
结果:彻底清理
该团队在 Linux 6.6 版本中的 3,387 个不同驱动程序上测试了 DrvHorn。
- 发现:该工具发现了 777 个潜在缺陷。
- 准确性:经过人类专家检查后,545 个是真实缺陷。与以往经常误报的工具相比,这是一个非常低的“误报”率(约 30%)。
- 影响:其中 424 个缺陷是全新的发现——此前无人知晓它们的存在。
- 修复:该团队为这些缺陷编写了补丁(修复方案)。Linux 内核开发者审查了这些补丁,并将 45 个合并到了官方代码中。
为什么这很重要
在 DrvHorn 出现之前,寻找这些缺陷就像是用放大镜看着整堆干草试图找到一根针。这既缓慢又昂贵,而且经常遗漏目标。
DrvHorn 就像是一个金属探测器,只有当它发现特定类型的金属(引用计数缺陷)时才会发出蜂鸣声。它忽略了草和泥土,使团队能够快速扫描整堆干草,找到他们之前遗漏的针。
总结:这篇论文提出了一种工具,通过简化代码、专注于失败情景并利用高级逻辑来证明资源是否被正确清理,从而自动化检测 Linux 驱动程序中的内存管理错误。它成功发现了数百个隐藏缺陷,并帮助修复了官方 Linux 系统中的数十个缺陷。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。