G.O.S.S.I.P 阅读推荐 2023-10-20 POLYCRUISE:跨语言污染传播动态分析

admin 2024年2月17日19:51:19评论9 views字数 1966阅读6分33秒阅读模式


今天介绍一发表在USENIX Security 2022上研究工作PolyCruise,介绍了一种跨语言的动态程序分析。作者开发了PolyCruise工具,能够实现跨不同语言的动态信息流分析(DIFA)。通过对流行的Python-C工具(例如Numpy库等)跨语言分析,共发现了14个漏洞,其中11个被确认,获得了8个CVE编号。


文章链接:

https://www.usenix.org/system/files/sec22-li-wen.pdf



G.O.S.S.I.P 阅读推荐 2023-10-20 POLYCRUISE:跨语言污染传播动态分析




01

Motivation Example


    总的来说,语言之间的交互有两种方式,可以通过IPC来进行进程间的交互,也可以通过foreign function interface (FFI) 来进行交互。


    例如,Java通过本地函数调用与C交互,通过Jobject传递参数,而Python与C之间的接口不同且更复杂。即使在相同的语言组合中,机制也会有所不同。例如,在Python-C程序中,可以使用ctypes加载一个C库,然后搜索并调用C函数。或者,可以将一个C模块构建为Python plugin,以用作Python模块。


例如下图中,python通过ctypes调用了C语言写成的动态链接库的函数,这里传入了一个文件名,由C函数打开。传统分析方法针对单语言,不会报错,但实际上,下面的这段代码会导致攻击者拥有访问任何文件的权限。



G.O.S.S.I.P 阅读推荐 2023-10-20 POLYCRUISE:跨语言污染传播动态分析



02

 POLYCRUISE 架构


G.O.S.S.I.P 阅读推荐 2023-10-20 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三种内容并记录
G.O.S.S.I.P 阅读推荐 2023-10-20 POLYCRUISE:跨语言污染传播动态分析

  • 1.2 依赖分析 ,将上面的LISR转换成为Def-use的格式,例如在第7行定义了V,使用了C

G.O.S.S.I.P 阅读推荐 2023-10-20 POLYCRUISE:跨语言污染传播动态分析

  • 1.3 静态插桩,对于需要编译的代码块,在这一步要进行statement级别的插桩,为后续分析做准备。这里只插桩和source存在依赖关系的变量&语句。例如说source是a = read(),那么就只插桩和a相互依赖的变量。

2.2

第二阶段

  • 2.1,动态插桩(Event),对于例如JS等动态语言,要在动态运行时来记录不同event的信息,event信息会被记录成下图的格式:

    G.O.S.S.I.P 阅读推荐 2023-10-20 POLYCRUISE:跨语言污染传播动态分析

  • 2.2,构建 dynamic information flow graph (DIFG) ,依据上面的插桩等,对程序运行进行监控,不断更新构建DIFG


  • DIFG的每一个node,都是一个“Event”,每一条边都代表着下面四种其中的一个:

      线程间data-flow (红线)

      线程内data-flow (蓝线)

      线程间control-flow(线程切换,绿线)

      线程内control-flow (黑线)


    于是,在动态分析过程中,每遇到一个“Event“,就按照上一步解析其内容,并添加到DIFG中。下面给出一个DIFG构建好的例子,线的颜色对应上述四种flow。

      G.O.S.S.I.P 阅读推荐 2023-10-20 POLYCRUISE:跨语言污染传播动态分析





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。

G.O.S.S.I.P 阅读推荐 2023-10-20 POLYCRUISE:跨语言污染传播动态分析

2. Numpy中的Incomplete string comparison:

和上一个漏洞相类似,Python从用户文件读取内容,传入C中进行字符串比较而未经正确验证,有可能导致恶意DoS攻击,因为用户只要传入不正确的字符串就能导致程序“goto fail”。

G.O.S.S.I.P 阅读推荐 2023-10-20 POLYCRUISE:跨语言污染传播动态分析



原文始发于微信公众号(安全研究GoSSIP):G.O.S.S.I.P 阅读推荐 2023-10-20 POLYCRUISE:跨语言污染传播动态分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月17日19:51:19
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   G.O.S.S.I.P 阅读推荐 2023-10-20 POLYCRUISE:跨语言污染传播动态分析http://cn-sec.com/archives/2134150.html

发表评论

匿名网友 填写信息