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

Linux内核学习总目录:版本锚定与子系统映射指南 Linux内核是一个持续演进的巨型软件系统,其核心概念如内存管理、进程调度、文件系统等,均随版本迭代发生结构性变化。理解这些机制的前提,是掌握其演进原理与版本适配逻辑——例如slab分配器在SLAB/SLUB/SLQB间的演进,或shrink_slab函数参数从v4.19到v6.1的语义迁移。这种技术价值在于规避因版本错配导致的调试失效,支撑真实场景下的内核模块开发、性能调优与故障定位。本文聚焦构建可信、可验证、可维护的内核知识体系,以版本锚定和子系统映射为双核心,提供面向工程实践的路径组织方法。 阅读详情

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

GCC features to help harden the kernel

By Jonathan Corbet
October 5, 2023
Cauldron
ChatGPT translation
https://lwn.net/Articles/946041/

加固Linux内核是一项无休止的任务,需要在多个方面努力推动。有时,并不需要在内核本身里进行修改,而是通过修改其他工具比如编译器来对加固工作提供重要帮助。在2023年GNU工具大会上,Qing Zhao介绍了GCC编译器在内核加固方面已经完成的工作,以及仍需完成的内容。

她首先提到,Kernel Self Protection Projection project 是许多内核加固工作的主要集中地。加固可以通过多种方式实现,包括修复已知的安全漏洞,这些漏洞可以通过静态检查器、模糊测试或代码检查来发现。不过,修复漏洞是一个永无止境的任务;如果可能的话,更好的方法是彻底消除某一整个类别的漏洞。因此,内核中的许多工作集中在消除诸如堆栈溢出、整数溢出、格式字符串注入、指针泄漏、使用未初始化变量、释放后继续使用等问题。

她表示,GCC 11(2021年4月)版本包括了函数返回时对函数使用的寄存器进行清零的能力,这有助于防止信息泄漏。现在这是默认开启的。相比之下,GCC 12(2022年5月)添加了栈变量的自动初始化;这也已经在内核构建选项中默认开启。GCC 13(2023年4月)增加了对灵活数组成员的更严格的处理。

Zhao简要提到了内核社区希望在未来的编译器版本中看到的一些功能,包括更好的支持灵活数组检查、减少-warray-bounds选项导致的假阳性警告、更好的整数溢出检查、支持控制流完整性检查等等。

回到灵活数组,Zhao指出,内核中的越界数组访问是一个主要的漏洞来源。这些问题可以通过边界检查来防止,如果已知所访问的数组的大小的话。对于固定数组,大小在编译时是已知的,因此可以在编译时(如果可能)或在运行时进行数组访问检查。然而,对于动态大小数组来说,问题更加复杂。在C语言中,这些数组采用两种形式:可变长度数组,或者结构体中的灵活数组成员;目前内核只使用了后者。

灵活数组成员是嵌入在结构体中作为最后一个元素的数组。它通常被声明为元素数量为零或一(尽管后者往往是一个常见的漏洞来源),或者只是写作 array[] 。在分配结构体实例的空间时,必须将其大小调整到足够大,从而可以容纳实际的数组,因为数组的长度将在不同实例中也不一样。

在GCC 12中,无论数组声明的size多大,所有被定义为结构体的最后成员的数组都被视为是灵活数组。因此,哪怕是这样写的数组也是一样:

struct foo {
    int int_field;
    int array[10];
};

编译器也会认为它的大小是可变的,即使开发人员的本意可能并非如此;因此,对这些数组的访问不会执行边界检查。在GCC 13中,`-fstrict-flex-arrays`选项允许控制哪些数组被视为灵活数组;LWN https://lwn.net/Articles/908817/ 提供了它的工作原理概述。结果是,边界检查可以更容易地应用于本来不打算改变大小的数组。

不过,仍然存在一些问题;Zhao提到了一个包含了灵活数组成员的结构体嵌套到另一种结构体类型中的情况:

struct s1 {
    int flex_array[0];
};

struct s2 {
    type_t some_field;
    struct s1 flex_struct;
}

即使灵活结构体是结构体的最后成员(如上面的`s2`),GCC版本小于14的版本也会错误地将数组视为固定的。Zhao已经为这个特定问题提供了fix。当灵活结构体不是包含结构的最后字段时,会出现另一个问题。在这种情况下,不确定编译器应该做什么,GCC之前会直接接受这种结构。新的`-Wflex-array-member-not-at-end`选项将对这样的代码发出警告。

