训练提亚马特的板条箱,取消召唤克苏鲁:驯服 C++ 中的 UB 怪物

这是一篇关于 C++ 安全性和强化工作的更新文章,主要内容总结如下:

  • 背景与定义:相关安全问题的更多背景,包括“语言安全”“软件安全”等术语的定义,可参考 2024 年 3 月的文章“C++安全,在上下文中”。本文继续讲述相关故事,聚焦于未定义行为(UB)。
  • 当前进展:C++社区在强化工作方面取得了很多进展,包括各个厂商的工作以及标准化进程,标准中既有已有的(无 UB 的 constexpr 编译时代码),也有近期的(C++26 中的错误行为、边界强化标准库、函数式安全合约),还有正在积极推进的提案(Bjarne Stroustrup 的配置文件、Úlfar Erlingsson 的远程代码执行强化)。
  • 常见误解:技术专家曾认为 UB 与 C++的规范和程序紧密纠缠,C++无法解决足够的 UB 问题。但实际上自 2011 年以来,越来越多的 C++代码已无 UB,C++26 标准也已去除关键的运行时 UB 案例。
  • 具体措施

    • constexpr 代码:C++11 起,编译时的constexpr世界已无 UB,如今近整个语言和标准库的大部分都可在编译时使用,且在编译时执行时无 UB。各大编译器已支持多年,在生产中广泛使用。
    • C++26 语言安全与软件安全改进:2024 年 3 月,C++26 草案消除了未初始化变量的 UB,改为错误行为;上个月,添加了强化标准库的规范,重新编译可获得许多常见操作的边界安全保证。这些改进可通过重新编译现有代码实现,已在生产中使用,且取得了良好效果。
    • C++26 时间段的更多工作:多个委员会专家提出系统地编目和处理 C++中的 UB,EWG 批准在 C++26 时间段内制定语言安全白皮书,涵盖错误行为、配置文件和合约等方面,以系统地处理 C++语言的核心 UB。
    • 新提案:Gašper Ažman 和作者撰写了 P3656 提案,详细说明了拟议的程序和计划,包括列出语言 UB 案例、创建工具列表、确定处理方式和分组 UB 案例等。Úlfar Erlingsson 提出了防止现有 C++代码中 RCE 的安全配置文件提案,相关论文值得一读,若语言 UB 白皮书能实现相关目标,将大幅降低 C++软件的安全漏洞。
  • 总结与展望:多年来软件安全在 C++标准化中未被视为优先事项,但现在情况已改变,目标是实现与其他现代语言在安全漏洞数量上的平等。已经取得了很大成就,编译时的 C++已无 UB,C++26 也在消除常见的漏洞 UB 根源,未来将继续系统地处理 UB,包括消除几乎所有的远程代码执行攻击。如果这些努力成功,将给很多人带来惊喜。感谢参与其中的人们。
  • 附录:UB 简介:历史上 UB 用于编译器优化,但现在重新考虑 UB 是因为其直接和间接的安全影响,以及会导致神秘的普通错误。在 C++中处理 UB 比在 C 中更容易,因为 C++有更多标准抽象和可强化的库功能。UB 与“未定义行为,无诊断要求”(IF-NDR)密切相关。
阅读 8
0 条评论