代码安全审计(检测)工具该如何做(一)
源代码安全审计是在整个软件生命周期中提高系统安全性的最有效手段之一,其覆盖面广,准确性高,针对性强,因此一直受到研究人员的重视(不过国内可能并不重视,因为技术不过关,至今国内在等保测评标准中都没有对代码安全审计提出明确的硬性要求)。当前国内有多家机构在做代码安全审计工具,知名的一些顶级的IT公司几乎都在搞,还有一些一流的高校。但是,从市场反映看,当前国内成熟的工具还没有横空出世,个别高校声称有产品,其它较多公司都在奋力研发,具体进展不得而知。仅了解一个国内知名网络公司,其代码安全审计工具的技术方案有偏差,至少和国外一些书中介绍的不一样。一些有眼光的公司已开始利用国外相关工具进行包装后在网络上开展相关服务。近期在一些媒体上也看到了相关代码安全审计技术介绍,感觉只是皮毛。看到一些公司和技术人员在代码安全审计工具研发中苦苦挣扎,个人认为有必要写点东东,也算是对我近几年工作的总结。
首先需要说明,代码安全审计应有两个方向,其一是针对源代码的审计,其二是针对二进制代码的审计。前者国内外研究较多,技术相对成熟。后者国内外相关应用相对较少。本文首先讨论源代码安全审计问题,至于二进制代码则以后讨论。
1 基本核心思路
对源代码而言,其最吸引人的地方在于源代码公开给审计人员,从而最大限度掌握了软件的逻辑关系,乃至设计初衷及运行时可能情况。因此,源代码审计的核心在于分析挖掘代码中的内部逻辑关系,从而发现其存在的漏洞;同时进一步尽力发掘设计、运行时逻辑中存在的问题。显然,从这一角度看,如果仅从特征函数的调用这一角度判断代码安全漏洞则太小儿科了。但是,当前国内一些技术资料、包括一些顶级知名网络公司都利用特征函数,特别是系统调用函数进行判断;当然,也有辅之以简单的变量跟踪分析。
个人认为,源代码安全分析的技术原理是相对成熟的,对源代码内部的逻辑关系的分析基本思路方法也是明确的,这一点在国外相关书籍上有详尽的介绍,在此不班门弄斧了。但个人认为,仅有这些传统的分析方法显然是不够的。如数据流、控制流、类型系统分析等,这些都是不错的源代码内部逻辑关系分析方法,但这些几十年前的方法显然不能应付不断出现的新的安全漏洞。CERT声称有一些漏洞不适合用自动化检测。但个人认为这话只对了一半,那么问题出在那呢?一方面,对源代码的内部逻辑关系描述手段匮乏,也就是仅有的传统方法不适合。另一方面,一些漏洞本身在代码层面并不存在,而是分析设计阶段的问题,与代码无关。当然,也有一些则是在高层特征明显,在底层代码中表现复杂,难以甚至不能描述,这也是代码安全审计难以实施的原因。
在这种情况下,个人认为,代码安全检测/审计的思路应是:抓住传统的检测方法,同时积极拓展新的思路和方法。此外,分析其它层应用中的漏洞形式,积极向代码层映射,从而尽力在代码层予以检测。
2 工程实现思路
2.1 代码原始信息提取
估计很多人在做代码安全审计工具时,已对工程实现的方法有了一个基本的判断:从编译技术入手。当然,不排除有个别大咖利用正则式匹配查找判断(杀猪杀屁股,各有各的杀法,杀死算数,在此不作评论)。在此谈一下我的思路。
代码安全审计首先是提取代码的原始信息,如变量声明定义及引用、函数定义及调用、赋值操作、内存申请及分配等。几年前我用的办法是:自己动手做编译器前端,从词法分析开始,识别单词;而后做语法分析,研究编译原理的LALA算法;分析C、C++、JAVA的文法,花了近1-2年的时间才搞出一个原始信息的提取工具,但性能并不理想。现在看来算是走了弯路了。但弯路上也有意外的收获:LALR算法是国内外研究人员都声称开销最大的,那如何解决呢?我现在算是知道了。另外,整个过程让我确信个人的算法设计能力有了较大的提高,扯远了。
当然,还有其它更多方法可实现代码原始信息的提取,但我同在还没有找到一个能分析所有语言的简单方法,有机会望高手指教。
需要说明一下,利用正则式匹配查找特征函数方法也是一种提取信息的方式,相关论述我所知的最早在2000年MIT有论文对此方法有讨论。
2.2 代码内部逻辑关系分析
在提取完原始信息后,就要分析内部的逻辑关系了,这是个技术活,绝对的理论积累。当然,简单如数据流、控制流在书中已有介绍。可能很多人对此没有概念,但个人认为这是代码安全审计漏洞检出率高低的绝对技术,不多说了,说多了会范错误的。
2.3 漏洞特征分析
在逻辑关系分析完后就要描述漏洞特征了。国内有许多黑客高手,相信对漏洞特征都很了解。但如何描述这些漏洞?那些适合在工具中检测?如何才能给出可自动化检测的计算形式?这个估计要有点计算素养了。估计展开说要讲半本书,不说了。个人认为,简单的方法是看看CERT、CVE、CWE的相关内容,也许会有收获。不过这个要看悟性,我对CVE还不是很了解,在此只有谦虚一下了。
2.4 漏洞检测判定
最后是将源代码逻辑关系特征与漏洞描述的匹配判定,判定检测规则。这个好象有点麻烦。国外相关书上介绍了许多方法,但没有统一的东东,实际应用还要自己琢磨。Fortify谈到利用5个分析引擎进行分析判定。个人认为fortify说的不准确,可能是担心中国市场上的技术人员看不懂,所以就说用5个东东,权当广告宣传策略吧。
3 题外话
做代码安全审计工具是一个难度较大的系统工程(但只是相对复杂的工程应用技术问题,并非超级难),在此只是抛砖引玉,欢迎批评讨论。
代码安全审计还包含二进制检测,这个东东应用范围更广,技术含量更高。在下一篇将提出一些个人在研究中面对的问题,敬请关注。
转自 林孟尼 新浪博客
林孟尼
2016年2月于北京