并行程序共享数据类漏洞的检测方法及系统的制作方法

文档序号:6522719阅读:172来源:国知局
并行程序共享数据类漏洞的检测方法及系统的制作方法
【专利摘要】本发明提出一种并行程序共享数据类漏洞的检测方法,包括以下步骤:为软件不变量中的各条指令的动态实例定义瞬时Fetter集,其中,软件不变量是指程序中执行顺序预先固定的指令集合;获取瞬时Fetter集的包含集和义务集;将包含集和义务集进行剪枝以获取剪枝后的结果,并将剪枝后的结果存储在不变量数据库中;利用检测组件检测各个瞬时Fetter集是否出现不满足对应的包含集和义务集的第一瞬时Fetter集,如果是,则判断第一瞬时Fetter集包含漏洞,检测组件生成违例报告;暂停当前运行的线程以阻止检测到的漏洞的运行。本发明的方法,可以自动地检测以及防止程序中潜在的共享数据类漏洞。本发明还提出一种并行程序共享数据类漏洞的检测系统。
【专利说明】并行程序共享数据类漏洞的检测方法及系统
【技术领域】
[0001]本发明涉及软件工程【技术领域】,尤其涉及一种并行程序共享数据类漏洞的检测方法及系统。
【背景技术】
[0002]一般来说,关于数据竞争类型的漏洞的研究可以分为两大部分,基于锁的方法(lock-set approach)(如 Eraser)和基于时间序列的方法(happened-before)(如SigRace)。虽然有关数据竞争类型的漏洞已经得到较为充分的研究,但即使完美解决了所有数据竞争类漏洞也是不够的。原因在于:1)很大一部分的数据竞争漏洞并不会造成什么实质性的后果。即,它们是良性的;2)不存在数据竞争的原子性违反类漏洞并不少见;3)绝大多数的顺序性违例类漏洞并不能通过简单地将它们包入关键区之中得到解决。
[0003]由于单一地检测数据竞争类漏洞的工具的局限性,关于如何解决原子性违例类漏洞的研究成了一个热门的话题并成为许多研究工作的重心。因而,只有少数关于顺序性违例类漏洞的研究。而且在这些少量的研究中基本上都只能处理自己定义的一个顺序性违例类漏洞的子集。举例来说,虽然ConMem中的Con-NULL和DefUse的Local/Remote (LR)Invariants各自处理了一部分,但是“写-写”顺序性违例类漏洞都不能得到很好的处理。
[0004]此外,漏洞的防治与漏洞的检测是一类相互补充的方法。这一方法仍存在以下问题:1)即使经过了相当充分的测试,仍然不能保证所有的漏洞都已经被找到;2)对一个已报告的漏洞的误解可能导致由修复用的补丁引入新的漏洞;3)从漏洞被发现到被修复之间的时间间隔太长。虽然已有大量的改进的方法,如PSet, LifeTxes、Pacman、Rcdc和Bulksc。但是它们都需要复杂的硬件支持,而且大部分无法处理顺序性违例类漏洞。
[0005]关于大量的以块为单位的执行代码,如内存事务(Transaction Memory)这一相对成熟的技术,已经有很多相关的方法被提出。这些方法或硬件被用于降低多线程程序的不确定性,从而减少漏洞的发现几率和调试的难度。但是,尽管使用了新型的编程模型,也并没有杜绝漏洞的发生。更重要的是,由于组成一个顺序性违例的两条指令中的一条比另一条要更加靠近分叉点在基于块的执行方式中是不存在的,因此基于块的执行方式反而提高了顺序性违例类漏洞的发生几率。

【发明内容】

