[备份] gadget-inspector如何处理分支

由于是分析字节码,不存在字节码解释器,所以遇到iffor循环等相关的跳转指令,实际上不会跳转,一直是顺序执行和分析。这时候应该如何进行分支情况是一个问题。

SPEL检测

以一个SPELRCE检测为例,我们从最简单的一个例子来看:

这里有三个关键点:

换成检测代码如下:

虽然以上代码我已经写了注释说明,不过换成字节码来看也许更容易理解:

分支问题

以上的规则看起来似乎没有问题,但如果是这样的代码,将会无法检测

无法检测的原因可以从字节码分析出

由于不会真正地处理跳转指令,所以会顺序分析到两个分支,导致污点信息被覆盖

分支处理

当遇到跳转指令的时候,应该保存当前栈帧的污点信息,并且实际分析到跳转指令对应的Label时,恢复之前的栈帧污点信息到当前栈帧。

全局维护一个Map保存每个Label当前的栈帧污点信息

当遇到跳转指令后的逻辑

核心的保存于合并的方法mergeGotoState

visit到对应的label时代码如下

通过以上的分支处理逻辑,案例中的漏洞将可以被检测到