LWN:算数溢出的内核防护!

Arithmetic overflow error converting numeric to data type numeric错误解决 java.sql.SQLException: Arithmetic overflow error converting numeric to data type numeric. Query: insert into 阅读详情

关注了就能看到更多这么棒的文章哦~

Arithmetic overflow mitigation in the kernel

By Daroc Alden
July 1, 2024
Gemini-1.5-flash translation
https://lwn.net/Articles/979747/

2024 年 5 月 7 日,Kees Cook 在 linux-kernel 邮件列表中发送了一个 提案,要求内核开发人员开始着手解决无意(unintentional)算术溢出问题。算术溢出一直是许多 bug 的根源。这不是 Cook 第一次提出类似的要求;他在 2024 年 1 月 提交了一套相关的补丁。一些核心开发人员出于不同的原因对该计划表示反对。在收到他们的反馈后,Cook 修改了他的方法,以一系列更小的步骤来解决这个问题。

Cook 提及了他在 2024 年北美 Linux 安全峰会上 发表演讲时的 幻灯片,称内核“平均每年大约有 6 个重大的整数溢出漏洞”。在他的电子邮件中,他明确表示自己并不谈论未定义行为:“我们已经要求我们的编译器为所有算术运算使用一个定义明确的溢出解析策略;溢出导致回绕(感谢 ‘-fno-strict-overflow’)。”

相反,Cook 担心的是无意算术溢出,即使它是定义明确的,也会导致计算出不正确的值。当它牵涉到边界检查时会尤其麻烦,但这并不是唯一一个错误值可能造成安全隐患的地方。不幸的是,识别无意算术溢出发生的位置很困难,因为内核中有很多地方使用了 故意 的算术溢出。因此,任何解决方案都将需要一定的人工干预,以确定在任何给定情况下溢出是否预期。

Cook 提出了两种可能的解决方案:添加一个新的清理工具 (sanitizer),或者操作符重载 (operator overloading)。内核已经使用了几种清理工具来捕获诸如无效内存访问和未定义行为等问题。Cook 的第一个提议是为预期回绕的值添加 typedef,然后随着时间的推移开始对内核进行切换。清理工具最初会发出警告,直到内核被转换,届时它可以被更改为发出错误。这是 Cook 首选的方法。另一种可能的解决方案将使用 C 中 最近提出的(一旦编译器实现它)用于操作符重载的功能,该功能将允许内核自定义不同类型的处理方式。

回应

David Laight 反对了该提议,理由是性能问题,而 Cook 在他的原始电子邮件中并没有提到这个问题,因为他认为这是一个次要的考虑因素。Laight 担心所需的额外检查会使代码膨胀,并使分支预测变得更糟。Cook 回应了一些性能测量结果,表明当清理工具被配置为发出警告时,为有符号整数溢出启用清理工具会导致运行时开销增加 1%,而当它被配置为导致内核崩溃时,开销为 0.57%。

Linus Torvalds 也不支持该提议,他说:“无符号算术被定义为回绕,而且它这样做是有原因的”。他继续说道:

我认为你需要限制你对回绕的抱怨,并且认真考虑如何限制它们。如果你将“回绕是错误的”作为一种普遍的规则,我会无视你,我会告诉人们无视你,并拒绝任何由于这种愚蠢的规则而产生的愚蠢的补丁。

在 回复中,Cook 表示他同意 Torvalds 的大多数观点——一些算术溢出是预期的,清理工具需要足够智能,以避免对诸如现有溢出检查等无害情况发出警告。问题是,Cook 认为无法从源代码中判断代码开发人员是否打算发生算术溢出。“我需要的是在源代码级别捕获_意图_。不幸的是,编译器和人都不是无所不知的”。Cook 还解释了为什么他认为基于类型的解决方案是最好的:

是的,我同意,单独注释计算看起来会使代码可读性降低很多。这与开发人员的普遍反馈相一致。其他语言中使用的解决方案(取得了巨大成功)是将回绕意图与类型绑定在一起。我们也可以这样做。

