2020年安全相关的事务变多了,也因此更注重安全合规相关的工作了。其中代码安全审计是安全开发生命周期(SDL)中重要的内容,这一年中也正好负责这块的相关工作,这边做个小结。
代码安全审计的内容
通常关于代码的安全问题有两类:
-
源码安全分析:通过对源代码进行审查,找出并修复代码中的各种可能影响系统安全的潜在风险,通过提高代码的自身质量,达到降低系统风险的目的。往往由于代码量大,代码安全审计一般会借助静态分析类工具,对代码进行自动检测,产生代码安全审计报告。
-
第三方依赖包安全:扫描应用程序(及其依赖库),执行检查时会将漏洞数据库下载到本地,再通过核心引擎中的一系列分析器检查项目依赖性,收集有关依赖项的信息,然后根据收集的依赖项信息与本地的CPE&NPM库数据进行对比,如果检查发现扫描的组件存在已知的易受攻击的漏洞则标识,最后生成报告进行展示。
常见漏洞库
- 美国
- 赛门铁克的漏洞库 https://www.securityfocus.com/
- 美国国家信息安全漏洞库 https://nvd.nist.gov/
- 全球信息安全漏洞指纹库与文件检测服务 http://cvescan.com
- 美国著名安全公司Offensive Security的漏洞库https://www.exploit-db.com/
- CVE(美国国土安全资助的MITRE公司负责维护) https://cve.mitre.org/
- 工控类
- 美国国家工控系统行业漏洞库 https://ics-cert.us-cert.gov/advisories
- 中国国家工控系统行业漏洞:http://ics.cnvd.org.cn/
- 国内:
- 中国国家信息安全漏洞共享平台(由CNCERT维护): http://www.cnvd.org.cn
- 国家信息安全漏洞库(由中国信息安全评测中心维护):http://www.cnnvd.org.cn/
- 绿盟科技-安全漏洞:http://www.nsfocus.net/index.php?act=sec_bug
代码安全审计的工具
源代码安全分析
源代码安全分析的核心在于分析挖掘代码中的内部逻辑关系,从而发现其存在的漏洞;同时进一步尽力发掘设计、运行时逻辑中存在的问题。其主要的思路为:
源代码安全分析应有两个方向:
- 针对源代码的审计:
基于源代码的静态扫描,没有中间文件生成。主要通过收集数据流,生成dom节点,根据上下语义进行分析。
针对源代码的审计的主要特点为可以不需要编译,直接分析出源代码的漏洞。主要的代表为:Checkmax。 - 针对二进制代码的审计:
依赖构建编译的文件,主要的分析技术为:内存建模,符号执行,数据流,路径裁剪等。
针对二进制代码的审计需要依赖构建环境。主要的代表为:Sonar。
当然也有厂商采用两者结合的方案,比如:Fortify。
第三方依赖包安全分析
第三方依赖包安全检查用于扫描应用程序(及其依赖库),执行检查时会将 Common Platform Enumeration (CPE)美帝国家漏洞数据库及NPM Public Advisories库下载到本地,再通过核心引擎中的一系列分析器检查项目依赖性,收集有关依赖项的信息,然后根据收集的依赖项信息与本地的CPE&NPM库数据进行对比,如果检查发现扫描的组件存在已知的易受攻击的漏洞则标识,最后生成报告进行展示。
对于第三方依赖包的检测,比较常用的是OWASP(Open WebApplication Security Project)的开源项目,主要有两个:
- DependencyCheck:
开发团队使用的工具,用于识别项目依赖项并检查是否存在任何已知的,公开披露的漏洞。主要针对单个项目。支持Java、.NET、Ruby、PHP、Node.js、Python等语言编写的程序,并为C/C++构建系统(autoconf和cmake)提供了有限的支持。同时支持和许多主流的软件进行集成,比如:命令行、Ant、Maven、Gradle、Jenkins、Sonar等。
官网:https://owasp.org/www-project-dependency-check/ - DependencyTrack:
安全团队使用的工具,实现第三方组件的安全统一管理。
官网:https://dependencytrack.org/
代码安全审计的落地
关于代码安全审计,主要的问题在于:误报、漏报。一般情况下,代码审计工具采用清洗、以及自定义规则的方式,应对上述问题。
因此,在实际代码安全审计操作过程中,主要在于在实践中不断的:
- 调整自定义漏洞规则,以完善漏洞库;
- 调整自定义清洗规则,以减少误报率;
通常在初步引入代码安全审计时,通常:
- 先适当的选择部分的工程,能过这批次的工程,调整漏洞规则、清洗规则,得到可接受的工程落地结果;
- 而后适当的增加工程,不断重复上述的步骤,直到所有的工程都进行代码审计为止;
按介绍经验,预计上述步骤需要经历半年到一年的时间,才能完成代码审计工具的引入。
参考文档
- https://github.com/dependency-check-team/dependency-check
- https://www.microfocus.com/zh-cn/products/static-code-analysis-sast/overview
- https://docs.sonarqube.org/latest/