联合体(Union)中的灵活数组成员又是另一个问题;GCC会接受声明为`array[0]`的成员,但不接受`array[]`(合法)的形式。这使得在最严格的-fstrict-flex-array模式下编译包含这样成员的联合体就变成不可能的任务了。只包含灵活数组成员的联合体会引发另一个问题:它们最终可能成为一个零长度的对象,这不是C标准允许的。目前通过添加一个固定长度成员来解决这个问题;未来可能会尝试允许完全灵活的联合体作为GCC的扩展。

灵活数组的使用目前会干扰边界检查,但是在运行时,任何特定数组的实际长度是已知的(或者至少应该是已知的)。如果可以将这个大小传达给编译器,那么边界检查就可以被添加上来了。有两种潜在的声明这些信息的方式;一种是在类型本身内嵌它:

struct foo {
    size_t len;
    char array[.len*4];
};

这种语法允许使用表达式(在本例中是"len字段的值的四倍")。她表示,这是更清晰的做法,但它有可能会改变数组的维度,从而破坏现有代码的ABI,因此更难被采纳,而且这种语法的改变肯定需要经过大量的讨论才能被接受。

另一种选择是在灵活数组成员上添加一个属性。这可以保持现有的ABI,更容易采纳,也可以扩展到其他类型(例如指针)。不过,它更难扩展到更复杂的表达式。GCC 14已经添加了没有表达式支持的`counted_by()`属性;它目前只能引用同一结构体中的另一个字段。

struct foo {
    size_t len;
    char array[] __counted_by(len);
};

在这种情况下,`len`字段只能用于直接确定`array`的size,不允许使用表达式。这个属性目前仅适用于灵活数组本身的size;未来的工作可能会使它达到更进一步的程度,例如在结构体的分配size不足以容纳数组时给出warning。

目前还有一些讨论,希望将这种检查扩展到指针值;苹果提出了一个更复杂的`-fbounds-safety`标志的提案(适用于LLVM),实现了这个想法。它是现有`counted_by()`行为的一个超集;如果得到认可,将更费力来实现和采纳,但以后会考虑它。

边界检查只有在检查是正确的情况下才有用,不过有一个问题是存在假阳性warning。具体来说,使用jump threading方式进行优化的代码可能会产生假阳性警告。其中一些问题已在GCC 13中得到解决,另一些问题仍未解决。这个问题阻止了在内核构建中默认启用-Warray-bounds选项。人们已经有了一些关于如何标记已使用jump threading的代码和初步想法,可以消除由此产生的warning。

还有一个完全不同的问题是整数溢出(overflow)检测。在C标准中,对于无符号整数值是有定义overflow的,但对于有符号值和指针则没有定义。对于未定义的情况,GCC提供了选项,可以定义在检测到溢出时的期望的行为。然而,对于无符号溢出的情况,由于行为是明确定义的,所以没有相关选项。但无符号溢出通常是无意出现的,也是值得检测的。也许需要一个新的选项来允许在这种情况下进行检测。

至于有符号溢出,她指出,-fwrapv选项就可以让行为明确定义下来;在溢出时,变量将发生回绕(wrap around)。但是,尽管内核需要在大多数情况下捕获溢出,但偶尔也需要允许。Florian Weimer指出,现在有一个内置机制可以用来禁用特定操作的检查;Zhao表示她会研究一下。

这时时间不多了,Zhao无法继续讨论控制流完整性相关选项。但这个讨论使得情况很清楚了,人们已经付出了相当多的工作来改进GCC,使其能够有助于内核加固(当然还有对其他程序的加固)。但就像许多其他工作一样,保护内核免受攻击者的攻击似乎永无止境。在可预见的将来,编译器和内核开发人员将有很多工作要做。

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

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

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

format,png

【信息科学与工程学】【产品体系】第三十三篇 DPU/smartinic芯片中的学科知识03 需求实现DMA 与流边界检测优化​分级超时状态机(短/中/长)+ 积压计数 + 批量触发DMA 控制器优化​描述符预取(深度 4)+ 中断合并(阈值 8)Fence 语义正确性验证​RTL 断言 + C 语言序列号检测 + 性能对比 + 硬件计数器所有代码均为可综合 Verilog,已在仿真器中通过基本功能测试。在 FPGA 原型上运行上述 RTL,配合 ChipScope 观察 fence 时序在 BlueField-3 上运行 DOCA DPA 测试程序,对比加/不加 fence 的结果。 阅读详情

