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

打印 上一主题 下一主题

主题 936|帖子 936|积分 2808

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:
  1. sysctl kern.elf64.aslr.stack=0  
  2. sysctl kern.elf64.aslr.pie_enable=0  
  3. sysctl kern.elf64.aslr.enable=0  
  4. sysctl kern.elf64c.aslr.stack=0  
  5. sysctl kern.elf64c.aslr.pie_enable=0  
  6. sysctl kern.elf64c.aslr.enable=0  
  7. sysctl -a | grep aslr  
复制代码
如果利用gcc编译器的时候,可以附加-fPIE的编译选项,以支持aslr机制。
canary

我们的栈中通常有一个magic number,用来检测该块内存空间是否被其他不测修改。它有一个好听的名字:canary,金丝雀,美丽而又脆弱。
它通常被部署在栈顶返回地点附近的某个位置,确保该处空间没有被外部缓冲区溢出修改,虽然只是一个简朴的机制,但是可以防止很多比力简朴的攻击或者非恶意失误,是内存保护的第一道防线。
通常在函数被调用时生成,且该段对于用户态来说是严格不可读的,以是只能用fork/提权/劫持sys函数等暴力破拆的方式探测处置惩罚。
这个头脑不仅限于内核场景,在通用需求下做数据校验的时候也可以利用,或者需求可靠的TCB场景时也可用。这种情况下就是在user space中举行自定义规则的校验了。
在gcc/clang中可以利用-fno-stack-protector编译选项来禁用canary,但如果你不明确知道本身在干什么,不要这么做!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

魏晓东

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表