[0006]本发明旨在至少解决上述技术问题之一。
[0007]为此,本发明的第一个目的在于提出一种并行程序共享数据类漏洞的检测方法。该方法可以自动地检测以及防止程序中潜在的共享数据类漏洞。
[0008]本发明的第二个目的在于提出一种并行程序共享数据类漏洞的检测系统。
[0009]为了实现上述目的,本发明第一方面实施例的并行程序共享数据类漏洞的检测方法包括以下步骤:为软件不变量中的各条指令的动态实例定义瞬时Fetter集,其中,软件不变量是指程序中执行顺序预先固定的指令集合;获取所述瞬时Fetter集的包含集和义务集;将所述包含集和义务集进行剪枝以获取剪枝后的结果,并将所述剪枝后的结果存储在不变量数据库中;利用检测组件检测各个所述瞬时Fetter集是否出现不满足对应的所述包含集和义务集的第一瞬时Fetter集,如果是,则判断所述第一瞬时Fetter集包含漏洞,检测组件生成违例报告;暂停当前运行的线程以阻止检测到的所述漏洞的运行。
[0010]根据本发明实施例的并行程序共享数据类漏洞的检测方法,可以自动地检测以及防止程序中潜在的共享数据类漏洞,无需开发者手工注释,且应用范围广。
[0011]在一些示例中,所述瞬时Fetter集具体是指:在所有先于所述指令执行的指令中,与所述指令相邻且与所述指令访问了同一内存的指令集合。
[0012]在一些示例中,所述包含集是指所述指令的所有动态实例的所述瞬时Fetter集的并集;所述义务集是指所述指令的所有动态实例的所述瞬时Fetter集的交集。
[0013]在一些示例中,所述暂停当前运行的线程以阻止检测到的所述漏洞的运行,当暂停时间达到预设时间阈值或暂停次数达到预设次数阈值时,暂停状态解除。
[0014]在一些示例中,还包括:判断触发集是否包含于所述义务集,如果否,则暂停当前运行的线程,并生成违例报告,其中,所述触发集是所述义务集的镜像集合。
[0015]本发明第二方面实施例的并行程序共享数据类漏洞的检测系统,包括:提取模块,用于计算瞬时Fetter集的包含集和义务集,并不断更新所述包含集和义务集;剪枝模块,用于去除所述包含集和义务集中置信度低的部分,以获取剪枝后的结果;检测模块,用于利用检测组件检测各个所述瞬时Fetter集是否出现不满足对应的所述包含集和义务集的所述第一瞬时Fetter集,如果是,则判断所述第一瞬时Fetter集包含漏洞,检测组件生成违例报告;防治模块,用于暂停当前运行的线程以阻止检测到的所述漏洞的运行;发掘模块,用于发掘多线程运行指令中隐藏的漏洞。
[0016]根据本发明实施例的并行程序共享数据类漏洞的检测系统,可以自动地检测以及防止程序中潜在的共享数据类漏洞,无需开发者手工注释,且应用范围广。
[0017]在一些示例中,所述瞬时Fetter集具体是指:在所有先于所述指令执行的指令中,与所述指令相邻且与所述指令访问了同一内存的指令集合。
[0018]在一些示例中,所述瞬时Fetter集的包含集是指所述指令的所有动态实例的所述瞬时Fetter集的并集;所述瞬时Fetter集的义务集是指所述指令的所有动态实例的所述瞬时Fetter集的交集。
[0019]在一些示例中,所述防治模块还用于,当暂停时间达到预设时间阈值或暂停次数达到预设次数阈值时,暂停状态解除。
[0020]在一些示例中,所述发掘模块还用于,判断触发集是否包含于所述义务集,如果否,则暂停当前运行的线程,并向生成违例报告,其中,所述触发集是所述义务集的镜像集

口 o
[0021]本发明附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
【专利附图】

