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

news2024/12/23 4:20:28

1. 背景

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

  1. KASLR是什么?
  2. KASLR如何开启?如何查看开启了?
  3. 破除KASLR的几个方法(有些奇技淫巧)
  4. 破除KASLR后再实战中有何作用?

2. 要点

  • KASLR:kernel address space layout randomization 内核地址空间布局随机化。是一个安全功能,本质是将链接的地址 mapping到 运行的地址多做了一个随机偏移。断句是:KAS LR,KAS的LR

  • 作者:Kees Cook,linux内核的安全工程师(Linux kernel security engineer),曾是Ubuntu Security Team的技术老大。更多参考链接: Cook的Linkedin 、 Cook的github仓库、Cook更多介绍
    在这里插入图片描述

  • ASLR:address space layout randomization地址空间布局随机化,是一种众所周知的技术,它通过将各种对象随机放置在而不是固定的地址上来增加攻击的难度。参考Wiki

  • ASLR首次提出:Linux PaX 项目首先创造了“ASLR”这个术语,并于 2001 年 7 月作为 Linux 内核的补丁发布了 ASLR 的第一个设计和实现。参考Wiki

  • 第一个默认支持 ASLR 的主流操作系统是 2003 年的 OpenBSD 3.4 版, 其次是 2005 年的 Linux。参考Wiki

  • ASLR是一种“统计防御”,因为一般可以使用暴力方法来克服它

  • 在一个完全不受限制的系统中,尤其是在本地不受信任的用户的系统中,KASLR 不会很有用。但是,在使用容器或具有大量包含进程的系统上,KASLR 可以提供帮助。参考链接

  • Linux 长期以来一直为用户空间程序提供 ASLR。参考链接

  • 在虚拟机内使用较多,提高虚拟机安全性

  • 让内核vmlinux在运行态的地址相比于编译的地址有一个偏移,具体偏移值通过DTS配置

  • 另外如果可以参数化,在bootloader中配置,可以动态设置每次每个设备都是不同的映射地址

  • Red Hat Enterprise Linux 7.5 and later开始引入,参考redhat 官网

  • 如何避免内核消息卸载:通过将 dmesg_restrict sysctl 设置为 1,防止非特权用户访问内核消息。此设置将 dmesg 访问限制为具有 CAP_SYSLOG 权限的用户。proc通过kptr_restrict sysctl 设置为 1。

3. 实操

3.1 查看是否打开:CONFIG_RANDOMIZE_BASE

内核编译是否配置 CONFIG_RANDOMIZE_BASE=y

cat /boot/config-$(uname -r) |grep CONFIG_RANDOMIZE_BASE

实操:
在这里插入图片描述

  • 在bootloader配置中关闭的方式,添加nokaslr的启动项
GRUB_CMDLINE_LINUX="rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet nokaslr"

nokaslr介绍

3.2 计算内核符号表和堆栈空间地址的偏移方法

可以随机找一个内核符号表假设是 kmalloc_info。
通过 /proc/kallsyms获取符号实际的加载地址 A d d r k a l l s y m s Addr_{kallsyms} Addrkallsyms
通过 /boot/System.map-$(uname -r) 获取链接后的地址 A d d r s y s t e m m a p Addr_{systemmap} Addrsystemmap
那么偏移的地址就是他们的delta
A d d r δ = A d d r k a l l s y m s − A d d r s y s t e m m a p Addr_\delta = Addr_{kallsyms} - Addr_{systemmap} Addrδ=AddrkallsymsAddrsystemmap

命令:

cat /boot/System.map-$(uname -r) |grep kmalloc_info
cat /proc/kallsyms |grep kmalloc_info
python3 -c 'print(hex(int("0xffffffff87fa04c0", 16) - int("0xffffffff831a04c0", 16)))'

实操:
获取链接地址和运行加载地址:在这里插入图片描述
计算delta:在这里插入图片描述
所以算出来是:0x4e00000
那么计算出这个delta之后有什么作用呢?对实战有什么帮助呢?

4. 实战作用

在实战中,主要是需要用gdb调试linux内核的时候,比如有qemu场景调试guest主机内核,或者host主机内核都可以。下面主要以gdb调试vmlinux为例子介绍:
gdb使用add-symbol-file 默认基地址就是二进制vmlinux中的各个段地址。如果开启了KASLR,那么这个地址寻找到某个变量的实际地址就不对了。需要加上刚才的偏移。才能正确的使用。

4.1 获取默认链接地址

比如gdb中加载符号地址默认是根据vmlinux二进制文件中的各个段地址进行加载基础地址的。比如选取某个vmlinux查看他的text段的地址:
在这里插入图片描述

