Java动态代理语法的静态分析方法

作者:{wh1t3p1g}@ArkTeam

原文作者:George FourtounisGeorge KastrinisYannis Smaragdakis

原文标题:Static Analysis of Java Dynamic Proxies

原文会议:International Symposium on Software Testing and Analysis(ISSTA) 2018

原文链接:https://yanniss.github.io/issta18-dynamic-proxies-preprint.pdf

现代的主流语言都支持动态调用语法,如Java的反射机制等。但是,反射和动态加载给语言带来了灵活性的同时,给静态的程序分析方法带来了困难。因为其实现调用的类或方法取决于值的动态流。大多数的研究工具忽略了分析语言的动态特性,导致了其建模不健全。针对这一问题,论文使用了DOOP框架构建了相关静态分析模型,提取出Java语言动态特性中从代理类的产生到动态类函数调用的调用边关系,使得动态加载的类或方法有了一定的取值范围。根据分析得到的取值范围,我们可以对Java语言的动态特性做一定的静态分析。

1、Java动态代理语法的静态建模

论文主要根据Java语言动态代理的语法,针对性地产生相关Datalog语法规则。其主要的分析内容包括变量V,抽象对象O,调用I,函数签名S,类型T,方法M以及自然数N。论文中以发现Proxy.newProxyInstance的调用方法为例,说明Datalog的静态语法规则,共以下四条规则:

a) 寻找符合条件的newProxyInstance


b) 找到invoke函数调用点,并建立调用边


c) 确定传播参数和返回值


  1. 其中上述的分析算法规则调用函数解释,如下


2、实验部分

论文利用类似上述的规则实现了分析工具,并对XCorpus做了动态调用点的分析。XCorpus共包含20个动态调用点,该工具共发现了19个动态调用点,如下表所示


3、讨论

文中采用的Datalog语法简单直观的表达了语法节点的查找算法,但由于缺乏这方面的知识储备,文中仍有一部分内容没有很好的理解,未来还需要学习一下Datalog语法。此外,论文利用语言的动态特性语法,来筛选出一定的取值范围值得学习。针对其他的语言,通过从语法的角度入手,找出一定的限定条件,计算出相关的取值范围,有助于代码审计语言的动态语法特性,如PHP的动态特性,有了一定的调用范围能更好地分析整个控制流的数据流向。Java的静态程序分析已经有了一套成熟的分析框架,应该好好学习一下这些框架的使用方法,为后面的自动化代码审计做铺垫。

发表评论

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