让数据大白于天下:GCC 插件实现代码分析和安全审计
摘要: 如何利用 GCC 的插件功能,辅助安全分析人员实现对程序的安全审计、漏洞检测、安全加固等自动化处理能力,提升分析效率和精准度。
本文分享自华为云社区《利用GCC插件实现代码分析和安全审计》,作者:安全技术猿 。
GCC 4.5.0 开始引入的一项插件功能,允许用户通过插件来干预 GCC 的编译过程,获取到 GCC 编译过程中的各种数据,甚至可以修改编译过程中生成的中间数据,从而达到修改最终生成的二进制文件行为的目的(注:特别需要注意的是 GCC-Plugin 的 API 是会随版本变化的)。此特性从程序员的角度来看,就相当于把原来 GCC 的黑盒编译过程一下子打开了,GCC 编译的过程数据可以“大白于天下”,可以清清楚楚的看个够。
下图为 GCC 编译架构
GCC 编译过程与插件的交互流程
注:图引自 DragonEgg 在"Reimplementing llvm-gcc as a gcc plugin"
开源 GCC 插件列表(来自https://gcc.gnu.org/wiki/plugins):
基于 GCC 此插件特性,从安全测试的角度来看,可以用它来干什么呢?
A、 可以把 GCC 编译过程的内部数据结构图形化,方便分析应用程序。
图形化对象可以是控制流图、函数调用图、支配图、Tree 结构、Gimple 结构、RTX 结构、Pass 列表等等。GCC VCG Plugin 就是一个实现该功能的 GCC 插件(参考链接信息:http://code.google.com/p/gcc-vcg-plugin)。
下图是 Gimple 层次图:
B、 利用可以修改中间数据的能力,可以不用修改源代码就能添加新功能的功能,从而实现动态安全分析、安全加固的能力。
在安全测试中为了监控程序执行路径情况,需要通过动态插装来实现,常见的插装工具有 Pin、Dynamo,但这些动态插装会对程序的运行性能产生影响,降低程序运行效率,严重的会导致程序不能正常运行。但如果能预先在目标程序中把插装代码编译进去,这样既兼顾到性能,有兼顾到实现插装的目的,一般要实现这个目的都是在源代码层面由开发人员增加插装代码,但增加的代码只是为了测试的目的,在实际发布版本中是不需要的,因此直接在源代码层面增加插装代码就给代码维护带来的不便,但如果我们应用 GCC 编译器的插件能力,在编译构建过程中自动添加插装代码到最终生成的二进制文件中,这样只需根据需要重新编译就能得到不同目的的应用程序而不需要修改任何一行源代码,既增加插装代码的动作对上层是透明的。
基于上述在编译过程中自动增加插装代码,可以实现对测试活动的度量和提升测试效率,比如测试时代码覆盖率的统计与度量,基于执行路径来优化测试用例提升 fuzz 效率等等功能。
总结:
利用 GCC 的插件功能,可以利用编译过程中的内部数据来帮助安全分析人员对程序进行安全分析和安全加固等事情,提升程序分析效率和分析精准度。
可以试试下面的漏扫服务,看看系统是否存在安全风险:>>>漏洞扫描服务
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/5a788ea01cee7afc3bd9799e2】。文章转载请联系作者。
评论