LWN:GCC 中两个安全相关的改进!

Supervisor 安装与使用 一、Supervisor 介绍 Supervisor 是一个用 Python 编写的进程管理工具,它可以用于监控和控制类 UNIX 操作系统上的多个进程。它是一个客户端/服务器系统,其中 Supervisor 的服务器端称为 supervisord,负责启动管理的子进程、响应客户端命令、重启崩溃或退出的子进程、记录子进程的 stdout 和 stderr 输出,以及处理子进程生命周期中的事件。客... 阅读详情

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

Two security improvements for GCC

By Jonathan Corbet
September 24, 2021
LPC
DeepL assisted translation
https://lwn.net/Articles/870045/

人们常说 GCC 和 LLVM 编译器之间的竞争对它们两者来说都是好事。竞争出现在多个方面,其中之一就是 security 功能上。如果一个编译器增加了某种加固程序(harden programs)的方法,那另一个编译器可能就会效仿。在 2021 年的 Linux Plumbers 会议上,Qing Zhao 讲述了 GCC 是如何在两个安全相关的功能上成功追赶上来的故事,这也是内核社区特别感兴趣的两个功能。

Call-used register wiping

Zhao 先列举了内核开发者一直要求具备的 security feature 列表,她指出 LLVM Clang 编译器已经具备了其中一些功能,但 GCC 尚未具备。她一直在努力来填补这一空白,首先是被称为 "call-used register wiping(将函数调用过程中使用到的寄存器擦除掉)" 的功能,也就是在函数返回之前清除掉此函数中所使用过的寄存器的内容。人们出于多个原因会希望在编译器中增加这一功能。

a2678190dac0ad2e02f5bdc8bb4de2f7.png

第一个原因是希望挫败那些针对返回值编程(ROP,return-oriented programming)攻击方式,公开漏洞之中经常可以看到这类攻击。ROP 攻击的工作原理是将一组 "gadgets,小工具"(用来执行一些对攻击者有用处的代码片段)连在一起(chain together),然后再返回。如果攻击者能在堆栈上放置好精心准备的一系列 "return address,返回地址",他们就能把这一系列的 gadget 代码串起来,使得内核会去做他们想要做到的事情。

ROP 攻击通常来说最终总是要调用其他内核函数来执行其任务的,被调用的函数会依赖处理器的寄存器中存放的参数。因此,要想使 ROP 攻击奏效,就需要将精心设计的数值预先放入这些寄存器,这样以来只要在每个函数返回时清除掉寄存器可以非常有效地挫败这类攻击。它会打破攻击者试图组装起来的 gadget 链路。

当然,在返回时清除寄存器的另一个原因是为了防止信息泄露。我们经常低估了攻击者能从 CPU 寄存器中留下的数据中了解到什么信息。

因此,清除寄存器是件好事,但这里仍有一个问题,也就是哪些寄存器需要被清除。如果目标是阻止 ROP 攻击,那么只清除用于存放函数参数的寄存器就足够了。相反,为了防止信息泄露,就需要清除掉所有被使用到的寄存器。还有一个相关问题,那就是寄存器应该被清零,还是应该设置为随机值。对于 GCC 来说,归零被认为是最安全的选择,因为 0 值是最不可能是对其他代码来说有意义的一个值。这也就引出了一个更小、更快的实现方式。

这个功能在 GCC 11 版本中已经带有了,由 -fzero-call-used-regs= 这个编译器选项来控制,有许多可选值来控制哪些寄存器应该被清除。还有一个新的函数属性(zero_call_used_regs),可以用来控制清除特定函数的寄存器。其实现方式是增加一个新的编译器步骤(a new compiler pass),它会查看所有的 exit 代码块,找到每个返回指令,计算出所要清除的寄存器集合(也就需要跟踪记录有哪些寄存器被实际使用了),并生成真正进行清除工作的指令。这个功能起初支持了 x86 和 Arm64 架构,SPARC 是在稍后加入的。

在 5.15 版本的 kernel 中已经包含了在用 GCC 编译时支持对寄存器进行清零。根据 changelog 中的说法,它将原先可以用于内核攻击中的 ROP gadget 数量减少了大约 20%。

Stack variable initialization

C 语言中一个著名规则是 automatic variable(位于 stack 中的变量)是不会被编译器初始化的。如果代码在给它赋值之前使用了这样的变量,那么它用到的很可能是一些随机垃圾数据,这就会导致各种问题。有可能出现错误的运算结果,但也有更糟糕的情况:如果攻击者能够找到一种方法将某个数值放在 automatic variable 会在 stack 中出现的位置上,那攻击者就可以攻破系统了;如果将某个未初始化的变量用来作为 lock,那么就可能会出现无法避免的 race condition。这些错误都需要极力避免。

