Cobra - 代码安全审计系统

为什么我们需要一款代码审计系统?

公司越来越大,开发人员也越来越多。每个研发人员的安全素质都不一样,虽然在公司核心项目上可以采取框架层安全防护,但各类新项目太多,无法做到每个项目都使用相同框架,都去集成安全组件。

所以对于公司所有的项目必须有一道防护来保障基本安全,代码安全审计即可作为这一道安全手段。

业内调研

目前业内已经有很多款代码审计工具了

  • w3af
  • Android Scan
  • CMS Scan
  • GrepBugs
  • Pixy
  • RIPS
  • SWAAT
  • CodeSecure Verifier
  • PHP-SAT
  • Yasca
  • Seay

这些项目专注的点都不一样,极少数商用的是定位于企业内代码审计的,但都是闭源的。

还没有一款开源的,并且定位于企业级使用的。

作为甲方企业,我们所需要的:

  • 能快速扫描新型漏洞(Web应用每天都会有新的漏洞/攻击手法出现,一定要能快速响应新型漏洞的扫描)
  • 能够扫描多种开发语言(大公司肯定不会只有一种开发语言,这就涉及到需要支持多种语言)
  • 能够自动扫描、自动报告(人工参与每个项目成本太大)

根据我们的目的筛选比较后发现,没有一款符合我们的需求。

于是我们选择了做一套符合企业级的代码审计系统。

代码审计思路

代码审计大体方式可以分为两种:静态和动态,

1. 静态审计

通过静态分析源码,发现源码中的逻辑、数据处理、函数使用不当来确认源码中可能存在的漏洞。

同时静态分析技术目前也分为几种。

1.1 规则匹配

说白了就是根据指定的规则扫描代码中的问题。

比如在PHP Kohana框架内,是有封装好统一的取参数的方法,并且经过安全过滤的。而可能出现的情况是新来的研发人员不熟悉导致使用了PHP内置的$_GET / $_POST,从而导致XSS,这时就可以使用$_GET / $_POST作为规则,找出源码中所有出现这些函数的地方。

这种方式也是很多白帽审计代码时用到的,虽然很直接了当,但是误报会比较多。

1.2 代码解析法

通过解析代码的语法,分析出代码执行流程。

1.3 数据流转分析

通过Fuzz输入数据,跟踪数据流转,来判断是否存在风险。

2. 动态审计

通过运行需要审计的代码,跟踪数据的流转来判断系统中是否存在漏洞。

我们一开始只打算扫我们关心的漏洞类型:高危文件、高危函数以及常规Web漏洞。

所以我们第一个版本只做静态审计中的规则匹配法,关于误报问题我们在实际扫描中采用了多种方式进行改进,确保误报率在5%以下。

企业应该在什么环节加入代码审计?

1. 代码提交时

代码提交时检测问题是最忌时机,具体可以通过hook svn或git的commit来扫描提交的代码。

优点:及时

缺点:影响提交效率

2. 代码提交后

通过设置定时任务在凌晨进行有规律的代码审计,结果通过邮件或BUG系统同步给提交人。

优点:不影响代码提交

缺点:可能代码已经上线才扫到问题

3. 代码发布时

代码发布前的测试环境进行扫描,上线前必须已经扫描完毕并且没有高危漏洞。

优点:不会出现代码已经上线才扫到问题,确保所有上线代码都经过扫描

缺点:发现的不及时

企业可以先接入在代码发布时,通过设置定时任务扫描来保证及时性和线上代码的覆盖率。

通过我们实际使用感受,发现还有更多用法:

1. 用来判断新漏洞的影响

比如用来判断ImageMagick在公司所有项目中的影响,我们就可以通过设置扫描规则来扫描公司所有项目,看哪些项目有调用ImageMagick并且没有可以利用的。

2. 用来检测明显代码逻辑问题

开发人员不小心将==写成=,造成逻辑问题,甚至可能引发安全问题。

或者是少些了结束的分号,但测试没有覆盖到,导致线上5xx。

这些问题也可以通过代码审计发掘出来。

还有其它更多的使用技巧,后续再慢慢补充...

目前项目进展

目前第一个版本已经上线运行,人工核查后发现扫描结果还是很不错的。

为了填补这块的空白,也为了让更多企业用上并减少安全问题,所以将代码开源到Github上,所有企业可以免费试用。

项目名称:Cobra(眼镜蛇)

项目地址:https://github.com/wufeifei/cobra (Github Wiki内有详细项目介绍)