Torvalds 反驳道,在某些情况下,意图从上下文就很清楚,任何工具都需要足够智能,以便从值的用法中确定这一点:“如果它用作大小或数组索引,它可能有问题。但如果它用作掩码,然后使用*掩码*版本作为索引,它显然没有问题”。一个允许溢出然后使用掩码获取正确索引的例子是 Kent Overstreet 最近发布的 通用环形缓冲区。Torvalds 还反对添加另一种类型,理由是不会增加认知负担:“我们已经对许多内核开发人员寄予厚望。我们不应该因为你的宠物项目而增加他们的负担”。

Cook 认为将他的工作描述为“宠物项目”是不公平的,因为有大量的学术研究针对这类缺陷。他也同意,要求清理工具不产生毫无意义的警告是可以理解的,“但如果这个标准是无所不知,那将是行不通的”。为了使讨论更具体,他引用了一个具体的问题,这个问题从被 首次识别到 正确修复之间经历了 8 年时间,声称清理工具会立即发现它。在这种情况下,perf 事件的计算大小可能被记录错误,因为存储大小的结构只使用了 16 位来存储它。Cook 质疑如果不采用类似他的提议的方法,如何防止这类问题。

作为回应,Torvalds 提出了一种替代方法:与其一开始就解决所有算术溢出,不如先专注于一些容易发现问题并且很可能很重要的子集。例如,他建议专注于那些由于 C 的整数提升规则而并非技术上的未定义行为,但涉及将有符号数量提升为无符号数,然后以溢出的方式使用的情况。其他可能的领域包括将某个算术表达式的结果明确用作分配大小的地方,或涉及直接指针算术的地方。Torvalds 还反驳了清理工具可以防止 Cook 引用问题的断言,指出这是一个“隐式转换删除了有效位”的情况,而不是普通的算术溢出。

内核已经针对这些问题进行了各种有针对性的检查,Cook 回应道:

没错,我们一直在做所有这些事情。不过,它们都具有共同的根本原因:意外的回绕。但是我明白你的意思:不要追根溯源,找到与之密切相关的信号强烈的因素。

Cook 同意在解决算术溢出之前,先关注隐式整数截断作为缓解措施的下一个目标,因为 Torvalds 更愿意考虑这一点。

编译器问题

Torvalds 消息中的一项细节促使 Peter Zijlstra 发表了进一步的评论。Torvalds 声称有符号整数溢出是未定义的行为,它已经被内核使用的 未定义行为清理工具 (UBSAN) 识别。“我们使用 -fno-strict-overflow 编译,这意味着 -fwrapv,这通过强制执行二进制补码来消除有符号溢出的 UB”,Zijlstra 说。Justin Stitt 声称这并不完全正确,因为 LLVM 引入了一种让 -fwrapv 和 UBSAN 协同工作的方法。Zijlstra 称这种变化是“我们不需要的药物”,他说,由于 -fwrapv 使行为定义明确,因此不应被 UBSAN 捕获。Fangrui Song 澄清道,在最近的 拉取请求之后,LLVM 将不再将 -fwrapv 解释为意味着 =-fsanitize=signed-integer-overflow=。

谈论什么是或不是未定义行为,这不是重点,Cook 说。“这_不是_关于未定义行为。这里的目的是找到一种方法,使 C 作者的意图明确无误。”Zijlstra 仍然认为,该行为不应在 UBSAN 中被检查。Stitt 声称,“我们应该将 UBSAN 视为‘意外行为’清理工具”,而不是未定义行为清理工具。UBSAN 代码中存在许多清理工具“在_技术上_不处理未定义行为”,他说。他强调了注释预期算术溢出发生位置的重要性,因为没有其他好的方法来识别这些位置。

Ted Ts'o 对内核开发人员应该进行另一套类似的重大更改的建议感到不满:

但问题是,当你将大量的繁重工作强加给内核开发人员时,而他们并没有为此做好准备,而他们不一定有时间自己完成所有工作,而他们的企业主也不愿为他们提供处理无资金授权的人员编制,而这些人正在寻找一个光明美好的未来——不要感到惊讶,如果内核开发人员强烈反对。

Ts'o 继续说,对于任何类似的提议的更改,衡量标准不是发现了多少安全漏洞,而是安全特性产生了多少噪音。Cook 回应道,他的提议的意图并不是要求所有核心内核开发人员花时间来做这件事。他重申,更改将是渐进的,并且虽然他很感谢帮助,但他没有要求其他人参与清理工作。他在内核中做了十年类似的工作,从未将发现的 bug 数量作为衡量标准——相反,他想“消除整类 bug”,这样就不会有那么多的 bug 需要发现。“我想我_确实_关心 bug 数量,但我只希望它们为_零_。”

