LWN:细粒度的KASLR(内核地址空间随机变化)!

Linux平台的ASLR机制 简介 ASLR,全称为 Address Space Layout Randomization,地址空间布局随机化。ASLR 技术在 2005 年的 kernel 2.6.12 中被引入到 Linux 系统,它将进程的某些内存空间地址进行随机化来增大入侵者预测目的地址的难度,从而降低进程被成功入侵的风险。当前 Linux、Windows 等主流操作系统都已经采用该项技术。 具体实现 分级 阅读详情

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

Finer-grained kernel address-space layout randomization

By Jake Edge
February 19, 2020

原文来自:https://lwn.net/Articles/812438/

先插个小调查,顺手点了吧,读者大人!

kernel address-space layout randomization (KASLR),会把kernel加载到一个随机的地址,它设计出来是为了让攻击者更加难于找到他们的目标代码或数据。不过它仅仅是给kernel text段加上了一个随机偏移量,这其实还是有弱点的,假如kernel里面某个东西的地址被攻击者获取到了,那么kernel里所有其他数据的位置都完全可以被算出来。最近新出了一个更细粒度的KASLR patch set,希望能通过在kernel启动的时候对各个函数进行重新排序,来弥补目前方案对kernel text p的保护缺陷。

Kristen Carlson Accardi在2月初提出了一个RFC patch set,提供了这个细粒度KASLR的概念实现。她指出了现有KASLR方案的3个弱点:

  • 对kernel施加的随机熵不够大。

  • 如果一个地址被泄露了,就可以利用这个offset来算初kernel中所有其他数据的地址。

  • 有许多种会暴露这个offset的信息泄露方式

所以,简单来说:“这组patch set会在加载的时候对各个函数更改加载地址,并且只会增加1秒钟的启动耗时。”

改动主要在两个方面。在编译kernel的时候,需要增加一个GCC option,来把各个函数放在它自己的.text p。在kernel加载的时候,刚解压缩好kernel,就可以利用relocation address来对这些text p进行重新洗牌。在kernel里面目前有一些存放地址的table,包括exception handling和kprobe等,不过她也有办法来处理:“绝大多数这种table都会触发relocation,稍微改一下就好。有些table对函数的顺序有要求的,这种就需要在更改之后排一下序。为了能修改这些table,我们在objcopy对symbol进行stripping的阶段会保留一些关键的symbol,用来今后对text segment进行洗牌时所用。”

第二处改动是在加载kernel到memory中的地方。启动流程会改为解析vmlinux ELF文件来提取一些关键的symbol,并搜集齐需要重新排序的.text.* p列表。这些函数的顺序就会被随机重排一下,然后更新相关的table:“需要更改现有的代码,不能只依赖加载地址所使用的固定偏移量,而是需要根据函数text p移到的位置而来的偏移量。这需要仔细检查各个地址来看他是不是需要做随机化处理。我们使用了bsearch来改善这个操作的性能。”

在debug这个概念性方案的时候,用了一个PRNG(伪随机数生成器),所以每次只要给它一个相同的随机数种子(seed),就可以每次都生成相同的函数排布顺序。Kees Cook提供了一个PRNG patch,有一些性能提升。不过Andy Lutomirski则不赞同使用这个新增的、未曾证实过的算法。他建议使用一个deterministic random bit generator (DRBG),例如ChaCha20这种。同样,Jason A. Donenfeld也担心这个随机数序列可能会在泄露几个函数地址之后就被推测出来,这样一来会让这个功能打了折扣。Cook也觉得使用ChaCha20是个比较好的主意。

这组patch set还移除了非root用户对/proc/kallsyms文件的访问权限,这个文件节点会列出所有kernel symbol的地址。目前kallsyms在非root用户读取它时,会对所有地址都返回0,不过symbol列出的顺序是按照kernel text中的顺序来排序的,这样就会出卖了我们随机排布过后的kernel函数地址,因此要关闭非root用户的访问权限。Cook指出,过去也曾经有人把kallsyms文件改成不可读的,当时曾经导致userspace的一些功能不太正常。建议最好是把symbol name按字母顺序排序,或者等等看是不是有人真的抱怨这一点。

Impacts

