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