麻省理工学院开发出自动修复 Bug 的系统,你相信吗?

知道91 | 站长推荐 | 2015-08-06 | 阅读:11390

在六月下旬的计算机学会的编程语言设计与实现大会上,MIT 的研究者们展示了一个新系统,可以通过从其他更加安全的应用中自动导入相关功能,借以修复原来软件中的危险漏洞。

麻省理工学院开发出自动修复 Bug 的系统,你相信吗?

这个引人注目的系统叫做 CodePhage ,它借用其他程序时并不需要访问借主应用的源码。相反,该系统分析这个应用的执行情况,并标记出其安全检查类别的特性。因此,即使所编写的语言与被修复应用的语言不同,该系统仍然可以从中导出检查功能用来修复应用。

CodePhage 将代码导入易受攻击的程序后,还会进行进一步分析以确保漏洞被修复。

MIT 计算机科学与人工智能研究室(CSAIL)的研究员,CodePhage 的研发领导人员 Stelios Sidiroglou-Douskos 表示:

“我们在开源库里有大量代码可用,数百万计项目,而且很多项目都有类似的实现了。这些项目总有一些可以与别的许多项目共享功能的子模块,即便那不一定是该程序的核心功能。” 有了 CodePhage,“你将逐渐建立一个集其他应用最优秀部分于一身的混合系统。”

Sidiroglou-Douskos 和他的共同作者——MIT 计算机科学和工程的教授 Martin Rinard,研究生 Fan Long 和 Rinard 组里的研究员 Eric Lahtinen——将 CodePhage 正在被修复的程序称作是接受程序,出借功能的程序称作是捐献程序。要开始分析,CodePhage 需要两个输入样本:一个导致接受程序崩溃,另一个则不会。今年三月,这个小组报告了一个名为 DIODE 的漏洞定位程序。该程序可以自动产生引起崩溃的输入信息。但是用户也许就很容易发现打开特定文件时会崩溃。

承接过去

首先,CodePhage 将“安全的”输入信息——那些不会导致崩溃的输入信息——传入捐献程序。 然后它将追踪捐献程序执行的一系列操作,并用一个符号表达式记录这些操作。这个符号表达式会是一串描述操作所施加的逻辑约束的字符。

比如说,在某个时候,捐献程序会检查输入信息的大小是否在某些临界值之下。若是,CodePhage 会在持续增长的符号表达式中加入一个特定的符号,来代表在临界值之下的状况。它不会记录文件的真实大小——仅仅是这次检查所施加的约束。

接下来,CodePhage 将会导致崩溃的输入信息传入捐献程序。像之前那样,它建立起一条代表捐献程序执行操作的符号表达式。当新的符号表达式与旧的不同的时候,CodePhage 就中断这个过程。这一差异表明,这是一个安全输入能够满足的限制条件,而能够引起程序崩溃的输入则不能满足。因此,它可能是一个接受程序缺失的安全检查。

CodePhage 分析接受程序,来寻找输入信息在什么位置能满足大多数但不是全部新符号表达式描述的限制。接受程序可以按与捐献程序不一样的顺序来执行操作,它也可以用不同的形式储存数据。但符号表达描述的是被处理过的数据的状态,而不是处理过程本身。

在每个识别出来的位置上,CodePhage 都可以免除符号表达式描述的大多数约束,其中也包括接受程序施加的约束。从第一个位置开始,它将剩下的少量约束转换成接受程序的语言,并将它们插入到源代码中去。然后,它会用之前引起过崩溃的输入再次运行接受程序。

假如程序运行良好,那么新代码就解决了问题。如果程序崩溃了,CodePhage 就移到接受程序的下一个候选位置。如果在尝试修补了所有的候选位置之后,接收程序依然崩溃,CodePhage 就回到捐献程序中继续构建符号表达式,直到它发现了另一个新旧符号表达相异的位置。

自动化未来

研究者们在七个常见的,并已被 DIODE 检查到漏洞的开源项目上测试了 CodePhage。每个项目从二到四个捐献程序处引进修补。在所有的实例里,CodePhage 都能够修补脆弱的代码,而且每次所花的时间通常在两分钟到十分钟。

这些研究者解释说,在现代商业软件里,安全检查可以占到代码的百分之八十甚至更多。希望未来版本的 CodePhage 能够通过自动插入这些检查,大幅度减少软件开发者们花费在枯燥工作上的时间。

Rinard 表示:

“长远愿景是,你再也不用写别人写过的代码。系统会找到那段代码,并自动帮你把这段代码,和其它你所需要的、能让你的程序运作起来的代码放在一起。”

马萨诸塞大学埃姆郝思特校区的计算机科学教授 Emery Berger 表示:

“这个从别的有相似功能的程序那里借代码,并且能用这个方法修补好一个本质上不能运作的程序的技术,是一个很酷的结果。老实说,我很惊讶这个方法居然真的可行。” “捐献程序和接收程序不是同一群人写的,他们有不同的编程标准,他们使用不同方式命名变量,他们使用各种不同类型的变量,变量或许是本地的,或者,他们在栈的更高处。 而 CodePhage 可以识别出这些联系,然后说 ‘这些变量和那些变量有关联。’ 用器官捐献来比喻,它可以将从捐献程序借取的代码完美移植,就好像代码本来就是那样写的。CodePhage 可行并且有效的这个事实,令人惊讶,太酷了。”