文章《内核漏洞平均隐藏两年,有些甚至隐藏二十年》


| Bug Type | Count | Avg Lifetime | Median |
|---|---|---|---|
| race-condition | 1,188 | 5.1 years | 2.6 years |
| integer-overflow | 298 | 3.9 years | 2.2 years |
| use-after-free | 2,963 | 3.2 years | 1.4 years |
| memory-leak | 2,846 | 3.1 years | 1.4 years |
| buffer-overflow | 399 | 3.1 years | 1.5 years |
| refcount | 2,209 | 2.8 years | 1.3 years |
| null-deref | 4,931 | 2.2 years | 0.7 years |
| deadlock | 1,683 | 2.2 years | 0.8 years |
作者:Jenny Guanni Qu
这篇文章的核心是作者通过挖掘 Linux 内核 20 年的 Git 历史(分析了 125,183 个漏洞 )。
- 核心数据:
- 潜伏期: Linux 内核漏洞从引入到被修复,平均需要 2.1 年。
- 极端案例: 最长的一个漏洞(ethtool 中的缓冲区溢出)潜伏了 20.7 年;作者重点剖析了一个隐藏了 19 年 的 netfilter 引用计数泄漏(refcount leak)。
- 子系统差异: CAN 总线驱动程序的漏洞平均潜伏 4.2 年,而 GPU 和 BPF 驱动则修复较快(约 1.1-1.4 年),这反映了代码审计频率的差异。
- 安全趋势:
- 由于 Syzkaller(Google 开发的模糊测试工具)和各种 Sanitizers(如 KASAN)的应用,漏洞被发现的速度正在大幅提升:2010 年时几乎没有漏洞能在一年内发现,而到 2022 年,69% 的漏洞在一年内就能被捕获。
- 技术产出 - VulnBERT:
- 作者开发了一个名为 VulnBERT 的 AI 模型,专门用于在代码提交(commit)时预测该代码是否引入了漏洞。该模型在测试集上的召回率达到了 92.2%,而误报率仅为 1.2%,远优于传统的代码模型。
它利用 AI 技术(VulnBERT)和大数据分析证明:尽管 Linux 内核的安全工具链(如模糊测试)在进步,但依然有大量高危漏洞能隐藏数年之久。
阅读:https://pebblebed.com/blog/kernel-bugs
r/rust 频道围绕该研究揭示的漏洞类别以及 Rust 语言的防御效果展开讨论:https://www.reddit.com/r/rust/comments/1q77eqe/kernel_bugs_hide_for_2_years_on_average_some_hide/
Rust 1.93 Cargo 更新与进展
核心功能与性能改进:
- 配置包含功能(Config Include)已稳定:
-Zconfig-include现已稳定,允许在.cargo/config.toml中通过include字段引入其他配置文件,支持可选包含和数组形式。 - 更细粒度的目标目录锁定(Target Dir Locking):为了解决
cargo check与rust-analyzer同时运行时的锁定冲突,Cargo 正在尝试拆分构建目录和伪影目录的锁,以支持更高效的并行操作。 - 结构化日志与报告:引入了实验性的结构化日志支持,新增
cargo report timings命令,帮助用户分析构建耗时和重新构建的原因。
诊断与 Lint 增强:
- 现代化的诊断渲染:Cargo 开始采用
annotate-snippets库,并引入了可选的 Unicode 渲染(-Zrustc-unicode),使错误信息更直观。 - 新增 Lint:添加了
implicit_minimum_version_req(隐式最小版本要求)Lint,用于规范工作区依赖的版本管理。
构建系统与布局:
- 构建目录布局调整:为了支持跨项目缓存,Cargo 正在推进内部目录布局的重构,并进行了大规模的测试(包括 Crater 运行)。
- 自定义最终产物:探讨了允许构建脚本(build scripts)将生成的产物(如特定的二进制文件)放置到指定目录的新机制,旨在解决目前路径难以预测的问题。
依赖管理:
- 发布时间(Pubtime)与“时光倒流”解析:
- Cargo 现在开始支持记录库文件的发布时间。
- 引入了不稳定的“时间旅行依赖解析”功能(
--publish-time),允许用户将依赖树锁定在过去的某个时间点。
其他小更新与工具:
- Cargo 插件推荐:本期推荐插件为
cargo-override,用于辅助管理[patch]表。 - 命令行改进:
cargo clean新增--workspace标志;Git 浅克隆现支持使用 CLI 获取;cargo tree正在实验交互式 TUI 界面。 - Cargo Script:对 Cargo 脚本功能进行了进一步的细节打磨。
该版本通过优化底层架构、提升诊断体验和引入更多元的数据(如发布时间),进一步增强了 Rust 开发者的工具链体验。
阅读:https://blog.rust-lang.org/inside-rust/2026/01/07/this-development-cycle-in-cargo-1.93/
文章系列《Who Owns the Memory?》
作者:Luca Lombardo
第 2 部分《Who Calls Free?》探讨了 Rust 如何通过所有权机制解决手动内存管理的难题,核心在于将释放责任从开发者移交给编译器。编译器在作用域结束时自动插入释放逻辑,利用移动语义消除重复释放风险,并通过 Drop Flag 动态跟踪复杂的初始化状态。文章还深度解析了 std::mem::drop 夺取所有权的本质,以及销毁检查器如何强制执行生命周期规则,确保引用在对象销毁期间始终有效。
阅读:https://lukefleed.xyz/posts/who-owns-the-memory-pt2/
第 3 部分《How Big Is your Type?》详细解释了如何通过借用在不转移所有权的情况下安全访问数据,并重点分析了“别名 + 可变”带来的安全隐患及其规避方法。它深入介绍了借用检查器如何利用生命周期来防止悬空指针,确保所有引用在生效期间始终指向有效的内存。
通过这些机制,Rust 在无需垃圾回收的前提下,实现了高性能与内存安全的完美平衡。
阅读:https://lukefleed.xyz/posts/who-owns-the-memory-pt3/
--
From 日报小组 苦瓜小仔
社区学习交流平台订阅:
评论区
写评论还没有评论