Toda mi ambición es ser libre toda mi vida.
【论文阅读】Detecting concurrency memory corruption vulnerabilities
【论文阅读】Detecting concurrency memory corruption vulnerabilities

【论文阅读】Detecting concurrency memory corruption vulnerabilities

Detecting concurrency memory corruption vulnerabilities

现状

在多线程执行中会出现内存损坏的漏洞,在该篇论文称之为并发性漏洞。由于非确定性的多线程执行,它们极难被发现。并发漏洞常常被攻击者利用和攻击,给软件的安全带来严重威胁,但是并发漏洞的检测十分困难。
一种直观的检测方法是遍历所有的线程交错来检测并发漏洞,但是会带来交错状态空间爆炸的问题。目前一些研究者用数据竞争的检测方法来检测并发漏洞,但是由于数据竞争和并发漏洞并不等价,这种方法实际应用中并不是很有效。一些最新的基于约束求解的工作也存在较多误报问题。

针对

针对与事件发生序相关的三类并发漏洞(释放后重用UAF、空指针解引用NPD和双重释放DF)进行检测。

UAF

如果线程t2在线程t1之前执行了它的所有三条线,就会发生并发性UAF
在这里插入图片描述

NPD

当一个指针被设置为NULL并在之后被取消引用时,会发生NULL指针取消引用。
(a)一个线程t1解除了对一个指针p的定义,第二个线程t2后来将该指针设置为NULL。然而,如果两个事件的顺序可以颠倒,这样线程t2首先将指针写为NULL,然后线程t1试图解指这个指针,就会造成并发NPD。
(b)如果指针写入事件p = q发生在线程t2的NULL写入事件之前(如4)或线程t1的指针解除定义之后(如3或5),就会发生并发性NPD。
在这里插入图片描述

DF

当一个内存位置被释放两次时,就会出现双重释放DF漏洞。(a)中的情况不会出现DF,因为释放的应该是两个不同内存块,(b)会出现。
在这里插入图片描述

提出

检测并发漏洞的关键就是判断目标事件之间的顺序是否可以交换。【给定两个距离较近的事件,如果它们和第三个事件满足一定的关系,那么这两个事件将有较高的概率可被交换。】
本文提出了松弛可交换事件的概念。基于松弛可交换事件,进一步提出了针对上述三类并发漏洞的检测算法并实现了相应的原型工具。

实现

(1)检测UAF:

给定一个正确的执行轨迹,它跟踪所有的内存访问并更新相应的向量时钟。之后,如果p上有任何自由调用(表示为事件ef ),算法2检查是否有任何事件访问p指向的内存块(表示为事件em)。对于任何这样的事件em,如果em和ef 是可交换的事件,则报告一个潜在的并发性UAF。

(2)检测NPD:

(a)跟踪NULL值写入、非NULL值写入和对指针p的读取(即取消引用),在运行期间,对于每个内存写入,检查写入指针p的值。如果该值是NULL,并且有一个读事件到同一个指针p,并且该p是可交换事件,将报告一个并发NPD。
(b)对于一个指向指针p的内存读取事件e,如果有两个事件(e1和e2,即之前图中2和3、4、5中的一个)向p写入一个NULL值和一个非NULL值,会进一步检查以下条件来检测并发性NPD。
1.如果两个事件e1和e2是可交换的事件,就会报告一个并发NPD。即之前图中2和4或2和5。
2.如果两个事件e和e1 or e2是可交换的事件,也会报告一个并发性NPD。即之前图中1和3或1和5

(3)检测DF:

如果存在任何潜在的并发DF,一定存在三个事件:两个不同线程对同一个指针的两个free事件和对同一个指针的一个赋值。
给定一个实际上由线程t释放内存m的free事件free(p)(表示为事件e1),它试图从内存m中找到一个先前分配给指针p的事件(表示为事件e2),这样在同一个指针p上也有一个先前的free事件(表示为e3)。
报告并发性DF:
情况(a):两个事件e 2和e3是可交换的事件,即上图中线程t2对p有分配的情况。
情况(b):两个事件e1和e2是可交换的事件,即上图中线程t1或t3对p有分配的情况。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注