相关推荐

ASP.NET Core Identity + Mysql(实战一)——注册登陆

在进行实战之前,我们先来了解一下Identity。 ASP.NET Core Identity是用于构建ASP.NET Core Web应用程序的成员资格系统,包括成员资格、登录和用户数据存储。简单的来讲包括: 1.用户数据存储(使用任意你喜欢的关系型数据库,从sqllite到mysql、sqlserver等等,由Entity Framwork 支持) 2.登陆、注册外加身份认证(基于coo...

weixin_40359716的博客 1398

LWN:6.5内核的开发数据统计!

关注了就能看到更多这么棒的文章哦~Development statistics for the 6.5 kernelBy Jonathan CorbetAugust 28, 2023ChatGPT assisted translationhttps://lwn.net/Articles/941675/Linux 内核 6.5 版本于 8 月 27 日发布,经过了九周的开发周期。在此期间,有 13,...

Linux News搬运工 958

cadence数模混合仿真反标sdf

数模混合IC设计时经常要调用一些Verilog模块(最简单的例如SPI接口),在前仿时一般直接用rtl代码来仿真,但是后仿时要关注因寄生带来的延迟,避免这些额外的延迟导致时序错误,因此不能简单地采用RTL来仿真。 一般有两种办法:1是采用由RTL综合得到的门级电路来仿真,这种方法比较简单,但是缺点是规模较大,而且只包括门延迟不包括因版图导致的线延迟;如果想要仿真更精细,就要对该这部分门电路提取寄生参数; 另一种方式是利用sdf文件(standard delay format)来进行仿真。后端工具在布局布

长河柱天的博客 7273

linux内核设计模式

原文来自:http://lwn.net/Articles/336224/ 选择感兴趣内容简单翻译了下:  在内核社区一直以来的兴趣是保证质量.我们需要保证和改善质量是显而易见的.但是如何做到却不是那么简单.一个广泛的办法是找到一些成功之处来增加内核在多方面的透明性.这将使得这些方面的质量变得更加明朗,因此将改变内核质量. 采用多种形式增加透明性: checkpatch.pl脚本突出显示...

weixin_33966095的博客 181

什么是三极管推挽电路

当没有信号输入时,电源通过PNP三极管EB间的二极管,然后通过NPN三极管BE间而二极管到地,这时这两个三极管都是导通的,三极管很容易由于电流过大而损坏。当输入信号为VCC时,上面的三极管导通,下面的三极管截止,输出信号为VCC-0.7V,这个0.7V就是上面NPN三极管BE间的导通压降。比如上面的三极管导通,那么输出电压就是输入电压减去0.7V,所以下面的PNP三极管由于基极电压大于发射极电压,是不会导通的。这是一个三极管推挽电路,上面是一个NPN的三极管,下面是一个PNP的三极管。

谢谢关注“小鱼教你模数电”,各平台同号 3368

【IC】Redhawk-SC输入件配置

Redhawk sc

u011808788的博客 1776

LWN:简单又高效!利用bpftrace分析kernel行为

点击上方蓝色字关注我们~Kernel analysis with bpftraceJuly 18, 2019本文由Brendan Gregg 提供在2019 Linux...

Linux News搬运工 2477

vasp-自旋轨道耦合(SOC)计算步骤

在VASP中执行自旋轨道耦合(SOC)计算,具体的计算步骤如下: 结构优化获取CONTCAR文件 自洽计算(collinear normal VASP calculations)获取IBZKPT,CHGCAR和WAVECAR文件。 SCF+SOC计算,在此步骤中,将步骤2中的IBZKPT复制为KPOINTS,以便两个步骤具有相同的k网格,因此可以读取步骤2中的CHGCAR和WAVECAR文件。 能带结构计算,在此步骤中,将KPOINTS改为高对称点,读取步骤3中的CHGCAR和WAVECAR文件。

懒散的鱼与消失的猫 3万+

[lwn]Porting device drivers to the 2.6 kernel

Porting device drivers to the 2.6 kernel [Posted February 11, 2003 by corbet] http://lwn.net/Articles/driver-porting/ The 2.6 kernel contains a long list of changes which affect device

smile 729

Python与.NET革命性互操作:PythonNet实现零门槛双向调用——深度解析与实战案例

跨语言调用实战指南:Python与.NET深度集成 摘要:本文详解Python与.NET双向互调技术,通过PythonNet和Python.Runtime实现高效跨语言协作。核心优势包括:无缝集成Python机器学习模块(如PaddleOCR)与.NET UI框架,内存直传提升90%数据效率,减少80%重复代码。内容涵盖:1)Python调用.NET类库的完整流程;2)C#动态加载Python脚本及环境配置要点;3)反射机制实现私有方法调用与泛型处理;4)性能优化技巧(类型缓存、NumPy数组转换);5)异