Cook 确实说,“我听到了你(还有 Linus 和其他人)关于最大限度地减少对其他开发人员的负担的意见”。他说,这就是他将该提议提交到邮件列表中的原因,以便他可以获得关于如何解决算术溢出问题的反馈。Ts'o 道歉,澄清说他并非有意批评 Cook 的工作,而是反驳 Stitt 的断言,即每个预期算术溢出发生的地方都应该进行注释。他重申了他的立场,虽然发现安全问题很重要,但清理工具需要谨慎,不要产生太多误报,以至于他们的警告被忽略。“因此,请将此视为一项恳求,要求在任何时候都尽可能地 真正 认真地降低清理工具的误报率。”

在收集了其他内核开发人员的反馈后,Cook 不再打算继续为所有算术溢出提供清理工具——至少目前还没有。相反,他 打算采取三个“小步骤”:完成正在进行的有符号整数溢出重构工作,开始解决有符号整数截断的情况,然后查看特定类型(从 Torvalds 提议的 size_t 开始)的无符号整数溢出。鉴于过去类似的更改需要多长时间,这似乎很可能会占用 Cook 的一段时间。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

1ec7ac17392e1e7eaf8d7013a833ead4.jpeg

std::map看来可以被淘汰了?可以用vector来替代,而且更好 vector的优势在于内存连续,可以先std::sort,然后std::lower_bound,或者std::binary_search。而std::map,insert的时候,需要new出内存。 阅读详情

相关推荐

STK中的传感器、雷达、发射机、接收机、天线

本文根据STK手册介绍了传感器、雷达、发射机、接收机、天线等对象的基本属性,简略分析了它们的不同之处。

wangyulj的专栏 1万+

数值溢出(arithmetic overflow)问题与解决方案

1. 求最小公倍数 根据最大公约数求最小公倍数;lcm(a,b)=a⋅bgcd(a,b) \text{lcm}(a,b)=\frac{a\cdot b}{\text{gcd}(a,b)} int gcd(int a, int b); int lcm(int a, int b){ return (a * b)/gcd(a, b); }数学意义上确实没有异议,但在编程实现时,考虑到计算机表示

1万+

Beyond the Spec: Decoding Samsung‘s LPDDR6 Sub-Channel and Wide-NRZ Innovations

本文深入解析了三星LPDDR6内存的两大核心技术:Sub-Channel架构与Wide-NRZ信号技术。Sub-Channel架构通过将物理通道划分为多个独立子通道,实现了内存访问的细粒度控制,大幅提升了能效,尤其适用于AI与边缘计算场景。Wide-NRZ则通过增加并行数据线而非采用PAM4,在提升带宽的同时保持了优异的信号完整性与低功耗特性。

weixin_29209801的博客 134

3. Python配置教程

编译器。不是必须的。对浮点数和的支持。对线程的支持。用于和模块的 OpenSSL 1.1.1 或更新版本。在 Windows 上,需要 Microsoft Visual Studio 2017 或更新版本。在 3.11 版本发生变更: C11 编译器,现在要求 IEEE 754 和 NaN 支持。在 Windows 上,需要 Visual Studio 2017 或更新版本。在 3.10 版本发生变更: 现在要求 OpenSSL 1.1.1。

无极低码 2270

实战分享:如何用Dify和MaxKb实现文档智能切分与高效检索(附代码解析)

本文详细介绍了如何结合Dify和MaxKB构建文档智能切分与高效检索系统。针对传统全文检索的不足,提出了结构感知的文档切分方案,通过解析文档层级关系并构建标题链,实现了精准的章节级检索。文章包含完整的代码实现,涵盖文档解析、智能切分、向量化策略及双索引优化,并分享了性能调优和生产环境实践经验。

qsc90123456的博客 546

Xilinx同步FIFO IP核的两种读模式对比:Standard vs FWFT(附Vivado仿真代码)

本文深入解析Xilinx同步FIFO IP核的两种读模式——Standard与FWFT,通过时序仿真和Vivado代码示例对比其性能差异。Standard模式适合严格流水线设计,而FWFT模式在低延迟场景表现更优。文章包含详细的testbench搭建指南和性能实测数据,帮助FPGA工程师优化数据流设计。