4.2 获取偏移后的加载地址:

  • data段的基础地址就是:
    ffffffff82600000 + 0x4e00000 = 0xffffffff87400000
    在这里插入图片描述
  • text段的基础地址就是:
    ffffffff81000000 + 0x4e00000 = 0xffffffff85e00000在这里插入图片描述
    计算这两个段的地址以后在gdb加载的时候指定对应的地址就能正确的映射上去
    在这里插入图片描述
    验证正确性:使用gdb和crash分别查看一个内核全局变量vm_numa_stat中的值
    使用最新的加载地址的gdb获取地址:
    在这里插入图片描述
    使用crash作为正确性对比来源对比:
    在这里插入图片描述
    结论是:都是28872。说明通过随机地址偏移后计算新的地址正确。
    注意这里为什么vm_numa_stat不能直接使用kallsyms中直接使用他的地址?
    实际上是可以的,但是会带来两个问题:
  1. 每次都需要将gdb中符号地址转化
  2. 转化后需要使用地址实际使用
    使用加载时候指定每个段的基础地址这样gdb在使用具体符号(函数或者全局变量)的时候,就能从动态连接的符号表中获取到正确的地址偏移,最终获取到对应的正确数据。
    另外值得注意的是gdb在添加symbol的时候需要先清空表(symbol-file 命令),以及有些数据需要每次都add-symbol-file才会更新。
# 清空表
symbol-file 
#
add-symbol-file  /usr/lib/debug/lib/modules/4.18.0-372.9.1.an8.x86_64/vmlinux -s .data 0xffffffff87400000 -s .text 0xffffffff85e00000

综述

本文从KASLA的功能出发,介绍了基础概念,以及实战场景。
实战场景中以在systemmap中的链接地址和kallsyms中的实际地址进行计算,并且以vmlinux中的各个段基础地址加上偏移计算通用
本方法依赖掌握代码编译链接和动态加载的基础原理,以及gdb的基础流程和原理,详细细节可以多参考相关文档,并多琢磨多实践。

其他参考链接:

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/virtualization_security_guide/sect-virtualization_security_guide-guest_security-kaslr
LWN介绍KASLR

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1592416.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vector及cv::Mat删除指定元素并不改变位置

1、vector删除指定元素且不改变原有的顺序 使用erase方法&#xff0c;测试例子如下所示&#xff1a; //测试用例 struct MyStruct {int a;int b; }; std::vector<MyStruct> spotInfo; spotInfo.push_back({ 1,2 }); spotInfo.push_back({ 3,4 }); spotInfo.push_back({…

SSM整合时的配置文件

文章目录 SSM整合时的配置文件pom.xmlweb.xmlmybatis-config.xmlspring-mvc.xmlspring-mapper.xmldatabase.propertiesapplication.xml项目结构图 SSM整合时的配置文件 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"ht…

蓝桥杯第2152题——红绿灯

问题描述 爱丽丝要开车去上班, 上班的路上有许多红绿灯, 这让爱丽丝很难过。为 了上班不迟到, 她给自己的车安装了氮气喷射装置。现在她想知道自己上班最 短需要多少时间。 爱丽丝的车最高速度是 米每秒, 并且经过改装后, 可以瞬间加速到小于 等于最高速的任意速度, 也可以瞵…

【从浅学到熟知Linux】环境变量详谈(含使用程序获取环境变量的3种方法、如何查看环境变量)

&#x1f3e0;关于专栏&#xff1a;Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程及数据库等内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 环境变量基本概念查看环境变量的方法环境变量相关命令环境变量组织方式及获取环境变量的3种方法验…

链表中常见的使用方法逻辑整理