【附图说明】
[0022]本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中,[0023]图1是根据本发明一个实施例的并行程序共享数据类漏洞的检测方法的流程图;
[0024]图2是本发明一个实施例的具体运行过程示意图;和
[0025]图3是根据本发明一个实施例的并行程序共享数据类漏洞的检测系统的结构框图。
【具体实施方式】
[0026]下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。相反,本发明的实施例包括落入所附加权利要求书的精神和内涵范围内的所有变化、修改和等同物。
[0027]在本发明的描述中,需要理解的是,术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性。在本发明的描述中,需要说明的是,除非另有明确的规定和限定,术语“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连。对于本领域的普通技术人员而言,可以根据具体情况理解上述术语在本发明中的具体含义。此外,在本发明的描述中,除非另有说明,“多个”的含义是两个或两个以上。
[0028]流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或多个用于实现特定逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本发明的优 选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序来执行功能,这应被本发明的实施例所属【技术领域】的技术人员所理解。
[0029]下面参考附图描述根据本发明实施例的并行程序共享数据类漏洞的检测方法及系统。
[0030]本发明提出的一种并行程序共享数据类漏洞的检测方法,包括以下步骤:为软件不变量中的各条指令的动态实例定义瞬时Fetter集;获取瞬时Fetter集的包含集和义务集;将包含集和义务集进行剪枝以获取剪枝后的结果,并将剪枝后的结果存储在不变量数据库中;利用检测组件检测各个瞬时Fetter集是否出现不满足对应的包含集和义务集的第一瞬时Fetter集,如果是,则判断所述第一瞬时Fetter集包含漏洞,检测组件生成违例报告;暂停当前运行的线程以阻止检测到的漏洞的运行。
[0031]图1是根据本发明一个实施例的并行程序共享数据类漏洞的检测方法的流程图,图2是本发明一个实施例的具体运行过程示意图。
[0032]结合图1和图2,并行程序共享数据类漏洞的检测方法的具体实现过程如下:
[0033]步骤SlOl:为软件不变量中的各条指令的动态实例定义瞬时Fetter集。其中,软件不变量是指程序中执行顺序预先固定的指令集合。
[0034]具体地,为软件不变量中的各条指令的动态实例(Dynamic instance of a staticinstruction)〗定义一个瞬时Fetter集,即CFS (I)。数学上CFS (I)是一个指令的集合,由所有先于I执行的指令中,与I相邻且与I访问了同一内存的指令构成。如果这种指令的数量为零,则标记为NUL。例如,线程I中的指令Il被称为与线程2中的指令12相邻,当且仅当在Il和12的执行之间线程I没有运行任何访问同一片内存的指令。
[0035]步骤S102:获取瞬时Fetter集的包含集和义务集。
[0036]具体地,某条指令I的包含集(Belonging Invariants Set),即BIS (I),是一个指令的集合,描述这条指令能否被包含于另一条指令的CFS中。它的值等于这条指令的所有动态实例CFS的并集。如果所有的指令都可以属于I的CFS,BIS (I)被标记为ALL。
[0037]某条指令I的义务集(Enforcing Invariants Set),即EIS (I),用来描述这条指令是否必须被包含于另一条指令的CFS中。在数学上,它是指这条指令所有动态实例的CFS的交集。
[0038]在实际运行中,为了在没有任何人力标注介入的条件下自动的获取FI (FetterInvariants),即瞬时Fetter集的包含集BIS和义务集EIS的总和,需要一定数量的正确运行的动态实例。对于多线程程序而言,由于多线程程序运行的不确定性,甚至对于同一输入数据的多次运行,也了可以被认为是不同的运行的动态实例,因此获取大量的运行的动态实例是比较容易的。常用的系统测试工具,如CHESS和CTrigge,可以用来发掘尽可能全面的运行动态实例。
[0039]在实现上,通过跟踪程序的执行来获取指令之间顺序关系。具体地,在程序的运行期间,提取组件会为每一组〈线程ID,内存地址 > 记录最后一条执行的指令。这个线程对此片内存的每一次操作都会更新这个记录。通过这些记录,可以动态的获取指令I的动态实例对应的CFS (I)。得到CFS (I)之后,进行如下操作:
[0040](I)初始化 FI,即 BIS(I)和 EIS (I)。
[0041]具体地,将BIS(I)和EIS(I)分别初始化为0和ALL。
[0042](2)更新FI,具体的操作如下所示:
[0043]BIS(I) — BIS(I) U CFS(I)
[0044]EIS(I) — EIS(I) H CFS(I)
[0045]其中,等式右侧的BIS(I)和EIS(I)是指令I的当前动态实例执行前获取到的FI。
[0046](3)经过上述的学习训练后,每条指令I学习到的FI会被存放起来等待剪枝。
[0047]特别地,在具体地执行过程中,需要动态的维护recorder变量来记录当前内存的访问情况。
[0048]步骤S103:将包含集和义务集进行剪枝以获取剪枝后的结果,并将剪枝后的结果存储在不变量数据库中。
[0049]由于多线程程序的复杂性,训练阶段的测试可能是不充分的。即,测试样例可能不能覆盖所有可能的运行路径。因此,为了解决不充分训练可能带来的问题,待上述步骤S102的程序执行完毕后,提取组件将负责进行剪枝操作,去除FI中置信度不高的部分,剩下的部分即剪枝后的结果。将剪枝后的结果存放于不变量数据库中,等待后续的操作。
[0050]具体地,剪枝的实现过程如下:
[0051 ] ( I)剪去出现几率低的软件不变量。
[0052]一般地,用于学习训练用的正确运行的动态实例的数量至少为10次。因此,可以认为,在所有的训练实例中只出现了一次的不变量的置信度(出现的可能性)是很低的。因此,这些不变量会从EIS中去除。同样地,如果BIS中相当比例不变量的置信度都不高,就将这条指令的BIS被标成ALL。如前所述,ALL表示所有的指令都属于这条指令的CFS。如果一条指令对应的FI中EIS为空且BIS为ALL,这条指令则可以省略,以节省内存空间。
[0053]具体地,需要依次访问所有获得的EIS和BIS对,使用一个map数据结构对这些EIS和BIS对进行计数。然后遍历这个map,将只出现过一次的EIS和BIS对标记为不充分,并将其从EIS中去除。最后检查所有的BIS,计算其中不充分的指令所占的比例,如果这一比例高于事先设定的某一阈值,则将其标记为ALL。
[0054](2)剪去过于受欢迎的指令。
[0055]在经常被调用的小函数中的指令拥有大量的BIS,此时可以将这些BIS标为ALL。
[0056]同样的,还有处于动态链接库中的指令,他们的PC数会随着装载时的条件而变化,从而获得很大的BIS。此时,只需检查所有的BIS,计算其大小,如果大于预设阈值(一般设为5),则将其标记为ALL。
[0057](3)剪去不访问共享变量的指令。
[0058]由于本发明实施例的方法处理的是共享数据类的漏洞,因此将去除不访问共享变量的指令。具体地,不访问共享变量的指令可以通过程序执行过程中动态维护的recorder变量获得,将这些指令从EIS和BIS中删除即可。
[0059]经过上述剪枝的FI将被存放于不变量数据库中。
[0060]步骤S104:利用检测组件检测各个瞬时Fetter集是否出现不满足对应的所述包含集和义务集的第一瞬时Fetter集,如果是,则判断所述第一瞬时Fetter集包含漏洞,检测组件生成违例报告。
[0061]具体实现过程如下:
[0062](I)从不变量数据库中读取FI,即BIS和EIS,并对其进行初始化。
[0063](2)检测组件通过维护特定的域来动态的计算每一条指令I动态实例的CFS (I),并与相应的FI进行比较。对于每一条指令,如果监测到运行的动态实例的特性不满足其对应的FI,则判断发生违例,检测组件生成违例报告并发送给开发者,用于更进一步的分析。其中,违例指在运行当中,不满足下列条件的状况:EIS(I) g CFS(I) g BIS(I).[0064]特别地,为了节省内存和时间,这一操作只对访问共享变量的指令执行。
[0065]另外,检测阶段也可以用于进一步去掉不充分的不变量。经分析,造成违例的原因并不是漏洞的那部分违例可以从FI中删除。即,当开发者根据报告与对程序的分析做出当前违例并不是漏洞的断定后,通过执行与步骤S103中的“剪去出现几率低的不变量”类似的方法将这一指令从不变量数据库中将其剔除。这样,之后再出现同样的指令交错时,将不会再产生疑似漏洞的违例报告。
[0066]步骤S105:暂停当前运行的线程以阻止检测到的漏洞的运行。
[0067]在上述步骤S104检测到违例的基础上,直接通过暂停当前线程来解决这一违例的方法来防治漏洞的发生。特别地,为了阻止违例的发生,检测违例的步骤是先于指令的实际执行之前进行。
[0068]具体地,通过只允许部分经过测试的线程间指令交错的运行,可以在漏洞实际暴露之前检测到潜在的漏洞,通过暂停当前执行的线程直到其它线程的运行解决了这一违例的方法来阻止漏洞的运行。在当前线程暂停的过程中,如果其它线程访问了同一片内存,当前线程的CFS会被重新计算并再一次检测,如果成功就解除暂停状态。在程序运行过程中,依然需要动态的维护recorder变量用以记录当前内存的访问情况。[0069]不可否认的是,并不是所有的FI违例都可以通过暂停的办法来解决。由于学习训练可能是不充分的,唯一合适的指令交错有可能并未在训练学习FI的阶段出现,因而也就无法被学习到。为了保证程序不会因此出现无限的死锁,需要根据程序的具体情况设置一个合理的阈值值。当暂停时间达到预设时间阈值或暂停次数达到预设次数阈值时,暂停状态解除。并向开发者报告这一违例无法解决。经开发者析后,如果造成这一状况的原因并非漏洞,可以通过对FI打补丁的办法来放松限制,允许这一指令交错在今后的执行。补丁的具体方法也与步骤S103中的“剪去出现几率低的不变量”的方法类似。
[0070]优选地,在软件的实际运行环节,步骤S105在步骤S104讲述的检测违例的基础上,可以作为一种独立的防治模式,直接通过暂停当前线程来解决这一违例的方法来防治漏洞的发生,而不需向开发者发送违例报告。
[0071]进一步地,在本发明的一个实施例中,还给出了一种检测在普通的运行环境中,暴露多线程漏洞的方法。即:判断触发集是否包含义务集,如果否,则暂停当前运行的线程,并生成违例报告。其中,触发集是义务集的镜像集合。
[0072]在实际的运行过程中,单纯地通过前述的步骤去检测那些极少出现的漏洞是不太现实的。在本发明的一个实施例中,根据FI的定义,如果指令Il属于指令12的EIS,表示在所有正确运行的动态实例中Il都在12之前执行。反之,可能是隐藏的漏洞。
[0073]为了检测这样的性质,本发明实施例的用于发掘潜在漏洞的方法的实现步骤如下:
[0074](I)为各个指令I定义一个对应的触发集Trigger Set (TS (I))。
[0075]数学上,TS是E IS的镜像指令的集合。即,Il属于12的TS,当且仅当12属于Il的 EIS。
[0076](2)从不变量数据库读取EIS,并初始化。
[0077](3)动态地计算各个指令I的CSF (I)后,判断下式是否成立:
[0078]TS(I) c EIS(I)
[0079]如果TS(I) £ EIS(I),则当前线程将被暂停。这一规则将会被持续测试,直到条件得
到满足或达到相应的阈值(应当设置得比步骤S105相对长一些)。
[0080]由于TS是EIS的反射,EIS所暗含的指令预定的执行顺序,在正确的指令交错之中一定会发生关于TS的违例。从而,当前线程被发掘组件暂停,进一步加大了两指令运行顺序翻转的几率。但是,如果顺序是被代码使用信号量之类的顺序性同步原语保证了的,这一违例会被持续,直至达到阈值。
[0081]根据本发明实施例的并行程序共享数据类漏洞的检测方法,可以自动地检测以及防止程序中潜在的共享数据类漏洞,无需开发者手工注释,且应用范围广。
[0082]本发明另一方面的实施例提出了一种并行程序共享数据类漏洞的检测系统,如图3所示,包括:提取模块100、剪枝模块200、检测模块300、防治模块400和发掘模块500。
[0083]其中,提取模块100用于获取瞬时Fetter集的包含集和义务集,并不断更新包含集和义务集。剪枝模块200用于去除包含集和义务集中置信度低的部分,以获取剪枝后的结果。检测模块300用于利用检测组件检测各个瞬时Fetter集是否出现不满足对应的包含集和义务集的第一瞬时Fetter集,如果是,则判断第一瞬时Fetter集包含漏洞,检测组件生成违例报告。防治模块400用于暂停当前运行的线程以阻止检测到的漏洞的运行。发掘模块500用于发掘多线程运行指令中隐藏的漏洞。
[0084]具体地,首先为软件不变量中的各条指令的动态实例(Dynamic instance of astatic instruction)〗定义一个瞬时Fetter集,即CFS (I),其中,软件不变量是指程序中执行顺序预先固定的指令集合。数学上CFS (I)是一个指令的集合,由所有先于I执行的指令中,与I相邻且与I访问了同一内存的指令构成。如果这种指令的数量为零,则标记为NUL0例如,线程I中的指令Il被称为与线程2中的指令12相邻,当且仅当在Il和12的执行之间线程I没有运行任何访问同一片内存的指令。
[0085]在提取模块100中,获取瞬时Fetter集的包含集和义务集,并不断更新包含集和义务集。具体地,某条指令I的包含集(Belonging Invariants Set),即BIS (I),是一个指令的集合,描述这条指令能否被包含于另一条指令的CFS中。它的值等于这条指令的所有动态实例CFS的并集。如果所有的指令都可以属于I的CFS,BIS (I)被标记为ALL。
[0086]某条指令I的义务集(Enforcing Invariants Set),即EIS (I),用来描述这条指令是否必须被包含于另一条指令的CFS中。在数学上,它是指这条指令所有动态实例的CFS的交集。
[0087]在实际运行中,为了在没有任何人力标注介入的条件下自动的获取FI (FetterInvariants),即瞬时Fetter集的包含集BIS和义务集EIS的总和,需要一定数量的正确运行的动态实例。对于多线程程序而言,由于多线程程序运行的不确定性,甚至对于同一输入数据的多次运行,也了可以被认为是不同的运行的动态实例,因此获取大量的运行的动态实例是比较容易的。常用的系统测试工具,如CHESS和CTrigge,可以用来发掘尽可能全面的运行动态实例。
[0088]在实现上,通过跟踪程序的执行来获取指令之间顺序关系。具体地,在程序的运行期间,提取组件会为每一组〈线程ID,内存地址 > 记录最后一条执行的指令。这个线程对此片内存的每一次操作都会更新这个记录。通过这些记录,可以动态的获取指令I的动态实例对应的CFS (I)。得到CFS (I)之后,`进行如下操作:
[0089](I)初始化 FI,即 BIS(I)和 EIS (I)。
[0090]具体地,将BIS⑴和EIS⑴分别初始化为0和ALL。
[0091](2)更新FI,具体的操作如下所示:
[0092]BIS(I) — BIS(I) U CFS(I)
[0093]EIS(I) — EIS(I) H CFS(I)
[0094]其中,等式右侧的BIS(I)和EIS(I)是指令I的当前动态实例执行前获取到的FI。
[0095](3)经过上述的学习训练后,每条指令I学习到的FI会被存放起来等待剪枝。
[0096]特别地,在具体地执行过程中,需要动态的维护recorder变量来记录当前内存的访问情况。
[0097]在剪枝模块200中,由于多线程程序的复杂性,训练阶段的测试可能是不充分的。即,测试样例可能不能覆盖到所有可能的运行路径。因此,为了解决不充分训练可能带来的问题,待上述提取模块100中的程序执行完毕后,提取组件将负责进行剪枝操作,去除FI中置信度不高的部分,剩下的部分即剪枝后的结果。将剪枝后的结果存放于不变量数据库中,等待后续的操作。[0098]具体地,剪枝的实现过程如下:
[0099](I)剪去出现几率低的软件不变量。
[0100]一般地,用于学习训练用的正确运行的动态实例的数量至少为10次。因此,可以认为,在所有的训练实例中只出现了一次的不变量的置信度(出现的可能性)是很低的。因此,这些不变量会从EIS中去除。同样地,如果BIS中相当比例不变量的置信度都不高,就将这条指令的BIS被标成ALL。如前所述,ALL表示所有的指令都属于这条指令的CFS。如果一条指令对应的FI中EIS为空且BIS为ALL,这条指令则可以省略,以节省内存空间。
[0101]具体地,需要依次访问所有获得的EIS和BIS对,使用一个map数据结构对这些EIS和BIS对进行计数。然后遍历这个map,将只出现过一次的EIS和BIS对标记为不充分,并将其从EIS中去除。最后检查所有的BIS,计算其中不充分的指令所占的比例,如果这一比例高于事先设定的某一阈值,则将其标记为ALL。
[0102](2)剪去过于受欢迎的指令。
[0103]在经常被调用的小函数中的指令拥有大量的BIS,此时可以将这些BIS标为ALL。
[0104]同样地,还有处于动态链接库中的指令,他们的PC数会随着装载时的条件而变化,从而获得很大的BIS。此时,只需检查所有的BIS,计算其大小,如果大于预设阈值(一般设为5),则将其标记为ALL。
[0105](3)剪去不访问共享变量的指令。
[0106]由于本发明实施例的方法处理的是共享数据类的漏洞,因此将去除不访问共享变量的指令。具体地,不访问共享变量的指令可以通过程序执行过程中动态维护的recorder变量获得,将这些指令从EIS和BIS中删除即可。
[0107]经过上述剪枝的FI将被存放于不变量数据库中。
[0108]在检测模块300中,利用检测组件检测各个瞬时Fetter集是否出现不满足对应的包含集和义务集的第一瞬时Fetter集,如果是,则判断第一瞬时Fetter集包含漏洞,检测组件生成违例报告。
[0109]具体实现过程如下:
[0110](I)从不变量数据库中读取FI,即BIS和EIS,并对其进行初始化。
[0111](2)检测组件通过维护特定的域来`动态的计算每一条指令I动态实例的CFS (I),并与相应的FI进行比较。对于每一条指令,如果监测到运行的动态实例的特性不满足其对应的FI,则判断发生违例,检测组件生成违例报告并发送给开发者,用于更进一步的分析。其中,违例指在运行当中,不满足下列条件的状况:EIS(I) g CFS(I) !Ξ BIS(I)。
[0112]特别地,为了节省内存和时间,这一操作只对访问共享变量的指令执行。另外,检测模块300也可以用于进一步去掉不充分的不变量。经分析,造成违例的原因并不是漏洞的那部分违例可以从FI中删除。即,当开发者根据报告与对程序的分析做出当前违例并不是漏洞的断定后,通过执行与剪枝模块200中的“剪去出现几率低的不变量”类似的方法将这一指令从不变量数据库中将其剔除。这样,之后再出现同样的指令交错时,将不会再产生疑似漏洞的违例报告。
[0113]防治模块400用于暂停当前运行的线程以阻止检测到的漏洞的运行。具体地,通过只允许部分经过测试的线程间指令交错的运行,可以在漏洞实际暴露之前检测到潜在的漏洞,通过暂停当前执行的线程直到其它线程的运行解决了这一违例的方法来阻止漏洞的运行。在当前线程暂停的过程中,如果其它线程访问了同一片内存,当前线程的CFS会被重新计算并再一次检测,如果成功就解除暂停状态。在程序运行过程中,依然需要动态的维护recorder变量用以记录当前内存的访问情况。
[0114]不可否认的是,并不是所有的FI违例都可以通过暂停的办法来解决。由于学习训练可能是不充分的,唯一合适的指令交错有可能并未在训练学习FI的阶段出现,因而也就无法被学习到。为了保证程序不会因此无限的死锁,需要根据程序的具体情况设置一个合理的阈值。当暂停时间达到预设时间阈值或暂停次数达到预设次数阈值时,暂停状态解除。并向开发者报告这一违例无法解决。经开发者分析后,如果造成这一状况的原因并非漏洞,可以通过对FI打补丁的办法来放松限制,允许这一指令交错在今后的执行。补丁的具体方法也与剪枝模块200中的“剪去出现几率低的不变量”的方法类似。
[0115]优选地,在软件的实际运行环节,防治模块400与检测模块300是可以相互独立运行的两个模块。但是,防治模块400中的违例的检测部分与检测模块300中的检测方法相同。不同的是,为了阻止违例的发生,检测违例的步骤是先于指令的实际执行之前进行且不需向开发者发送违例报告。
[0116]在发掘模块500中,给出了一种检测在普通的运行环境中,暴露多线程漏洞的方法。即:判断触发集是否包含义务集,如果否,则暂停当前运行的线程,并生成违例报告。其中,触发集是义务集的镜像集合。
[0117]在实际的运行过程中,单纯地通过前述的系统模块去检测那些极少出现的漏洞是不太现实的。在本发明的一个实施例中,根据FI的定义,如果指令Il属于指令12的EIS,表示在所有正确运行 的动态实例中Il都在12之前执行。反之,可能是隐藏的漏洞。
[0118]为了检测这样的性质,本发明实施例的用于发掘潜在漏洞的发掘模块500的主要功能步骤如下:
[0119](I)为各个指令I定义一个对应的触发集Trigger Set (TS (I))。
[0120]数学上,TS是EIS的镜像指令的集合。即,Il属于12的TS,当且仅当12属于Il的 EIS。
[0121](2)从不变量数据库读取EIS,并初始化。
[0122](3)动态地计算各个指令I的CSF (I)后,判断下式是否成立:
[0123]TS(I)CzEIS(I)
[0124]如果TS(I) ^ EIS(I),则当前线程将被暂停。这一规则将会被持续测试,直到条件得
到满足或达到相应的阈值(应当设置得比防治模块400中相对长一些)。
[0125]由于TS是EIS的反射,EIS所暗含的指令预定的执行顺序,在正确的指令交错之中一定会发生关于TS的违例。从而,当前线程被发掘组件暂停,进一步加大了两指令运行顺序翻转的几率。但是,如果顺序是被代码使用信号量之类的顺序性同步原语保证了的,这一违例会被持续,直至达到阈值。
[0126]优选地,在实际实现过程中,在本发明实施例中使用Intel的指令监视工具PIN实现了整个并行程序共享数据类漏洞的检测系统。
[0127]根据本发明实施例的并行程序共享数据类漏洞的检测系统,可以自动地检测以及防止程序中潜在的共享数据类漏洞,无需开发者手工注释,且应用范围广。[0128]在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
[0129]尽管已经示出和描述了本发明的实施例,本领域的普通技术人员可以理解:在不脱离本发明的原理和宗旨的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由权利要求及其等同物限定。
【权利要求】
1.一种并行程序共享数据类漏洞的检测方法,其特征在于,包括以下步骤: 为软件不变量中的各条指令的动态实例定义瞬时Fetter集,其中,软件不变量是指程序中执行顺序预先固定的指令集合; 获取所述瞬时Fetter集的包含集和义务集; 将所述包含集和义务集进行剪枝以获取剪枝后的结果,并将所述剪枝后的结果存储在不变量数据库中; 利用检测组件检测各个所述瞬时Fetter集是否出现不满足对应的所述包含集和义务集的第一瞬时Fetter集,如果是,则判断所述第一瞬时Fetter集包含漏洞,检测组件生成违例报告;以及 暂停当前运行的线程以阻止检测到的所述漏洞的运行。
2.如权利要求1所述的方法,其特征在于,所述瞬时Fetter集具体是指:在所有先于所述指令执行的指令中,与所述指令相邻且与所述指令访问了同一内存的指令集合。
3.如利要求I所述的方法,其特征在于,所述包含集是指所述指令的所有动态实例的所述瞬时Fetter集的并集; 所述义务集是指所述指令的所有动态实例的所述瞬时Fetter集的交集。
4.如权利要求1所述的方法,其特征在于,所述暂停当前运行的线程以阻止检测到的所述漏洞的运行,当暂停时间达到预设时间阈值或暂停次数达到预设次数阈值时,暂停状态解除。
5.如权利要求1所述的方法,其特征在于,还包括:判断触发集是否包含于所述义务集,如果否,则暂 停当前运行的线程,并生成违例报告,其中,所述触发集是所述义务集的镜像集合。
6.一种并行程序共享数据类漏洞的检测系统,其特征在于,包括: 提取模块,用于计算瞬时Fetter集的包含集和义务集,并不断更新所述包含集和义务集; 剪枝模块,用于去除所述包含集和义务集中置信度低的部分,以获取剪枝后的结果; 检测模块,用于利用检测组件检测各个所述瞬时Fetter集是否出现不满足对应的所述包含集和义务集的所述第一瞬时Fetter集,如果是,则判断所述第一瞬时Fetter集包含漏洞,检测组件生成违例报告; 防治模块,用于暂停当前运行的线程以阻止检测到的所述漏洞的运行; 发掘模块,用于发掘多线程运行指令中隐藏的漏洞。
7.如权利要求6所述的系统,其特征在于,所述瞬时Fetter集具体是指:在所有先于所述指令执行的指令中,与所述指令相邻且与所述指令访问了同一内存的指令集合。
8.如权利要求6所述的系统,其特征在于,所述瞬时Fetter集的包含集是指所述指令的所有动态实例的所述瞬时Fetter集的并集; 所述瞬时Fetter集的义务集是指所述指令的所有动态实例的所述瞬时Fetter集的交集。
9.如权利要求6所述的系统,其特征在于,所述防治模块还用于,当暂停时间达到预设时间阈值或暂停次数达到预设次数阈值时,暂停状态解除。
10.如权利要求6所述的系统,其特征在于,所述发掘模块还用于,判断触发集是否包含于所述义务集,如果否,则暂停当前运行的线程,并向生成违例报告,其中,所述触发集是所述义务集的镜像集合 。
【文档编号】G06F21/57GK103679038SQ201310659010
【公开日】2014年3月26日 申请日期:2013年12月6日 优先权日:2013年12月6日
【发明者】武永卫, 陈康, 郑纬民, 章明星 申请人:清华大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1