今天介绍一篇发表在USENIX Security 2022上研究工作PolyCruise,介绍了一种跨语言的动态程序分析。作者开发了PolyCruise工具,能够实现跨不同语言的动态信息流分析(DIFA)。通过对流行的Python-C工具(例如Numpy库等)跨语言分析,共发现了14个漏洞,其中11个被确认,获得了8个CVE编号。
文章链接:
https://www.usenix.org/system/files/sec22-li-wen.pdf
01
—
Motivation Example
总的来说,语言之间的交互有两种方式,可以通过IPC来进行进程间的交互,也可以通过foreign function interface (FFI) 来进行交互。
例如,Java通过本地函数调用与C交互,通过Jobject传递参数,而Python与C之间的接口不同且更复杂。即使在相同的语言组合中,机制也会有所不同。例如,在Python-C程序中,可以使用ctypes加载一个C库,然后搜索并调用C函数。或者,可以将一个C模块构建为Python plugin,以用作Python模块。
02
—
POLYCRUISE 架构
-
第一阶段,polycruise先将每个语言单元转换成一种与语言无关的符号表示(LISR),然后通过符号依赖分析(SDA)计算单元中的符号依赖关系,随后用得到的数据引导插桩操作。
-
第二阶段(Phase 2),对于解释性语言(例如Python),POLYCRUISE开始时使用动态插桩,利用第一阶段的结果以及用户输入的source/sink点进行分析。运行的过程中不断更新DIFG。
下面来进行一些更加详细的介绍:
2.1
—
第一阶段
-
1.1 符号转换,将target program转换成语言无关的符号表示(laguage- independent symbolic representation (LISR) )举个例子,如下图,LISR会抽取出来 “statement, global, and function” 这三种内容并记录
-
1.2 依赖分析 ,将上面的LISR转换成为Def-use的格式,例如在第7行定义了V,使用了C
-
1.3 静态插桩,对于需要编译的代码块,在这一步要进行statement级别的插桩,为后续分析做准备。这里只插桩和source存在依赖关系的变量&语句。例如说source是a = read(),那么就只插桩和a相互依赖的变量。
2.2
—
第二阶段
-
2.1,动态插桩(Event),对于例如JS等动态语言,要在动态运行时来记录不同event的信息,event信息会被记录成下图的格式:
-
2.2,构建 dynamic information flow graph (DIFG) ,依据上面的插桩等,对程序运行进行监控,不断更新构建DIFG
DIFG的每一个node,都是一个“Event”,每一条边都代表着下面四种其中的一个:
线程间data-flow (红线)
线程内data-flow (蓝线)
线程间control-flow(线程切换,绿线)
线程内control-flow (黑线)
于是,在动态分析过程中,每遇到一个“Event“,就按照上一步解析其内容,并添加到DIFG中。下面给出一个DIFG构建好的例子,线的颜色对应上述四种flow。
2.3
—
第三阶段
这一阶段,可以开始进行漏洞挖掘。通过遍历分析构建好的DIFG,找到Source和Sink之间是否存在path,就能够成功发现漏洞。
下面给出几个polycruise挖掘出的漏洞的例子,作者总共找到了46个漏洞,包含8个新的CVE编号。对于这些漏洞,作者也将PoC公布了出来:https://bitbucket.org/wsucailab/polycruise/src/master/Experiments/PoC
1. Numpy中的Buffer Overflow:
Python从用户输入读取一个变量,传入C中,但是在C中并没有做适当的检测,就进行了memcpy。这有可能造成Buffer Overflow。
2. Numpy中的Incomplete string comparison:
和上一个漏洞相类似,Python从用户文件读取内容,传入C中进行字符串比较而未经正确验证,有可能导致恶意DoS攻击,因为用户只要传入不正确的字符串就能导致程序“goto fail”。
原文始发于微信公众号(安全研究GoSSIP):G.O.S.S.I.P 阅读推荐 2023-10-20 POLYCRUISE:跨语言污染传播动态分析
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论