Comments (2)
2014年CPI (Control Pointer Integrity)作为一种新的防止控制流劫持的手段被提出,通过保护Code Pointer的方式防止攻击,性能表现优异,最大开销平均不超过10%。然而,其设计用于保护Code Pointer的Safe Region可以利用Data Pointer的overwrite漏洞攻击,而Data Pointer是CPI为了性能而没有保护的,本文利用这一点提出了可以攻破CPI保护的攻击技术,并在Nginx服务器上做了实际测试。
根据CPI的论文,我们假设被保护的程序同时开启了DEP和ASLR,再此基础上要进行攻击。攻击的要点有二:
- CPI的Safe Region在x86-64及ARM架构上并没有利用硬件或软件机制保护起来防止访问或修改,而是基于信息隐藏。作者认为由于程序本身没有指针指向Safe Region,其中的数据也就不会泄露,这一假设是错误的,我们可以通过_基于时间的侧信道攻击_来获取其中的数据。
- 作者认为其Safe Region在程序本身不暴露其位置,为了获取其位置势必进行猜测并引起崩溃,只需监测暴力破解时产生的异常数量崩溃事件即可及时发现攻击,但实际上可以在_一次崩溃都不引发_的情况下定位Safe Region(约需98小时,由于太慢另外实现了一种允许导致崩溃的攻击,需6秒,实验中引起了13次崩溃,会议演讲时再次演示,引起了10次崩溃)。
以上两点突破了CPI作者所认定的前提条件,暴露了CPI的一些问题。
from rop-intro-and-foreland.
具体如何攻击不一定要写进abstract,熊神你先看下他怎么攻击的,这个侧信道脑洞很大
来看具体的攻击细节:
- 首先,我们需要利用一种漏洞来实现data pointer overwrite,并且该data pointer指向的数据同时影响了之后的控制流运行。例如控制了ptr指针的值,如下所示:
i = 0;
while (i < ptr->value) {
i++;
doSomeWork();
}
- 则此时可以通过改变ptr的值,读取出不同内存地址的值,造成代码执行时间不同,从而对进攻者而言服务器的响应时间不同。根据响应时间,可以估计任意内存地址的值,此即基于时间的侧信道攻击。
- 由此我们可以在堆内存区域选择一个地址,通过侧信道攻击读取其值。由于CPI本身设计的疏漏,我们可以100%保证第一次一定可以选中Safe Region内的地址。
- 命中Safe Region后,以一个libc的大小为单位,向高地址检查(通过侧信道读取),直到命中libc。由于Safe Region大小有2^42,十分稀疏几乎全由0构成,故可以通过是否为0判断是否命中libc(这导致我们只需要30个sample即可判断一个Byte的内存,因为精确度要求很低)。
- 命中libc后,可以同本地的libc镜像进行模糊匹配,大约需要70Bytes,每个Byte需要10000个sample,才能确定当前在libc中的位置(因为此时需要对Byte的具体值给出精确估计)。一旦确定,就可倒推出libc的起始地址,减去2^42即为Safe Region的起始地址。
- 根据此信息,以及CPI的具体实现,我们可以修改Safe Region中对应我们想修改的Code Pointer的项,使其允许指向一个ROP chain的起始,来引起一次ROP攻击,从而最终完成攻击。
这个攻击需要花费98小时,其中搜索libc需97小时,判断在libc中的位置需1小时,效率非常低。因此,提出了会导致崩溃,但速度快很多的算法:
- 在搜索libc阶段,为了总是访问有效的地址,一次只搜索一个libc的长度,是线性搜索。此处将其改为二分搜索,已知libc可能出现的范围,只需进行二分搜索即可,最多需19次可找到libc,但显然会引起若干次崩溃(libc比尝试的地址低)。
- 在确定libc中位置的阶段,可以不断向高地址前进,直到发生崩溃,这样可迅速定位到libc中会引起崩溃(不可读)的内存位置或libc的边界,且正确率不受影响(这样的点很少,特征明显)。
利用这个算法,可以做到6秒攻破使用CPI防御的Nginx服务器,引起10次左右的崩溃,已具备较高的实用性。
from rop-intro-and-foreland.
Related Issues (4)
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from rop-intro-and-foreland.