Linux内核内存保护机制:aslr和canary

ASLR

ASLR技术,全称为Address space layout randomization(地址空间布局随机化),是现代通用操作系统基本都会配备的一个功能,其确保了每次实例化进程时内存排布都是不同的。

对于某些内存段,会附加随机的offset来防止缓冲区攻击等,这是OS层面的保护,当然也可以兼容硬件层面使用ECC bit进行合法性检测的冗余保护。

更确切的说,在Linux系统下的进程模型中,aslr对于内存排布的影响如下:

  • 不变:代码段/BSS/全局数据区等
  • 改变:加载的依赖库的代码位置(手动链接的,最典型的是glibc,e.g. 比如使用printf的时候重放会出现链接空间地址段错误,若禁用aslr则可以进行攻击),栈空间,堆空间等(后两者视aslr的不同层级,有可能不会附加,取决于内核版本)

进程地址空间排布(来自代码随想录,仅供参考):

GDB环境下运行程序,aslr是默认关闭的,这也便于我们进行程序的调试。

这里举出来一个典型的实用案例:

我在工作的实际需求中需要建立一个虚拟化的沙盒,底层基座依赖了一个uni-kernel的bsd系统,出于sandbox的snapshot迁移重放需求,需要手动关闭aslr机制,并附加硬件层面的内存保护。

开启/关闭aslr执行以下代码,开启为1,关闭为0:

sysctl kern.elf64.aslr.stack=0
sysctl kern.elf64.aslr.pie_enable=0
sysctl kern.elf64.aslr.enable=0
sysctl kern.elf64c.aslr.stack=0
sysctl kern.elf64c.aslr.pie_enable=0
sysctl kern.elf64c.aslr.enable=0
sysctl -a | grep aslr

如果使用gcc编译器的时候,可以附加-fPIE的编译选项,以支持aslr机制。

canary

我们的栈中通常有一个magic number,用来检测该块内存空间是否被其他意外修改。它有一个好听的名字:canary,金丝雀,美丽而又脆弱。

它通常被部署在栈顶返回地址附近的某个位置,确保该处空间没有被外部缓冲区溢出修改,虽然只是一个简单的机制,但是可以防止很多比较简单的攻击或者非恶意失误,是内存保护的第一道防线。

通常在函数被调用时生成,且该段对于用户态来说是严格不可读的,所以只能用fork/提权/劫持sys函数等暴力破拆的方式探测处理。

这个思想不仅限于内核场景,在通用需求下做数据校验的时候也可以使用,或者需求可靠的TCB场景时也可用。这种情况下就是在user space中进行自定义规则的校验了。

在gcc/clang中可以使用-fno-stack-protector编译选项来禁用canary,但如果你不明确知道自己在干什么,不要这么做!

Linux内核内存保护机制:aslr和canary的更多相关文章

  1. [内核同步]浅析Linux内核同步机制

    转自:http://blog.csdn.net/fzubbsc/article/details/37736683?utm_source=tuicool&utm_medium=referral ...

  2. Linux内核同步机制--转发自蜗窝科技

    Linux内核同步机制之(一):原子操作 http://www.wowotech.net/linux_kenrel/atomic.html 一.源由 我们的程序逻辑经常遇到这样的操作序列: 1.读一个 ...

  3. Linux内核同步机制

    http://blog.csdn.net/bullbat/article/details/7376424 Linux内核同步控制方法有很多,信号量.锁.原子量.RCU等等,不同的实现方法应用于不同的环 ...

  4. Linux内核OOM机制的详细分析(转)

    Linux 内核 有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了 防止内存耗尽而内核会把该进程杀掉.典 ...

  5. Linux内核同步机制之(五):Read Write spin lock【转】

    一.为何会有rw spin lock? 在有了强大的spin lock之后,为何还会有rw spin lock呢?无他,仅仅是为了增加内核的并发,从而增加性能而已.spin lock严格的限制只有一个 ...

  6. Linux内核同步机制之completion【转】

    Linux内核同步机制之completion 内核编程中常见的一种模式是,在当前线程之外初始化某个活动,然后等待该活动的结束.这个活动可能是,创建一个新的内核线程或者新的用户空间进程.对一个已有进程的 ...

  7. 浅析Linux内核同步机制

    非常早之前就接触过同步这个概念了,可是一直都非常模糊.没有深入地学习了解过,最近有时间了,就花时间研习了一下<linux内核标准教程>和<深入linux设备驱动程序内核机制>这 ...

  8. Linux内核同步机制之(四):spin lock【转】

    转自:http://www.wowotech.net/kernel_synchronization/spinlock.html 一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享 ...

  9. linux 内核 RCU机制详解

    RCU(Read-Copy Update)是数据同步的一种方式,在当前的Linux内核中发挥着重要的作用.RCU主要针对的数据对象是链表,目的是提高遍历读取数据的效率,为了达到目的使用RCU机制读取数 ...

  10. Linux内核配置机制(make menuconfig 、Kconfig、Makefile)讲解【转】

    本文转载自:http://www.codexiu.cn/linux/blog/34801/ 前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍了模块的一种编译方式—— ...

随机推荐

  1. BOM – Navigator SendBeacon

    介绍 游览器专门做给 tracking 用的接口. 从前我们想 tracking 用户点击 anchor 是比较麻烦的. 因为 click 事件触发后, 想发 ajxax 去做 tracking re ...

  2. SQL Server – Concurrency 并发控制

    前言 以前写过相关的, 但这篇主要讲一下概念. 帮助理解 Entity Framework with MySQL 学习笔记一(乐观并发) Asp.net core 学习笔记 ( ef core tra ...

  3. .NET全局静态可访问IServiceProvider(支持Blazor)

    DependencyInjection.StaticAccessor 前言 如何在静态方法中访问DI容器长期以来一直都是一个令人苦恼的问题,特别是对于热爱编写扩展方法的朋友.之所以会为这个问题苦恼,是 ...

  4. scala安装及配置

    window 上安装 Scala 1.Scala下载网址:https://www.scala-lang.org/download/ 2.下载后,双击 msi 文件,一步步安装即可,安装过程你可以使用默 ...

  5. 北京智和信通受邀出席2022IT运维大会,荣获“2022智能运维星耀榜最具影响力企业”

    9月8日,由IT运维网.<网络安全和信息化>杂志社联合主办的"2022(第十三届)IT运维大会"在北京辽宁大厦成功举办.大会以"智慧先行,运维有术" ...

  6. 如何在SQL中查找某一字段在哪些表中

    在SQL中,要找出数据库中包含特定字段(列)的所有表,可以使用数据库的系统表或信息架构视图.不同的数据库系统(如MySQL, SQL Server, PostgreSQL等)有不同的系统表和查询方式. ...

  7. placement new --特殊的内存分配

    placement new 是 C++ 中的一种特殊的内存分配技术,用来在指定的内存地址上直接构造对象.与普通的 new 运算符不同,placement new 并不分配新的内存,而是在已经分配好的内 ...

  8. break,continue,return的只要区别

    a)break 结束当前循环体 b)continue 结束本次的循环,执行下次的循环 c)return 结束函数体,并返回值 d)break 和 continue 写在循环里(for,while)re ...

  9. docker安装过程 - 下载mysql

    1. 下载必要的包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2. 指定虚拟机去哪里安装 docker sudo ...

  10. linux 配置apache的虚拟主机

    基于web的开发,若没有配置虚拟主机,一直在浏览器输入localhost/projectname有点复杂 特别是类似thinkphp框架的,一大串:localhost/php/tp5/public.. ...