墨夶的博客 611

基于Termux的Android平台OpenClaw部署:移动端AI助理实现

本文介绍了在Android设备上通过Termux部署OpenClaw AI助理的方案。Android设备的便携性、Termux提供的完整Linux环境以及多样化的硬件配置使其成为理想的部署平台。文章详细分析了不同级别Android设备的硬件规格(从入门级到旗舰级),并提供了最低/推荐配置要求。部署步骤包括Termux安装初始化、Python环境配置以及性能优化建议。该方案充分利用Android设备的传感器和电池供电优势,为移动办公、学习等场景提供了低成本、高便携性的AI助理解决方案。

博客 3010

LWN: 改进Linux kernel的工作流程!

Next steps for kernel workflow improvementByJonathan CorbetNovember 1, 2019OSS EU原文来...

Linux News搬运工 569

【UNet 改进 | 注意机制篇】UNet引入CA注意力机制(2021 CVPR),二次创新

在医学图像分割任务中,病灶区域往往形态各异、边界模糊,且经常与周围组织的对比度较低,这要求模型具备极强的特征提取和细节辨别能力。传统的U-Net网络虽然通过跳跃连接融合了多尺度特征,但在处理复杂语义和精细边缘时仍有不足,尤其是在捕获特征时常常忽略位置信息。为了解决这些痛点,本文引入了在计算机视觉领域表现出色的 CA(Coordinate Attention,协调注意力)机制。CA 巧妙地将位置信息嵌入到了通道注意力中,通过水平和垂直两个方向的一维池化,同时捕获长距离依赖和精确的位置坐标。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 183

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

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

Linux News搬运工 1002

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

关注了就能看到更多这么棒的文章哦~Two security improvements for GCCBy Jonathan CorbetSeptember 24, 2021LPCDeepL...

Linux News搬运工 469

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Linux内核6.x版本构建与优化全指南

Linux内核作为操作系统的核心组件,其构建过程涉及工具链配置、源码编译和系统集成等关键技术环节。通过合理配置构建环境,开发者可以针对不同硬件架构进行内核优化,显著提升系统性能。在嵌入式开发和云计算场景中,内核定制尤为重要,需要掌握交叉编译和模块化构建等进阶技巧。本文以Linux 6.x版本为例,详细解析从环境准备到编译优化的全流程,特别介绍了如何利用多核并行编译加速构建过程,以及通过GRUB引导加载器管理多内核版本。针对常见问题如头文件缺失、模块签名错误等提供了实用解决方案,并分享了性能调优和安全加固的生

weixin_33744854的博客 400

Low-Level Programming University 底层程序员路线图:从汇编、C 语言到 Linux 内核的完整学习指南

本文以开源项目 Low-Level Programming University 的官方文档为核心,系统梳理一条从零起步、最终成长为底层程序员(low-level programmer)与 Linux 内核工程师的学习路线。该路线图覆盖两条理论基石(计算机体系结构与操作系统)、三门核心语言(汇编、C、Rust)、三大应用方向(硬件与固件、Linux 内核与设备驱动、其他底层应用),并给出按顺序可执

gitblog_00160的博客 795

Linux系统编程入门:从基础到实践

Linux系统编程是深入操作系统底层的核心技术,涉及系统调用、进程管理和文件操作等基础概念。通过直接与内核交互,开发者能够高效控制硬件资源和系统功能,这在开发高性能服务器、嵌入式系统等场景中尤为重要。文章以文件复制工具为例,展示了如何使用open()、read()和write()等系统调用实现基础功能,同时强调了错误处理和内存管理的重要性。对于想要提升系统级编程能力的开发者,理解这些原理并掌握GCC、GDB等工具链的使用是必经之路。