Accardi在一个VM虚拟机里面测量过这组patch对boot time的影响,看起来基本上会多耗1秒钟时间,对绝大多数应用场景来说这不算什么。系统正常运行期间的性能影响则很难评判。各种比较重要的kernel build速度的指标,基本上看起来性能都比只开了KASLR的相同kernel要慢1%左右。有些workload的表现更加差一些,其他的基本上都保持不变甚至有的还莫名变得更好了。性能还是跟workload所用到的代码流程有关,这方面今后可能可以做不少研究。此前就有文章通过优化函数的layout来优化某种workload的性能,见此https://research.fb.com/wp-content/uploads/2017/01/cgo2017-hfsort-final1.pdf

在vmlinux ELF文件里面增加了这些额外的用于支持细粒度KASLR的信息,导致它的size也增加了,不过影响更大的是需要增加boot heap size。对这些text p进行随机化排布,需要64MB的heap size,比起当前的方案要用到的大得多(现在bzip2需要4MB,其他解压缩方案只需要64KB)。增大的boot heap size会导致需要在kernel image里面增加更大的全部填0的区域来容纳这个heap。

Cook提出的一个patch也包含在Accardi的这组patch set之中,希望能有助于这个问题,不过最终看来这里的问题其实是kernel object里的p排布过程中的一个bug。Arvind Sankar指出他的1月份的patch set应该能解决这个问题。Cook也同意这个解决方案更加好。

Lutomirski认为在symbol name里面的排序机制开销有点大了。只要再增大一点memory的话,sort()调用里的swap函数中许多动作就都可以去除了:“除非你实在缺少memory,否则的话不要用像这里实现的swap函数。而应该是分配一组数组,就像[0, 1, 2, ...]这样,在swap的时候只要swap这些片段就好。接着可以用排好的list来变更真正的数据。这样实现之后,会对每个item只做一次非常耗时的swap操作,而不会对每一次swap动作都调用这种非常耗时的swap操作。”

Cook认为有些场景下可能会有需要牺牲速度来节省memory。目前这个方案里面用到的memoy的数量已经大大超过他的预期了(他的测试中看到需要58MB)。其中一个问题就是在解压缩kernel image的过程中调用的这版free()函数实际上并没有释放任何memory。不过Accardi认为目前额外增加的1s启动时间并不会阻碍那些想要使用这个保护的人,而那些追求启动时间最短的场景其实也不会想用这种细粒度的KASLR功能。

Security and alignment

在这组patch set的cover letter中,Accardi就分析了这组patch set的一些安全属性,通常人们认为所谓的信息泄露,都是需要能对系统进行本地访问的。不过CVE-2019-0688则演示了Windows环境中的一种远程地址泄露问题。这组patch set假设这种信息泄露会很常见,从而致力于让攻击者在拿到这些泄露信息之后也很难对系统进行攻击。对攻击者来说,所增加的难度主要取决于如下因素:“首先,最明显的是,你选择来随机化的函数的数量。比如说,这个方案不会对现有的.text p中的函数进行随机化,因为这些是汇编代码或者是我们专门为了性能原因而选择避免随机排布的函数。我们进行随机排布的p越少,随机熵和复杂度就越低。此外,因为一些对齐的需求(x86_64需要16bytes对齐),攻击者对地址进行猜测的bit数量也变少了,因为低位的bit都是一致的。”

Jann Horn指出Intel建议16-byte对齐是为了优化branch target,如果不符合这个对齐要求的话,可能会导致调用效率下降。Sankar认为目前的alignment要求对随机性影响不打,不过Lutomirski认为还有其他因素要考虑:“这里还是要考虑一个安全问题,如果攻击者确认了两个函数的位置,拿到两者之间的偏移量,那么就可以根据这个偏移量来猜测有哪些函数可以放在这个区域。我们应该使用padding(补全)来增加这种攻击的难度,比如使用一些ramdon padding。”

他还认为Intel处理器有个问题,无法处理某种跨越了cache-line边界的跳转指令。Peter Zijlstra看了一下erratum文档,确认其中有要求函数需要按照32-byte对齐。Cook认为需要对kernel整体进行一些改动来处理好这个问题。