有一些工具可以尝试着检测出这种使用到未初始化的 stack variable 的情况。例如,GCC 和 Clang 都支持 -Wuninitialized 选项,会在编译时给出 warning。这两个编译器还有一个 -fsanitize= 选项,可以在代码运行时使用这类变量的时候检测出来。除了编译器之外,还有像 Valgrind 这样的工具也可以用来发现使用未初始化变量的情况。

Zhao 认为这些工具虽然有用,但也都有局限性。静态工具(也就是 compile-time tool)只能在单个函数中进行分析,这就可能需要对其他函数的行为做出一些假设。它们在检测未初始化的数组元素或通过指针访问的值是否初始化过的时候,能力很有限。因此它们会漏掉一些问题,同时也无法去除代码中不可能走到的路径,从而产生误报 warning。动态工具(也就是 run-time tool)工具则不能覆盖所有的路径,所以它们会出现遗漏的情况,同时它们也会带来大量的 run-time 开销。

从即将发布的 GCC 12 开始,-ftrivial-auto-var-init= 这个选项将控制 stack 中变量的自动初始化。它的默认值是 uninitialized,也就是保持之前版本的行为。如果它被设置为 pattern,变量就会被初始化为一些可能导致程序 crash 的值,这个选项是给调试用的。而将其设置为 zero 的话则是直接将所有 stack 中的变量都初始化为零,这个选项是为了对生产代码进行加固。还有一个新增的变量属性 uninitialized,用来标记那些故意不初始化的变量。

不管这个新选项配置成什么值,只要设置了 -Wuninitialized,编译器就仍然会发出 warning。毕竟这个选项的目标不是为了导致 "语言分叉出新的变种",而是为了增加安全级别来提供额外保护,所以未能正确初始化变量的代码仍然应该被 fix。这项工作已经在 9 月初提交到 GCC 主线代码中,还有一些需要修复的 bug,应该很快就会解决完毕。

Zhao 没有谈到内核中对这个功能的支持情况。不过,Clang 在之前一段时间就已经支持了这个选项,内核直接可以利用这个功能了,所以一旦 GCC 具备了相关支持,那就应该可以直接用起来。这应该有助于阻止一大类 bug,同时可能意味着现在内核支持的 GCC 插件 structleak 可以结束生命周期了。虽然这些功能的开发工作都是由内核的 wish list 来驱动的,但它们应该远远不只是会对内核有用。

本讲座的视频可以在 YouTube 上找到。

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

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

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

2487cc40ddca71e87531e78e07569712.png

YOLOv11改进 - 卷积Conv | SPD-Conv空间深度转换卷积优化空间信息编码,攻克小目标检测难题 本文介绍了一种名为SPD-Conv的新型CNN构建块及其在YOLOv11中的结合。传统CNN在处理低分辨率图像或小物体时,因使用步长卷积和池化层导致细粒度信息丢失、性能下降。SPD-Conv由空间到深度(SPD)层和非步长卷积(Conv)层组成,完全消除卷积步长和池化层,避免信息损失。SPD层重排特征图元素将空间信息转换到深度维度,非步长卷积层进一步处理特征图。我们将SPD-Conv集成进YOLOv11,实验证明其在低分辨率图像和小物体检测任务上显著优于现有模型。 阅读详情

相关推荐

自动驾驶中的多传感器融合实战:用卡尔曼滤波搞定毫米波雷达与摄像头航迹对齐

本文深入探讨了自动驾驶中多传感器融合的实战技术,重点介绍了如何使用卡尔曼滤波实现毫米波雷达与摄像头的航迹对齐。通过分析传感器特性差异、时空同步挑战及工程化实现步骤,提供了包括状态向量定义、观测矩阵设计和故障检测机制在内的完整解决方案,最终实现0.15米以内的高精度航迹对齐。

weixin_28728495的博客 410

Android R定制项目后编译失败,提示“clang++: error: unknown argument: ‘-ftrivial-auto-var-init=zero‘“

拿到高通的release代码之后,编译平台项目通过。但是根据平台项目去定制项目时编译遇到以下错误: [ 63% 49501/77678] target C++: libcamxgenerated <= out/target/product/sc161/obj/STATIC_LIBRARIES/libcamxgenerated_intermediates/generated/g_pars FAILED: out/target/product/sc161/obj/STATIC_LIBRARIES/lib

sunnywalden 4678

如何使用Calibre PERC抽出 点到点/p2p 电阻

@[TOC](如何使用Calibre PERC抽点到点(p2p)电阻) 一、前言 需要实现的功能是从gds中抽出net的点到点的电阻。如下图这样。 二、准备工作 lvs rule pex rule(必要时可以自己定义RC rule) gds p2p点的坐标 定义prode.defs 因为p2p的点是变化的,所以每次prode定义都要重新出,对应的perc rule也是根据每个p2p点的定义来的,perc rule也是每次都要重新出。如果需要可以写一个脚本自动出这些定义文件。 PROBE_POINTS

