LLVM笔记(6) - CompilerRT之safestack
好久没更新博客了, 最近调研安全编译选项(各类sanitizer), 抽空做个笔记. 本来想系统的分析一下compiler-rt代码, 但是最近实在太懒了, 所以先介绍最简单的安全栈safestack, 之后有空再补上compiler-rt框架以及其它sanitizer工具. 什么是safestack safestack是Code Pointer Integrity (CPI) Project的部分实现. CPI(代码指针完整性)是为了阻止控制流劫持攻击而提出的一种通过保证代码指针安全性的设计, 关于CPI的具体内容可以参考论文https://dslab.epfl.ch/pubs/cpi.pdf或官网(https://dslab.epfl.ch/proj/cpi/). safestack是CPI的一个组件, 但也可以单独使用(用于防止基于栈的控制流攻击), 它通过将栈分为两个独立区域, safe stack(用于存储函数返回地址, 寄存器spill, 保证安全访问的局部变量)和unsafe stack(其它存储在栈上的内容)来保证即使栈空间溢出也不会影响到程序流执行(链接地址不会被覆写). 一个基于栈攻击的例子 目前CPI并没有完整的实现, 其preview版本可以通过https://dslab.epfl.ch/proj/cpi/levee-early-preview-0.2