目前对于细粒度KASLR的反馈都还是很正面的。没有人提出对于这个目标的反对意见,也没人提出对这个技术总体实现上的反对意见。应该算是对KASLR的一个很不错的增量修改。也能跟各种control-flow integrity (CFI)措施共存,毕竟它们也正在往upstream推。Accardi也说这个主意本身并不新奇,此前已经有许多关于此的研究了。比如OpenBSD使用了一个类似的机制来在启动时对kernel进行随机变化。当然,后续还是有很多工作要做,不过大概率来说今年应该会看到这个功能合入mainline的。

全文完

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

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

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

arm64 kaslr 开启配置就能用? 在linux平台上构建纵深防御系统的过程中,KASLR(内核地址空间布局随机化)几乎是必须使能的一项重要基础安全功能,多数安全从业人员接触KASLR都是从攻击的角度开始的,对齐基本原理和用途多少有些了解,但当我们站在攻击的对立面想要在arm64架构上使能这个功能的时候,我们遇到了一些问题。 在我和我的同事中,有一个很普遍的认识错误,即kaslr的使能就是开启一些配置,配置好了就能正常使用。并且网络上的各种教程也是按照这个流程“成功”使能KASLR,让这种错误的认识广为流传。 按照相关文档的介绍,我们打开 阅读详情

相关推荐

内核地址空间布局随机化(KASLR)恢复软件-C/C++开发

KASLRfinder摘要:KASLRfinder是一个小型实用程序,可用于查找Windows 10内核及其驱动程序在内存中的加载位置-尽管地址已通过内核地址空间布局随机化进行了随机化(KASLRfinder摘要:KASLRfinder是一个小型实用程序,可以将Windows 10内核及其驱动程序用于查找Windows 10内核及其驱动程序在内存中的加载位置-尽管地址已通过内核地址空间布局随机化(KASLR)进行了随机化该实用程序可以作为常规程序运行,并且不需要管理特权。事务同步扩展(TSX)块中失败指令的执行时间TSX最初是在基于Haswell的CPU中引入的;但是

Linux内核中KASLR功能是什么?有什么作用?怎么破除?以及如何实操?(地址空间、layout random、kallsyms)

KASLR是一个什么技术点其实不重要,但重要的是有了KASLR这个功能后,造成内核中某个符号(函数 or 变量)在System.map中的地址和实际不一样了(实际: cat /proc/kallsyms),进一步带来了分析类似crash问题中的打印地址不准确问题。所以必须得知道这是什么?

技术札记 3371

基于Gardner环的QPSK定时同步MATLAB仿真:四倍采样与多场景性能分析

本文详细介绍了基于Gardner环的QPSK定时同步MATLAB仿真方法,重点分析了四倍采样技术在定时同步中的应用与性能优化。通过MATLAB代码实例展示了Gardner环的实现原理、多场景性能分析及常见问题解决方案,为数字通信系统的定时同步设计提供实用参考。

weixin_29083475的博客 373

KASLR是什么

KASLR是kernel address space layout randomization的缩写,直译过来就是内核地址空间布局随机化。 在学习中,记录下如下两个比较不错的链接,以供以后学习查找: 1、简单介绍KASLR,并且给出如何打开配置,下面还有不少人提问的问题解答 http://www.wowotech.net/memory_management/441.html 2、@table注解详解_Linux KASLR机制详解 有详细的讲解信息 https://blog.csdn.ne...

weixin_43171033的博客 1898

从噪声中提取真相:LabVIEW振动信号积分处理的降噪艺术

本文深入探讨了LabVIEW在振动信号积分处理中的降噪技术,揭示了如何通过选择性频率加权从噪声中提取关键故障特征。详细介绍了时域和频域积分方法的实现原理及优化策略,并结合工业案例展示了多轴信号联合降噪的实际应用效果,为设备状态监测提供了高效解决方案。

weixin_29164185的博客 302

ch32v103xx 烧写

烧写方式 串口uart, usb,swd(wch link)但不建议按此使用,参官方说明。

qq_39239990的博客 637

linux内核地址随机化-kaslr

未开启内核地址随机化 Virtual kernel memory layout: modules:0xffffff8000000000 - 0xffffff8008000000 (128MB) vmalloc: 0xffffff8008000000 - 0xffffffbebfff0000 (250GB) .text: 0xffffff8008080000 - 0xffffff80...

yiduoxiaoxx的博客 5810

cmu15445(2024fall) project 2

project 2比p1难度要更大,代码量更大且涉及的知识更多,实现中出现的bug更多,好在是最后全部解决了。我最大的收获在于对于多线程编程的理解更深入了,实际发现解决了多个多线程相关的bug,学会了更多多线程下debug的技巧方法,也见识了更多多线程的bug情况。在之后可以更系统的学习一下多线程编程。同时学会实现B+树也是需要掌握的基础。

Jerome_Yi的博客 1556

Linux KASLR

Linux KASLR

xiaozhi 663

Mplus—随机截距交叉滞后模型(Random Intercepts Cross-Lagged Panel Model, RI-CLPM)

介绍随机截距交叉滞后模型(Random Intercepts Cross-Lagged Panel Model, RI-CLPM)的相关知识,例如模型内容、Mplus语法及对应网址等。

m0_54401011的博客 9532

【硬件开源实战】STM32G070RBT6开发板从设计到避坑全解析

本文全面解析了STM32G070RBT6开发板从硬件设计到避坑的实战经验。详细介绍了电源设计、时钟电路、PCB布局等关键环节,分享了成本控制、焊接测试、软件开发和外设驱动的实用技巧,帮助开发者高效完成项目开发。

weixin_26897585的博客 235

Linux内核地址空间布局详解

具体在init_mem_mapping()中创建的。init_mem_mapping()在创建线性地址空间(direct mapping)页表的过程中,使用alloc_low_pages()函数从pgt_buf中分配内存,用来当做p4d/pud/pmd/pte使用。并且使用__pa()来访问它的物理内存。是一个x86-64特有的功能,开启以后会随机化线性映射区域基址(page_offset_base)、vmalloc区域基址(vmalloc_base)、vmemmap区域基址(vmemmap_base)。

m0_74282605的博客 1363

《YOLOv8-seg改进》专栏指导书册 &手把手创新教程

学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研;1)手把手教你如何训练YOLOv8-seg;2)模型创新,提升分割性能;3)独家自研模块助力分割;

