代码安全审计是查找代码中安全漏洞的方法。在“安全左移”的发展趋势下,代码审计逐渐成为确保代码质量的一个关键环节。代码安全审计通常可以分为:自动化审计和人工审计。
自动化代码安全审计是以自动化工具的方式查找代码的安全漏洞,这样的工具一般称为静态代码检测工具(SAST)。SAST的一大优势是能够极大地减少查找代码漏洞的时间。
然而,这类工具往往最让人印象深刻的首先就是“误报率”,据统计,SAST类的产品在OWASP基准测试中最高检出率达到85%,但误报率也高达52%。高误报率的主要原因在于程序无法准确理解开发人员的代码含义。其次,自动化代码安全审计往往无法查找业务相关的漏洞,比如支付漏洞、任意密码重置,优惠券叠加等。
相比于自动化,人工审计优势在于查找业务逻辑相关漏洞,但对应成本也远高于自动化工作,主要体现在两方面:
① 学习成本
审计业务逻辑漏洞需要做到“三懂”:
a) 懂代码。不同系统使用的代码和开发平台是不同的,Java、C#和PHP甚至是C++,各自关注的安全点也各不相同。而且很多安全问题在框架层次就已经解决掉了,典型的认证问题可用Shiro解决。如果看不懂框架,那么连实现的地方都无法找到,更不用说找出问题了。
b) 懂业务。查找业务问题需要对系统业务有深入的了解,除了密码重置等通用型业务,还包括不同行业的独有业务,如电商的支付和优惠券、金融的转账对账等。
c) 懂安全。在了解代码和业务的基础上,还需要从攻击者视角审查业务安全漏洞,才能进一步发现业务中可能存在的安全问题。比如典型的任意密码重置漏洞、优惠券叠加漏洞,都需要审计人员理解漏洞原理和实现方法,才能“对症下药”查找业务逻辑的不足。
② 时间成本
人工代码安全审计的时长取决于代码量的多少。随着代码和业务复杂度的提升,完整实施代码安全审计所需的时间成本也同步增加。
因此自动化和人工审计两种方法并不是相互对立的,而是互为补充,二者并用才是业界代码安全审计的最佳实践。
代码安全审计流程
从上面的审计流程可以看到,代码安全审计工作的关键环节在于:
1. 设定审计基线,包括三方面:
a) 针对代码和开发平台的基线。这里需要考虑的是代码开发语言、架构、安全审计质量准则等。不同代码和平台之间关注的问题也不同。
b) 合规基线。很多组织需满足合规要求,一些合规条例包括:等级保护要求、支付卡行业标准、中央银行规定以及PCI-DSS(第三方支付行业数据安全标准)等。
c) 针对漏洞的基线,即需要明确代码安全审计要覆盖哪些漏洞,仅仅覆盖OWASP Top 10的漏洞还是要覆盖所有类型的漏洞?
2. 人工审计。主要分为两部分工作:
a) 验证工具扫描出的问题。
b) 查找工具未覆盖的安全问题。
代码安全审计在整个SDL流程中非常重要,属于系统开发阶段的白盒测试。
很多人会将代码安全审计和渗透测试作比较。二者主要区别如下:
① 阶段不同。在SDL流程中,代码安全审计早于渗透测试,通常在开发阶段就可以实现。而渗透测试则出现于系统测试阶段。
② 覆盖范围。通常代码安全审计的覆盖范围高于渗透测试。
③ 漏洞定位。代码安全审计可以直接定位到漏洞的代码,渗透测试通常做不到。
④ 直观。渗透测试比代码安全审计更加直观形象,可以在运行的系统上直接验证问题。
在SDL实践过程中,至少要有自动化代码安全审计,即SAST工具。对于重要的业务系统,需要进行必要的人工审计。同时,在大量实践的基础上,默安科技专家团队发现渗透测试和代码安全审计也能够相互促进,二者相互耦合,利用代码安全审计发现问题,然后通过渗透测试验证问题,充分发挥各自的优势,达到事半功倍的效果。如下图所示。
代码安全审计虽然在SDL流程中非常重要,但业界并没有统一的标准指导这项活动,导致很多企业也没有专门的技术人员学习并完成这种对技术水平要求较高的安全开发实践活动。
为了解决这个问题,默安科技安全开发专家团队选取和整理了国外较权威的《OWASP代码审计指南》,可以作为代码审计工作的参考。
《OWASP代码审计指南》第二版旨在为软件开发和管理人员提供代码审计的最佳实践,包括如何在软件安全开发生命周期中使用该指南。以下附上完整目录。
详细中英文文档请在公众号聊天框回复“代码审计”获取下载链接。注:文档所有权归OWASP所有,中文版仅供业内人士学习交流。推荐阅读
觉得不错点个“赞”、“在看”,支持下小编