文章目录 1. 二叉树特点1.1 完全二叉树1.2 满二叉树 2. 二叉树创建2.1 通过先序序列带有叶子结点标识符创建二叉树2.2 通过层次遍历顺序创建二叉树2.3 通过 先序中序 创建二叉树2.4 通过 先序中序 创建二叉树2.5 通过 中序后序 创建二叉树 3. 二叉树遍历通用方法3.1 先序遍历(深…

【软考中级】软件设计师考点分布

文章目录 软考官网资格设置软考报考流程 【软件设计师】考点分布选择题考点分布案例题考点分布 软考官网 中国计算机技术职业资格网&#xff1a;https://www.ruankao.org.cn/ 官网报名平台&#xff1a;https://bm.ruankao.org.cn/sign/welcome 资格设置 计算机软件计算机网…

SSM整合配置案例

一、什么是SSM整合 SSM整合用到两个容器&#xff0c;web容器是root容器的子容器&#xff0c;父子容器关系。 为了方便编写&#xff0c;我们可以三层架构每层对应一个配置类&#xff0c;分别指定两个容器加载 Ioc如何初始化&#xff1f; 二、简单实现整合SSM &#xff08;一…

是的,本科毕业八年,我考研了

今天&#xff0c;是一篇纯分享文。 是的&#xff0c;本科毕业八年&#xff0c;我考研了。 停更10个月&#xff0c;历时296天&#xff0c;我考研上岸了。 小伙伴们&#xff0c;好久不见。 一 发今年第一篇文章的时候刚处理完后续事宜&#xff0c;就简单说了句&#xff0c;后台…

QThread的学习

锁住该线程直到下面的情况之一出现&#xff1a; (1)和该线程连接的对象已经执行完成&#xff08;例如&#xff1a;当它从run()中返回时&#xff09; 如果该线程已经结束&#xff0c;该函数将返回true。 如果该线程还没有开始&#xff0c;它也返回true。 (2)time毫秒已经过去。如…

Linux 内核学习(2) --- regulator 框架

目录 Regulator 介绍Regulator provider 注册struct regulator_descstruct regualtor_configDTS 配置和解析On BoardConfig 配置regulator_ops总结 Regulator Consumer 使用struct regulator 获取regulator 操作使用Multi Regulator 参考博客 Regulator 介绍 Regulator 指的是…

电子烟特效音语音方案选型-WTN6020-8S-E

随着科技的迅猛进步&#xff0c;电子烟行业亦在持续创新与突破&#xff0c;引领着全新的潮流。其中&#xff0c;电子烟产品所特有的吸烟声音特效播报功能&#xff0c;无疑成为了技术革新的璀璨亮点。这一设计巧妙地将吸烟的声效融入使用体验中&#xff0c;使得用户在吸电子烟时…

Javascript 斐波那契搜索-迭代与递归(Fibonacci Search)

给定一个大小为 n 的排序数组 arr[] 和要在其中搜索的元素 x。如果 x 存在于数组中&#xff0c;则返回 x 的索引&#xff0c;否则返回 -1。 例子&#xff1a; 输入&#xff1a; arr[] {2, 3, 4, 10, 40}, x 10输出&#xff1a; 3 元素 x 出现在索引 3 处。 输入&#xff1…

HarmonyOS开发实例:【app帐号管理】

应用帐号管理 介绍 本示例选择应用进行注册/登录&#xff0c;并设置帐号相关信息&#xff0c;简要说明应用帐号管理相关功能。效果图如下&#xff1a; 效果预览 使用说明参考鸿蒙文档&#xff1a;qr23.cn/AKFP8k点击或者转到。 1.首页面选择想要进入的应用&#xff0c;首次进…

【Redis】持久化

文章目录 一、RDB1.1、RDB的自动备份与手动备份1.1.1、自动备份1.1.2、手动备份 1.2、RDB优点1.3、RDB缺点1.4、RDB快照1.5、RDB优化配置项 二、AOF2.1、AOF工作流程2.2、AOF写回策略2.3、MP-AOF实现2.4、AOF优缺点2.5、AOF重写机制 三、RDBAOF混合持久化3.1、数据恢复顺序和加…

生产环境中秒杀接口并发量剧增与负载优化策略探讨

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 1. 实施限流措施 1.1 令牌桶算法&#xff1a; 1.2 漏…

如何申请阿里云服务器学生优惠,入口在这呢!

阿里云学生服务器免费申请&#xff0c;之前是云翼计划学生服务器9元/月&#xff0c;现在是高校计划&#xff0c;学生服务器可以免费申请&#xff0c;先完成学生认证即可免费领取一台云服务器ECS&#xff0c;配置为2核2G、1M带宽、40G系统盘&#xff0c;在云服务器ECS实例过期之…

什么是队头阻塞以及如何解决

前言 通常我们提到队头阻塞&#xff0c;指的可能是TCP协议中的队头阻塞&#xff0c;但是HTTP1.1中也有一个类似TCP队头阻塞的问题&#xff0c;下面各自介绍一下。 TCP队头阻塞 队头阻塞&#xff08;head-of-line blocking&#xff09;发生在一个TCP分节丢失&#xff0c;导致…

ip地址切换器安卓版,保护隐私,自由上网

在移动互联网时代&#xff0c;随着智能手机和平板电脑的普及&#xff0c;移动设备的网络连接变得愈发重要。为了满足用户在不同网络环境下的需求&#xff0c;IP地址切换器安卓版应运而生。本文将以虎观代理为例&#xff0c;为您详细解析IP地址切换器安卓版的功能、应用以及其所…

26、链表-环形链表II

思路&#xff1a; 这道题就是判断链表中是否有环&#xff0c;首先使用集合肯定可以快速地解决&#xff0c;比如通过一个set集合遍历&#xff0c;如果遍历过程中有节点在set中已经存在那么说明存在环。返回这个节点即可 第二种方式就是通过快慢指针方式寻找环。如何做呢&#xf…

震惊!借助Coze白嫖GPT4-128k解决方案

震惊!某大佬借助Coze白嫖GPT4-128k解决方案 前言 此文章介绍如何免费使用GPT-4高级模型并拓展API功能 最近的 Coze 在国内开放了&#xff0c;可以免费使用大模型。但是和国外的有点区别&#xff0c;国外版本使用的chatgpt4&#xff0c;国内版本使用的是语雀大模型。 Coze是一…