[RFC] 缓解意外的算术溢出

主要观点:Linux 内核一直受意外算术溢出漏洞困扰,虽有改进但成效不佳,应系统地终结此问题。需考虑术语、根源、缓解、覆盖、语言和代码库等多方面因素,寻找合适解决方案。
关键信息

  • 术语上,“溢出”指溢出和下溢,即环绕,而非未定义行为。
  • 根源是未检测到或未正确处理的环绕情况,C 语言语义易导致错误。
  • 缓解措施要逐步过渡,避免破坏旧行为,采用允许列表方式确定预期环绕位置。
  • 语言方面,C 无正式异常处理系统,缺乏明确算术意图,需创建新的环绕类型。
  • 代码库中,有符号计算有意溢出少,无符号计算易导致环绕错误。
  • 潜在解决方案有使用 sanitizers 和运算符重载,前者已存在部分工作,后者语义未明。
    重要细节
  • 过去十年平均每年约有 6 个主要整数溢出漏洞。
  • GCC 和 Clang 已有处理整数溢出的 sanitizers,但需在编译器和 Linux 侧做工作。
  • 最近的 C 标准提案中有“Operator Overloading Without Name Mangling”。
  • 已存在可启动的概念验证,但未使用“wraps”属性。
  • 讨论中多位开发者发表了观点和建议。
阅读 16
0 条评论