kobayashiyou的博客 1万+

编译安装 NV GPU 最新的开源 driver 时遇错 error: unrecognized command-line option ‘-ftrivial-auto-var-init=zero’

如果在编译安装 NV GPU 最新的开源 driver 时遇错 error: unrecognized command-line option ‘-ftrivial-auto-var-init=zero’那么,先执行 gcc --version 看看 gcc 的版本。应该是<=11有一说一,编译器选项 -ftrivial-auto-var-init=<value> 是 gcc-12 从clang借鉴过来的。先看clang中的解释,在 clang --help 中可以看到:-ftrivial-auto-var

eloudy的专栏 2228

DEM边界数值爆炸?用ArcGIS空间分析工具链搞定异常值过滤全流程

本文针对DEM数据处理中常见的边界数值爆炸问题,提供了一套完整的ArcGIS空间分析解决方案。文章深入剖析了异常值产生的根源,并详细介绍了从诊断、定位到使用栅格计算器、重分类等工具进行精准过滤与修复的全流程工作流,帮助用户彻底解决由插值误差、数据拼接及坐标系转换引发的数值异常。

weixin_29269441的博客 148

Ubuntu技巧-Ubuntu远程访问之SSH反向代理

💡大家好,我是可夫小子,《小白玩转ChatGPT》专栏作者,关注AIGC、互联网和自媒体。要把内网的一台的Ubuntu服务器让外面也能访问,总共有三种可行的方案,前面已经介绍了两种方式,今天就来介绍更健壮稳定的方式——ssh反向代理。大概的框架图如下,今天就从服务器购买到设置,手把手的教程,让你花费100块以内,就拥有一个强大的「云服务器」。

可夫小子的频道 1151

安装Nvidia驱动出现 cc: error: unrecognized command-line option ‘-ftrivial-auto-var-init=zero’

安装Nvidia驱动出现 cc: error: unrecognized command-line option ‘-ftrivial-auto-var-init=zero’报错:cc: error: unrecognized command-line option ‘-ftrivial-auto-var-init=zero’需要 gcc-12 才能正确编译。

weixin_40293999的博客 3337

别再被SpringerLink虐了!手把手教你搞定LaTeX源文件提交(附正确文件顺序和类型选择)

本文详细解析了SpringerLink投稿系统中LaTeX源文件提交的常见问题与解决方案,包括文件打包、类型选择和顺序排列等关键步骤。通过实战经验,帮助科研人员避开隐形陷阱,一次性完成LaTeX提交,提升投稿效率。特别针对`.bst`和`.cls`文件的正确处理提供了专业指导。

weixin_42522964的博客 444

安装Nvidia驱动出现报错 cc: error: unrecognized command-line option ‘-ftrivial-auto-var-init=zero’解决

安装Nvidia驱动出现报错 cc: error: unrecognized command-line option ‘-ftrivial-auto-var-init=zero’解决

人工智能(AI)技术,大模型技术,深度学习,机器学习,计算机视觉,AI工具实践应用等分享 2354

几种常见的Web攻击

几种常见的Web攻击 文章目录几种常见的Web攻击一、DoS攻击1.SYN洪水攻击2.IP欺骗3.Land攻击4.针对DoS攻击的防御二、CSRF攻击1. CSRF攻击的发生有三个必要条件:2.几种防护方法:三、XSS漏洞攻击1.非持久型XSS漏洞2.持久型XSS漏洞四、SQL注入1.SQL注入的危害2.SQL注入的方式3.防止SQL注入的解决方案 一、DoS攻击 DoS(Denial of Service),拒绝服务,顾名思义这种攻击是为了让服务器无法提供正常服务,最常见的DoS攻击是网络带宽攻击和连

wolfGuiDao的博客 1259

Python爬虫实战:抓取统计数据并生成年度对比图表详解

