代码安全审计浅析

近些年来,随着我国社会发展和科技进步,在军事、航天、航空、能源、金融、公共安全等众多领域,国家大型关键基础设施正在向着更强、更高的水平急剧跃升,呈现出超大型化、复杂化、安全关键的特征。软件在系统中起到核心的作用。随着软件规模的日益增大,代码数量由几万行,发展到现在经常出现几十万行,甚至几百万行代码的规模,系统的逻辑结构越来越复杂,只靠人工基本上无法满足代码审计的对于时效和成本等各方面的要求。

代码安全审计的目的通过对源代码进行审查,找出并修复代码中的各种可能影响系统安全的潜在风险,通过提高代码的自身质量,达到降低系统风险的目的。往往由于代码量大,代码安全审计一般会借助静态分析类工具,对代码进行自动检测,产生代码安全审计报告。

如果人工代码审计由人工完成,则审计质量主要是由人的技能和经验决定,不可复用和传承。当前,由于软件安全问题越来越突出,国家对软件安全问题也越重视,出台了很多软件安全相关的标准和指南,例如2019年12月1日正式执行的网络安全等级保护2.0,其中对代码安全提出了明确要求。同时对软件质量要求越来越高的前提下,与软件测试相关工作尽量左移,注重和提升代码的交付质量。在开发阶段对研发工程师每天提交的代码进行检测,及时发现和修复缺陷,成为业界和研究领域的热点。

由于软件测试技术的不断发展,以及对软件缺陷模式和安全漏洞模式的研究,促进了软件静态分析技术发展,通过对程序代码进行静态分析能够发现很多语义缺陷、运行时缺陷和安全漏洞,静态测试在软件测试中的重要性越来越突出,尤其是军工科研院所,代码规模的增加以及伴随而来的是越来越复杂的代码结构,完全依靠人工代码审查,成为制约生产效率的关键因素,采用代码自动化分析技术,能够提升开发和测试效率,减低程序风险,同时也降低了研发成本。而军工企业之外的金融、互联网、物联网、AI、无人驾驶等领域,庞大的程序代码如果依靠人工审查也是基本上无法完成的工作。等保2.0评估认证的企业,也需要强有力的代码审查工具,能够在非运行状态下全面审查代码中的安全风险,如果没有成熟的安全审计工具也基本是无法完成的任务。

那么,作为一款代码安全审计工具,应该具有什么样的功能呢?

  1. 首先,能够支持主流的开发语言,至少能够支持JAVA、JSP、JavaScript、Hmtl、Python、PHP网站开发主流语言和框架;
  2. 其次,支持尽可能多的安全检测项,尽量正确报告代码中的缺陷、漏洞和潜在的编码风险(例如bad smell),也是考察工具可用性的必要条件;
  3. 第三,不管是测评中心、开发团队、安全团队、代码安全审计人员,获得可编译可执行的程序代码可能性较低,因此加载任何代码都能检测,不用编译也是考察代码安全审计工具所应具备的;
  4. 第四,在国内使用,操作和审计报告全部是中文也是必要的。另外就是定制功能,能够根据不同的代码审计要求,选择审查范围、确定检测项也是必要的,最好能够快速定制检测项;
  5. 第五,目前软件开发过程中,大量引入开源组件和第三方库,能够支持对开源组件和第三方库的检测也应纳入必要条件。同时,能够快速响应客户需求,支持快速升级,能够在一定程度上减少0day漏洞的危害,也应纳入审计工具的考察范畴;
  6. 最后,代码安全审计也是一个新兴的业务,之前,除了军工科研院所比较重视之外,金融、互联网等企业没有引起足够的重视,对于代码安全审计到底怎么做,检测出什么结果是对的,工具漏报、误报是怎么度量的,可能不太清楚,所以需要厂商提供完整的解决方案,包括咨询服务、培训服务等;

在国内,很多企业使用开源代码检测工具作为代码安全审计工具,这虽然解决了有无问题,相对于没有这个环节,开源工具能够检测一部分缺陷和漏洞,这在一定程度上也满足了部分企业对于软件质量较低的要求。但是对于质量要求高的企业,开源检测工具的缺陷高漏报,高误报率显然无法满足对于代码质量要求高的企业。

   那么代码安全审计是什么样的工作流程呢?

从上面的审计流程可以看到,代码安全审计工作的关键环节在于:

 

  1. 确定审计策略,审计策略主要考虑的是代码开发语言、架构、安全审计质量准则或出口准则、检测效率等;安全审计质量准则/出口准则需要考虑检测工具是否能够满足对检测质量要求,也就是对于检测项的覆盖,同时工具应该具有弹性扩展。
  2. 部署环境,主要考虑代码审计工具能够适合公司所有的物理环境,包括网络、服务器、工具兼容性等;
  3. 工具扫描,主要考虑代码工具的技术指标,例如工具支持的开发语言、检测精度、效率,是否支持迭检测、CI模式下检测等;
  4. 人工复核,主要考虑人工复核的工作量,检测结果是否容易复核。这就要求检测工具精度高、结果容易检查、误报少;
  5. 审计结果和报告,主要考虑的是根据需要是否能够自动产生审计结果、审计报告,报告能够根据需要求孽缘定制;检测结果和报告,中文显示,便于阅读。检测过程能够跟踪,回溯。
  6. 出口准则,能够根据代码审计需要制定审计范围、选择审计安全漏洞的严重程度级别。检测完成,能够判断是否满足选择的出口准则,便于快速决策。
  7. 开发修复,主要考虑检测结果是否便于开发人员修复、安全漏洞能够快速定位、提示信息准确、甚至能够自动进行修复或给出修复检查代码。检测精度高,误报少,漏报少,这就要求检测工具比较成熟,且得到国际公认组织的认证、认可,符合国际、国内主流标准。同时,对于开发团队确认和修复代码可以提供培训和支持。

       各位,看到这里是否已经大概清楚,基于上面对代码安全审计的流程和所应具备的功能描述,你应该知道如何去选择一款静态分析工具或缺陷检测工具、代码审计工具了。但是切记国内很多所谓的代码安全审计工具只是简单的文件扫描,根本无法做到大工程跨文件的检测,只能通过特殊的正则表达式去检索潜在风险的函数、硬编码等。这样的工具虽然可以生成各种漂亮的报告,但是真正懂代码的人,会很容易发现这样的代码审计报告只能走过场,对于发现和修复代码中的潜在风险,改进代码质量是无好处的,消耗开发人员的时间排除各种误报,肯定也会得到开发团队的抵制的。下一期,我会列出主流的可以进行代码安全审计工具的对比。

 

(完)

关注安全  关注作者

发布了309 篇原创文章 · 获赞 31 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/manok/article/details/103702975