讨论代码安全审计(检测)工具该如何做(二)

代码安全审计(检测)工具该如何做(二)

二进制检测

 

 

前段时间写了源代码安全检测工具研发感想之后,就一直在酝酿写二进制工具的事。个人认为,二进制检测是最具挑战性的,能彻底改变当前信息安全生态环境的重要工具。需要说明的是,二进制检测本人只是有点构想,做了初步的分析,算是抛砖引玉,以引起国内相关人员的重视。

1 如何定位二进制检测

许多人接触过软件安全检测,有许多概念,有一些人也许并没有全面系统的认识。软件检测有白盒检测、还有黑盒检测。黑盒相信许多国内大咖都了解,也有一些大咖一直在做,具体如渗透测试等,对此我并不在行,也不是本文讨论的要点。另一种是白盒测试,即知道代码的测试。但在此应说明代码有源代码和二进制代码。通常意义上说的代码白盒测试都是指源代码的静态检测,很少有人提及二进制的白盒测试。我猜测这可能是由于技术限制,二进制白盒测试实用的技术工具很少见。源代码和二进制代码测试都可归结为一种静态分析。当然,二进制代码也有作运行时动态分析的。

相比黑盒测试,白盒测试的优点我就不多说了。网上都可找到,如覆盖面全等。从国内外的发展看,黑盒测试由于不能回答漏洞的完备性问题,随着时间的推移,用户对安全要求的提高以及技术的进步,相信黑盒测试将从当前的主流地位转向小众化(以黑盒测试为营生,拿不菲收入的大咖可能要有眼光了,不过这个过程可能要5-10年)。为什么相比黑盒测试,白盒有这些优点呢?个人认为,首先是白盒能深入分析系统内部结构,掌握的信息是黑盒不可比的。我想这才是代码安全检测的精髓:深入软件系统的内部逻辑结构,背离了这个要点的代码安全检测肯定是没有前途的。

相比而言,源代码直白易懂,检测理论、手段方法成熟,个人估计近期将发展成提高信息系统安全的主要检测手段,从而取代渗透测试。这一点从国外大力发展源代码安全检测工具,当前已有三款相关工具进入中国市场的现实可见一斑。

但源代码安全检测毕竟有一个大前提,取得源代码,这在很多场合是很难给出的,这也就限制了源代码检测的应用。显然,二进制检测相比而言就有得天独厚的优势。二进制检测拥有白盒相对黑盒的所有优势,而且没有源代码的限制,具备黑盒的灵活性优势。随着技术的发展,个人相信二进制分析将成为提高系统安全的检测技术主流,其市场空间不可限量。此外,可以想象,如果二进制检测工具大行期道,当前国内外许多有小想法的公司所供养的一些大小黑客的生计估计就有影响了。

2 二进制与源代码的区别

门外汉可能认为,二进制和源代码是一致的,只是表现形式不同。这个观点对用户而言是对的。但是,有一点编译基础的人可能就不认同了。源代码编译生成二进制时,是经过了许多变换的,编译器加了了大量的代码,例如,针对各种优化的变化、针对指令选择、寄存器分配、代码生成等都对代码有大量的修改。这些估计国内做过编译器研究的大咖都懂,也能理解。但还有一处更大的变化,却是国内外相关研究人员都没有重视的。由于技术分工与发展,国外少有研究人员分析编译器前端相关技术,如语法制导翻译,国内相关研究就更罕见了。这样的后果是:研究人员没有看到在编译器制导翻译过程中对源代码做了大量的变换,即使一个条件判断语句,经过制导翻译后生成的中间代码也是面目全非的。又如,对过程调用前后要加入大量的代码,这些都是导致源代码和二进制代码区别很大的原因。

当然,二进制本身的格式让人看起来头皮就发麻。但现在有大量相关工具,这些格式问题应不难解决。

3 分析二进制代码的方法

3.1 源代码分析方法可用于二进制吗

在源代码分析中,许多方法,如数据流,控制流等,相信许多人都很熟悉。显然,这些方面的基本思想还是可用于二进制分析的。但是,一些类型分析可能并不适用二进制场合。总体来看,源代码检测分析的一些认识,在二进制中要有大的改变。如变量、对象、过程等都化为更小逻辑单元,试图从二进制代码中恢复这些要素和逻辑,个人认为不是一个较好的办法。我一朋友还因此下结论二进制是不可分析的,因为很难从中还原相应的变量、函数等。当然,数据流分析、污染分析等的基本思想还是值得借鉴。

3.2 如何对二进制分析

说真的,我也不知用那种方法能对二进制进行较好的分析。凭直觉谈几点个人的看法。(一)算大帐,看总体输入输出,如数据流分析。对于软件内部的安全性问题,不一定要关注,有问题在内部,不至于让失控。因此二进制分析首先是检测对外部的输入输出反应,从这一角度分析其安全性。以此为指导,对二进制程序进行模块划分,分析模块的特征也是一个好方法。当然,如何划分模块也是要深入研究的问题,具体方法不同人用不同方法。(二)个人认为分析内存变化逻辑也是一个重要的手段,二进制程序的内存变化跟踪相对容易,至少对象明确。(三)个人认为,在二进制分析中,由于涉及软件底层,属细粒度特征分析,抓取跟踪不同要素的序列化特征,将细粒度问题向粗粒度转化是基本方向。

总体来看,个人认为二进制分析关键在于以安全原则为最高准绳,以机密性、完整性、不可否认性、隔离原则等为目标,设计分析方法。否则,二进制分析的基本目标都有可能搞不清楚,对内部逻辑结构就更无从下手了。当然,按这个思路来分析二进制代码,估计要做大量的原创性研究,这是一个挑战,搞得好也会成为一个优势;但可能对很多人来说会是一个难以越过的山。

当前,国外有一些软件宣称能对二进制分析,但其实质是对二进制代码进行特征码比对,前提是建立庞大的二进制漏洞特征码库,这也是一种方法。但说它是二进制分析方法则违背了代码检测的精髓。作为一款商用软件,这种思路和杀毒软件一致,没有先进之处。

当然,这只是我个人拍脑袋的想法,并不成熟,也许明天就有人笑话我,权当引玉。需要说明的是,国外可能对二进制分析有许多论文,给出了一些优秀的分析方法,也可作为借鉴。

4 如何做二进制检测工具

对于如何做二进制检测工具,前期有一些想法。但具体研发还没有真正展开,谈不上经验,只能是讨论。个人认为,二进制分析的实质还是文本分析,文本也属一种数据,在当前大数据分析技术飞速发展的环境下,文本分析的思路原理有很多,在此不多说了,说多了限制大家的思路。

 

 

欢迎大家交流讨论。二进制安全检测工具开发将是我下一个重要研究方向,有兴趣的可合作交流,形式不限。

 

林孟尼

2016年3月于北京

转自林孟尼新浪博客

1人评论了“讨论代码安全审计(检测)工具该如何做(二)”

  1. 技术上讲,binary analysis并不复杂,难的是准确性和性能。 offline分应用场景比较窄,inline难度很大,但做出来就很有用了(参考Chrome sandbox)

发表评论

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