table的专栏 345

arithmetic overflow

今天在codility上做练习,发现了自己经常忽视的一个算数溢出的问题,mark一下。 int i = 2; int j = 2147483647; long long k = i + j; // arithmetic overflow! // should declare i or j as 'long long' too; otherwise, i+j is of type 'int'

u013504688的专栏 777

基于C#的ASP.NET开发的党史学习网站课设

开展党史学习教育,就是要以史为镜、以史明志,把苦难辉煌的过去、日新月异的现在、光明宏大的未来贯通起来,在鉴往知来中砥砺前行,在乱云飞渡中把准航向,在凝心聚力中团结奋斗,共同创造新的历史伟业。登陆按钮与数据库进行连接,逻辑实现是如图3.1.3所示,自己定义一个SQL查询语句,将账号、密码放入SQL查询语句中,用sqlDataReader.HasRows语句进行逐一比较,找出结果,将用户名存入session并调用cookies,如果结果存在就关闭数据库,进行数据跳转,并弹出登陆成功的提示框,并关闭数据库。

m0_62408555的博客 974

关于overflow

gcc支持以下flag: ccflags-y += -fstrict-overflow -Wstrict-overflow=5 ccflags-y += -Wall -Wtype-limits -Wsign-compare ccflags-y += -Wextra   gcc中关于 -fstrict-overflow的介绍 https://gcc.gnu.org/onlined

赶路 1461

SAP ERP销售应收&成本科目确定

ERP作为业财一体软件,其中最核心的就是业务与财务模块的自动集成,无需财务进行手工做账,提高工作效率的同时降低人工操作产生的误差。今天浅浅的分享一下SD模块生成会计凭证时,借贷项确定的系统配置。一般项目上借贷项、科目都有FICO提供,但是具体的集成配置是在SD这边。

weixin_43657667的博客 1568

STM32与小米CyberGear微电机的CAN通信协议深度解析

本文深度解析STM32与小米CyberGear微电机的CAN通信协议,涵盖硬件连接、CAN总线配置、通信协议解析及多电机协同控制。重点介绍了基于STM32的电机控制实践,包括运动模式、速度与位置模式设置,以及数据反馈与故障诊断,为机器人及自动化设备开发提供实用指南。

www00的博客 359

已解决SqlServer报错Arithmetic overflow error converting expression to data type int

本文记录(pymssql.OperationalError) (8115, b’Arithmetic overflow error converting expression to data type int.DB-Lib error message 20018, severity 16:\nGeneral SQL Server error: Check messages from the SQL Server\n’)报错解决方法,亲测有效!

努力让自己发光,对的人才能迎着光而来 1万+

Educoder:爬虫实战——求是网周刊文章爬取

第1关:获取新闻url importrequests importre defgeturls(): #**********Begin**********# url='http://www.qstheory.cn/dukan/qs/2014/2019-01/01/c_1123924172.htm' headers={ 'User-Agent':'Mozilla/5.0(Linux;Android6.0;Nexus5Buil...

weixin_46026136的博客 5253

LWN:kernel里进行基于生命周期的资源管理!

关注了就能看到更多这么棒的文章哦~Scope-based resource management for the kernelBy Jonathan CorbetJune 15, 2023DeepL assisted translationhttps://lwn.net/Articles/934679/C 语言不提供那些更加新的语言中的资源管理(resource-management)功能。因此,...

Linux News搬运工 1348

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ifeq makefile 或语句,Makefile ifeq逻辑或

How do you perform a logical OR using make's ifeq operator?e.g., I have (simplified):ifeq ($(GCC_MINOR), 4)CFLAGS += -fno-strict-overflowendififeq ($(GCC_MINOR), 5)CFLAGS += -fno-strict-overflowendifb...

weixin_42303616的博客 528

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

iOS项目集成Unity详细教程

Unity发布到iOS平台得到的是一个Xcode工程,这个Xcode工程可以直接编译运行,但是我们现在已经有个iOS项目了,Unity是作为项目的一部分,所以需要在已有的Xcode工程中集成Unity。环境:Xcode 9 + Unity 2017。Unity导出时设置图形API不要用Metal,因为我发现按我的集成方法使用Metal会崩,不知道什么原因。...

