盒子
盒子
文章目录

Paper Read

这篇属于测试得结论类型的论文,测了市面上的一些静态代码分析的工具(CPPCheck、Joern、Comm_1、Clang、CodeQL等),再精心挑选了几个比较典型的漏洞(几个维度,代码库的大小、真实漏洞、bug复杂度、bug发现难度、C++等)。

首先做了第一个实验,用这些分析工具去检测源码看看漏洞发现率,列出了各个工具对应各个漏洞是否能发现的表格(其中有些工具例如CodeQL是需要自己写规则,这个规则由作者综合考虑编写),结果当然是Clang、CodeQL发现效果最好。

第二个实验是把编译好的代码反编译(用IDA、Ghidra、RetDec),比较了一下这些反编译工具在反编译程度上的不同,例如原编译代码上的总行数和反编译后的代码总行数对比(IDA反编译后增加的行数最少),GOTO语句的数量(IDA生成的最少),反编译后函数声明的参数数量(IDA丢失参数最少)等等。接下来就是把反编译的代码重编译(有的静态代码分析工具只能是白盒分析)后交给静态代码分析工具去分析了。

然后测试结论先是静态分析工具在重编译后的分析结果中的积极影响,最终分析结果重编译后漏洞检出率大概为71%,但是这个结论的前提是需要人工将反编译后的代码转化为可编译的代码。不过对于这个检出率来说,静态代码分析工具在黑盒二进制文件中的效果还是不错的。还有一个是这种情况下可以发现源码分析检测不出来的漏洞。

再然后是消极影响,就是分析工具的误报率与源代码检测相比上升了。基本都有比源码检测多50%以上的误报率。这个误报率其实是比较高了。

其次又做了一个编译时优化选项(O1、O2、O3等)对测试工具在重编译上的分析结果的影响。最终是没有发现有明显的影响。

同时改论文还详细说明了积极影响中检测出没检测到的漏洞的情况,大概就是在源代码的情况下,有的漏洞可能是在一个函数中的好几层中(A文件中的某个函数包含了B文件中的某个函数),而在反编译的情况下,会消除这种文件隔离的情况,将两个函数整合在一个函数当中,如下漏洞:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Double free source code
static void string_fvalue_free(fvalue_t *fv)
{
gfree(fv−>value.string);
}

static gboolean val_from_string(fvalue_t *fv)
{
string_fvalue_free(fv);
return True ;
}

gboolean val_from_unparsed (fvalue_t *fv, ...)
{
string_fvalue_free(fv);
...
return val_from_string(fv, ...);
}

思考:

  1. 反编译后重编译,经过工具检测也能有比较高的检测率(71%,与源码检测相比),或许可以应用在黑盒测试领域。但是比较关键的一点就是如何提高重编译的效率,也就是伪代码变可编译代码的效率。
  2. 重编译后能够检测出源码检测不出来的漏洞,原因是因为ida这种反编译器做的一些优化策略导致程序间的代码变成了程序内。代码审计的时候有时候看反编译的代码或许比审计源码来的更有效。
支持一下
扫一扫,支持v1nke
  • 微信扫一扫
  • 支付宝扫一扫