国家统计局网站(静态HTML页面Excel文件JSON接口(部分新版API)我们将重点演示从统计公报页面抓取数据,结合解析Excel文件,实现多种数据格式爬取处理。本文从零开始搭建了一个爬取国家统计数据并制作年度对比图表的完整流程。读者可以根据实际需求调整爬取目标,丰富数据分析维度,甚至结合机器学习模型预测未来趋势。欢迎你在评论区留言分享你的爬虫实践,或提出改进建议!

2201_76125261的博客 1000

LWN:5.15 合并周期后半部分!

关注了就能看到更多这么棒的文章哦~The rest of the 5.15 merge windowBy Jonathan CorbetSeptember 13, 2021DeepL as...

Linux News搬运工 448

已解决“TimeouEror [WinEror 10060由于连接方在一段时间后没有正确答复 或连接的主机没有反应,连接尝试失败“,亲测有效!!!

已解决"TimeouEror [WinEror 10060由于连接方在一段时间后没有正确答复 或连接的主机没有反应,连接尝试失败",亲测有效!!!

wbajsjhhhhh的博客 1万+

LWN: 改进GCC的 -fanalyzer 选项!

关注了就能看到更多这么棒的文章哦~Improvements to GCC's -fanalyzer optionBy Jonathan CorbetSeptember 23, 2021LP...

Linux News搬运工 649

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LWN:GCC诊断信息近期改进!

关注了就能看到更多这么棒的文章哦~Recent improvements in GCC diagnosticsBy Jonathan CorbetOctober 13, 2023CauldronChatGPT translationhttps://lwn.net/Articles/946733/编译器的主要任务是将源代码转换成计算机可运行的二进制形式。然而,开发人员对于他们的工具,包括编译器,会有...

Linux News搬运工 715

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LWN:Rust 与 GCC 的两个开发方案!

关注了就能看到更多这么棒的文章哦~Rust and GCC, two different waysBy Jonathan CorbetOctober 4, 2021LPCDeepL ass...

Linux News搬运工 1437

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

LWN: kernel中GCC plugin的未来命运!

关注了就能看到更多这么棒的文章哦~The future of GCC plugins in the kernelApril 1, 2021This article was contribu...

Linux News搬运工 1002

LWN:GCC BPF 支持的进展!

然而,朝着这个目标前进的过程中,发现了一些 Clang 支持 BPF 的问题,需要进行长时间的讨论,以便为这两个项目找到前进的道路。目前,Ihor Solodrai 维护着 bpf-next 树的持续集成测试(他稍后在会议期间对此进行了介绍),该测试会测试每个提交的补丁,以确保验证器接受的内容没有退化。Song 说,这种 Clang 行为既是故意的,也是 BPF 特定的;他们说,如果外部结构是 CO-RE 可重定位的,那么从逻辑上讲,内部结构也应该是 CO-RE 可重定位的,无论它是如何进入该结构的。

Linux News搬运工 1600

LWN:有助于内核加固的GCC功能!

关注了就能看到更多这么棒的文章哦~GCC features to help harden the kernelBy Jonathan CorbetOctober 5, 2023CauldronChatGPT translationhttps://lwn.net/Articles/946041/加固Linux内核是一项无休止的任务,需要在多个方面努力推动。有时,并不需要在内核本身里进行修改,而是通过...

Linux News搬运工 782

LWN:GCC也支持BPF了!

关注了就能看到更多这么棒的文章哦~BPF in GCCBy Jake EdgeSeptember 15, 2020LPC原文来自:https://lwn.net/Articles/831...

Linux News搬运工 1198

LWN:对2024所做预测的回顾!

关注了就能看到更多这么棒的文章哦~A 2024 retrospectiveBy Jonathan CorbetDecember 25, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/1002368/通常人们说的疯狂(insanity),就是重复同样的行为却期待不同的结果。尽管如此,LWN 每年年初都会进行一组预测,然后在年末不得不...

Linux News搬运工 955

LWN:在GCC和glibc里支持 CHERI 的 capability!

关注了就能看到更多这么棒的文章哦~Supporting CHERI capabilities in GCC and glibcBy Jonathan CorbetSeptember 26, 2022CauldronDeepL assisted translationhttps://lwn.net/Articles/909265/CHERI 架构来自于一个研究计划,希望能对普通的 CPU 架构进行扩...

Linux News搬运工 526

LWN: 对比GCC和Clang的安全功能

点击上方蓝色“Linux News搬运工”关注我们~Comparing GCC and Clang security featuresByJonathan Corbet...

Linux News搬运工 918

LWN:深入讨论GCC Rust前端!

关注了就能看到更多这么棒的文章哦~A deeper look into the GCC Rust front-endBy Jonathan CorbetOctober 10, 2022CauldronDeepL assisted translationhttps://lwn.net/Articles/909887/Philip Herron 和 Arthur Cohen 在 2022 年的 Kan...

Linux News搬运工 971

LWN:使用GCC编译生成BPF程序

点击上方蓝色“Linux News搬运工”关注我们~ Compiling to BPF with GCC ByJonathan Corbet LPC 自从在kern...

Linux News搬运工 1557

LWN:BPF与安全!

关注了就能看到更多这么棒的文章哦~BPF and securityBy Jake EdgeOctober 4, 2023LSSEUChatGPT translationhttps://lwn.net/Articles/946389/eBPF内核虚拟机即将迎来其加入Linux十周年,它已经发展成为生态系统中多种用途的工具。eBPF的创始人,也是其早期开发的主要负责人Alexei Starovoito...

Linux News搬运工 1077
上一篇: LWN: 改进GCC的 -fanalyzer 选项!
下一篇: LWN: 对 BPF 所拥有的超能力进行限制!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值