weixin_34279246的博客 380

Linux操作系统发展历程与核心技术解析

Linux作为开源操作系统的代表,采用模块化内核设计,支持多任务处理和虚拟内存管理等核心功能。其技术架构包含进程管理、内存管理和文件系统等关键子系统,通过GPL许可证保障了开源自由。Linux在服务器、嵌入式系统和云计算领域广泛应用,特别是在容器化和云原生技术中发挥重要作用。随着物联网和人工智能的发展,Linux持续优化实时性和资源管理能力,成为现代IT基础设施的基石。

dianzongfan5428的博客 339

从0到1:5分钟本地跑起The Delegation 3D AI办公室的完整指南

The Delegation 是一款免代码(no-code)的 3D AI 办公室实验场,让 AI 爱好者、教育工作者和创意开发者无需写一行代码,就能在一个"活"的 3D 办公室里探索、设计并交互 Agentic AI(智能体)系统:由 LLM 驱动的角色会在共享的虚拟工作区里自主协作——它们自主导航到工位坐下、干活、互相讨论,而你只需通过节点式编辑器和看板界面来指挥整个 AI 团队。 [![T

gitblog_01091的博客 493

LWN:统一kernel tracing处理!

Unifying kernel tracingByJake EdgeOctober 30, 2019OSS EU本文译自:https://lwn.net/Article...

Linux News搬运工 1926

四路 CAN 转 4G 网关

SG‑CAN‑4G‑410 为**四路隔离 CAN 转 4G 工业网关**,把 CAN2.0A/B 报文封装成 TCP/UDP 报文,通过 4G 无线网络实现 CAN 总线远程监控、远程控制。四路 CAN 相互独立;以太网仅用于本地配置,不做业务数据传输;支持移动 / 联通 / 电信 4G 网络。

S2003120416的博客 160

【计算机网络】断点续传是怎么做到的:从 Range 请求到分片上传的完整机制

断点续传在下载侧靠的是 HTTP 现成的 Range 协议,Content-Range 保证偏移对得上,If-Range 防止文件变更导致的错误拼接;上传侧没有标准,需要自己设计 init/part/complete 三段式交互,核心是让服务端记住“哪些块已经收下”,从而把失败粒度从整个文件降到单个分片。 这套机制可以迁移到任何长耗时操作的设计上。判断方法很简单:先问失败粒度是多少。如果一次操作失败就得从头再来,那它迟早会在生产环境里出问题——传输、批量导入、数据迁移、长事务,都是同一个道理。把大操作切成

2503_94545876的博客 515

汽车电子标定与测量的核心基石XCP协议

控制逻辑(算法)与标定参数(数据)。如果每次优化参数都要修改源码、重新编译并刷写Flash,整个研发周期的效率将趋近于零。标定(Calibration)技术正是为了解决这一痛点而生。它允许工程师在ECU运行过程中,动态观察内部变量(测量,Measurement),并在不中断运行的前提下实时修改控制变量(标定,Calibration)。在这一领域,XCP(Universal Measurement and Calibration Protocol,通用测量与标定协议)是公认的行业标准与核心基石。

diansandaosilaodanan的博客 375

Linux 服务器性能排查手册(2026):CPU、内存、磁盘IO、网络四大瓶颈定位

iptables 四表五链模型、firewalld zone 信任级别、云安全组与主机防火墙的关系与优先级,避坑改了防火墙把自己挡在服务器外面的翻车事故。

2502_91473995的博客 287

SD-WAN 与传统企业组网方式有什么区别?六个维度分析技术差异与适用场景

SD-WAN 与传统组网区别,主要体现在网络管理模式、链路调度能力、可视化水平以及多站点扩展方式上。传统组网技术成熟、架构灵活,对于站点较少、业务简单、网络结构稳定的企业来说,仍然具有较高的实用价值。SD-WAN 则通过软件定义和集中化管理,为多站点网络管理、链路质量监测和业务流量调度提供了另一种技术实现方式。两者并不存在绝对的替代关系。在实际网络建设中,也可以根据不同业务和网络区域采用混合架构。

ESDWAN的博客 791
上一篇: LWN:针对有验证功能的目标平台进行编译!
下一篇: LWN:多精度时间戳的再思考!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值