屠龍之技的专栏 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

gcc编译部分编译选项

我只写出一些我没有在文档中查到的,网上也搜索不出来什么明确的资料。正确性实在不敢保证。 https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/Option-Summary.html#Option-Summary 这是文档。 使用gcc命令显示的帮助信息 用法:gcc [选项] 文件... 选项: -pass-exit-codes

JabamiYu的博客 3万+

模块生成过程

模块生成过程 文章目录模块生成过程模块编译过程modpost`read_dump()/write_dump()`导入/导出符号信息`read_symbols()`从ELF文件中读取符号并记录`check_exports()`检查符号与GPL协议匹配情况生成.mod.c文件module-common.lds 先看图: 模块编译过程 首先看一下普通外部模块编译的过程,这里用ldd3的某些驱动来演示,执行下面命令: make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- M

weixin_38878510的博客 1879

GCC编译选项--"-fno-strict-aliasing"

文中的编码方法绝对要禁止用在项目中, 最近用开源的代码时碰到过需要这个选项的警告 这两天编译别的组的代码。编译器是GCC4.1.2,发现使用优化选项O2以上代码执行的结果和使用O1(或不使用优化选项)不一样,使用O1编译出来的代码执行结果是正确的。上网搜索了一下,发现了原因。     代码中有如下语句: float f = j; unsigne

leafmaple的专栏 5982

MySQL编译选项 -fno-strict-aliasing随手记

最近发布的MySQL8.0.2版本中,将gcc的编译选项从--fno-strict-aliasing移除,也就是说打开strict aliasing, 根据worklog #10344 的描述,在单线程的性能测试中,有最多%4的性能提升,还是相当可观的。这个flag在我们内部编译版本中也是一直打开的,但一直不知甚解。本文是网上搜索文档和自己试验的小结。 ...

weixin_34121282的博客 378

GCC strict aliasing – 嫉妒就是承认自己不如别人

GCC strict aliasing – 嫉妒就是承认自己不如别人 GCC strict aliasing – 嫉妒就是承认自己不如别人GCC strict aliasing事情是这样的。我们对tair(淘宝的分布式Key/Value系统)动了一次大手术,更换了网...

286

利用Eclipse搭建Linux内核开发环境

博客原地址 http://blog.csdn.net/aggresss/article/details/76577681 利用Eclipse搭建Linux内核开发环境 正文   时光流逝,记得十年前还是个游手好闲的少年,无聊时觉得应该分析一下Linux内核源码,没有别的动机,只觉得这样很酷。   没有任何项目经验的话,突然眼前出现一个浩大的工程,除了惊叹之余,再无其他

MessiGodLike的博客 651

严格别名规则“-fstrict-aliasing”和“-fno-strict-aliasing”及类型双关

“-fstrict-aliasing”表示启用严格别名规则,“-fno-strict-aliasing”表示禁用严格别名规则,当gcc的编译优化参数为“-O2”、“-O3”和“-Os”时,默认会打开“-fstrict-aliasing”。 什么是严格别名规则?gcc对严格别名的定义: Inparticular,anobjectofonetypeisa...

weixin_33872566的博客 217

解决 LLVM 错误提示 may only occur zero or one times!

使用 LLVM 混淆器添加参数进行编译提示如下错误: clang (LLVM option parsing): for the -bcf option: may only occur zero or one times! 将编译参数全部复制下来,仔细对比发现,有重复的 -DINIT_SCRIPTING_BACKEND=1 -mllvm -bcf -fno-strict-overflow -DI...

十年磨一剑,霜刃未曾试! 1915

MSSQL: Arithmetic overflow error converting expression to data type int

今天 某老板要求提供现在项目的在过去的一年内,每个月的流量统计由于数据的数据量比较的大, 当时每个数据的字段是用int来设计的,  int最大表示的数据是2B。 但是我们的系统每天的数据量大概是20M,一个月就是6B左右。 所以 一开始直接用sum计算的时候就出了问题, 显示 A

php_boy的专栏 6488
上一篇: LWN:PostmarketOS - 给手机和更多设备使用的Linux!
下一篇: LWN:再次尝试vDSO中实现getrandom()!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值