会AI的学姐 3810

KASLR 内核随机地址配置开启

CONFIG_RANDOMIZE_BASEkernel features ---> Randomize of module region independently from the core kernel参考链接:KASLR 内核动态地址 - kk Blog —— 通用基础 (abcdxyzk.github.io)

zgp2917的专栏 579

c#仿热血江湖

Int32_1 = (int) table.Rows[i]["FLD_初级附魂"],Int32_2 = (int) table.Rows[i]["FLD_中级附魂"],Int32_3 = (int) table.Rows[i]["FLD_是否绑定"],Int32_0 = (int) table.Rows[i]["FLD_进化"],Form1.smethod_1(2, "加载百宝阁物品----没有百宝阁数据");Form1.smethod_1(2, "加载物品商店----没有物品数据");

weixin_42132177的博客 142

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ucore开启虚拟存储器过程详解

link脚本 在本项目中,有boot.ld和kernel.ld两个链接脚本 先来放几个常用链接脚本的注解: /DISCARD/ : {*(.comment)} //将输入文件的comment段丢弃 PROVIDE//该关键字定义一个(目标文件内被引用但没定义)符号。相当于定义一个全局变量,其他C文件可以引用它。 先来看第一个 OUTPUT_FORMAT("elf32-i386") OUTPUT_ARCH(i386) /** .data * .startu

weixin_44037337的博客 1466

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ARM64的KASLR分析

上述操作执行完_text变了,kimage_vaddr(_text - TEXT_OFFSET)也就跟着变了,kimage_voffset也就成了虚拟地址转物理地址函数的实际偏移了,就可以通过start_kernel进内核的C语言部分了。3.分配完的地址跟编译时的链接地址不一样了,所以需要重定位内核镜像---对符号地址进行重定位,校正内核代码的符号寻址,以此确保内核代码的正常执行。,介绍了kimage_voffset,就是运行时的内核的虚拟地址跟物理地址映射的真实偏移,不管经过与否kaslr。

我的博客 936

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...

Linux:内核地址随机化(Kaslr)

Linux,内存管理,Kaslr

JiMoKuangXiangQu的专栏 1034

Linux内核笔记之KASLR

