Giter Site home page Giter Site logo

Comments (2)

tcbbd avatar tcbbd commented on August 15, 2024

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.

tcbbd avatar tcbbd commented on August 15, 2024

具体如何攻击不一定要写进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 photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.