← 文章 / 未分类
rustsec 7小时前 · 2026-09-16 13:00:51 · 0 阅读

RUSTSEC-2026-0284:无锁实现中的不健全性问题

两个相互独立的 soundness 问题,均可通过安全的 Rust 代码触发。

Map::into_iter 手动 drop 了 builder(调用方提供的哈希器 H)和 incin,然后用 mem::forget(self) 完成所有权转移。但 H::drop 是用户代码,可能 panic。一旦 panic,mem::forget(self) 就不会执行,仍然存活的 Map 会展开栈,其字段的 drop 逻辑会二次销毁 builder。一个空 map 就足以触发,无需任何条目或并发操作。

SharedIncin::clear 在取出真正的 Arc 之前,先往 self.inner 写入 mem::uninitialized::<Arc<_>>()Arc 有有效性不变量,因此在写入的那一刻就是未定义行为,不需要 panic 或并发。而且在这个写入与后续修复写入之间,self.inner 保存着垃圾数据,此时 self 仍可被 drop,所以 incin.clear()Arc::new 若在此期间 panic 展开栈,就会通过未初始化的指针去减引用计数。make_shared_incin! 宏被实例化了五次,因此 queuestackmapchannel::spmcchannel::mpmc 全部受影响。

Impact

  • CWE-415(Double Free):同一块内存被释放两次。
  • CWE-416(Use-After-Free):重复执行 Drop 时访问已释放的内存。
  • CWE-908(Use of Uninitialized Resource):用未初始化的字节构造 Arc

Fix

目前没有修复版本。该 crate 自 2018-11-18 以来未发布过新版本,维护者也未回应此报告。

本公告以 CC0-1.0 许可证发布。

原始来源: rustsec

评论 (0)