KASLR, kernel address space layout randomization,内核地址空间布局随机化,是linux内核的一个非常重要的安全机制。KASLR技术可以让kernel image映射的地址相对于链接地址有个偏移,安全性上有一定的提升。

Hober 1万+

Linux内核安全终极指南:KASLR与栈保护技术深度解析

Linux内核作为现代操作系统的核心,其安全性直接关系到整个系统的稳定性。KASLR(内核地址空间布局随机化)与栈保护技术是Linux内核安全防护体系中的两大核心支柱,能够有效抵御各种内存攻击和安全威胁。 ## 🔐 KASLR技术:内核地址随机化的安全屏障 KASLR是Linux内核中最重要的安全特性之一,它通过在系统启动时随机化内核代码和数据的位置,大幅增加了攻击者预测目标地址的难度。这种

gitblog_00904的博客 924

内核打开kaslr后的调试方法

本文基于ARM64平台代码分析,ARM64平台的内核,在编译链接时,kernel代码段被链接的位置是:KIMAGE_VADDR + TEXT_OFFSET。我们可以通过查看vmlinux.lds.S链接文件查看具体内容: . = KIMAGE_VADDR + TEXT_OFFSET; .head.text : { _text = .; HEAD_TEXT } 下面依次介绍各个变...

程序猿Ricky的日常干货 2615

KASLR绕过及提权利用(CVE-2023-35001)

关于KASLR绕过,可以利用byteorder操作加上netlink组订阅可以泄露rule中的handle字段,该方法应该是可以用来泄露kernel基地址的,但是作者还提出另一种方法进行泄露,应该是为了提权利用做铺垫。

蚁景网安学院 969

KASLR 本质原理

摘要:KASLR(内核地址空间布局随机化)通过在系统启动时随机化内核镜像和关键内存区域的基址,破坏攻击者对固定地址的依赖,提升漏洞利用难度。其核心包括内核文本、内存布局(直接映射区、vmalloc区、vmemmap区)及模块/栈基址的随机化。实现依赖引导阶段的熵源采集和地址计算,但存在局限性:仅启动时随机一次、随机范围有限,可能被信息泄露或侧信道攻击绕过。与用户态ASLR相比,KASLR影响整个系统,泄露风险更高。常见绕过手段包括内核指针泄露和硬件侧信道攻击(如Meltdown/Spectre)。防护需结合

tangzhangyin的专栏 282

Linux内核引导过程第六部分:内核地址空间随机化(KASLR)

本文是深入解析Linux内核引导过程的第六部分,我们将重点探讨内核地址空间随机化(Kernel Address Space Layout Randomization,KASLR)的实现机制。KASLR是现代操作系统的重要安全特性,它通过随机化内核代码和数据的位置,增加攻击者预测内存布局的难度,从而有效缓解多种内存攻击。 ## KASLR概述 KASLR的核心思想是在系统启动时,将内核镜像加载到...

gitblog_00976的博客 703

KASLR内核地址随机化:从原理到绕过的底层安全博弈

本文深入解析KASLR(内核地址空间布局随机化)技术的攻防对抗。KASLR通过随机化内核代码和数据的加载地址来防御攻击,但存在三类主要突破口:信息泄露漏洞(如CVE-2021-43267)、部分覆盖攻击(利用固定相对位置)和内核模块漏洞(如NVIDIA驱动漏洞)。防御策略包括强化熵源、缩小随机偏移粒度、隔离关键区域及强制模块签名等。文章提供了从漏洞挖掘到加固防御的全流程指南,并推荐了相关安全工具。最后强调,随着技术演进,白帽黑客需要持续创新防御手段来应对KASLR面临的新挑战。所有技术仅供合法安全研究使用。

fearhacker的专栏 1210

KASLR内核地址随机化

1、内核启动时进入实模式,实模式下初始化一些内核需要的环境然后进入到start开始进入保护模式,保护模式这边才会涉及到kaslr,也就是对于vmlinux的一个随机化,vmlinux是真正的内核elf文件 2、实模式寻址方式是段寄存16位段地址和偏移地址的一个计算。 保护模式是上面的段寄存器到GDT的一个操作,然后GDT通过mmm到实际的一个物理地址。 ...

小吕的博客 1083
上一篇: LWN:管理文件系统在namespace中的UID映射!
下一篇: LWN:《BPF Performance Tools》介绍!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值