源代码安全之自动化扫描工具Checkmarx
"安全左移"是指在软件生命周期的早期阶段采取预防措施来解决安全问题,以减少在生产环境中解决安全风险所需的时间、金钱等成本,并避免更大的安全风险,它已成为软件行业的共识。静态代码分析是实现"安全左移"的重要技术手段之一,它可以通过扫描源代码识别潜在的技术和逻辑缺陷,从而帮助开发人员和安全专业人员在开发过程中及时发现和修复问题。
Checkmarx是一款优秀的静态代码分析工具,支持23种编程语言,涵盖了绝大多数应用中使用的编程语言。支持检测数百种漏洞,包括SQL注入、跨站脚本攻击、代码注入等。Checkmarx还提供了丰富的报告和分析功能,可以帮助开发人员和安全专业人员更好地理解和解决问题。它也是联想使用的SAST工具之一。本文将介绍Checkmarx的原理及如何更好地使用它。
Checkmarx对源代码的分析过程主要包括以下几个步骤:
1.提交扫描:Checkmarx通过本地上传、Git拉取等方式获取源代码,并配置扫描策略将其派发给扫描引擎。
2.代码解析:利用扫描引擎对代码进行词法、语法分析,识别每一个代码元素的含义,比如变量、表达式、方法定义等。
3.生成AST(Abstract Syntax Tree):根据代码解析的结果生成一个树状的数据结构,即抽象语法树。
4.构建DOM(Document Object Model):在AST之上去识别每个元素之间的关系及赋予每个元素DOM属性。
5.绘制DFG(Data Flow Graph):绘制数据流图,其中每个节点表示一个变量或表达式,每个边表示数据流的传递。
6.执行Query:通过预定义的Query即扫描规则于DOM上查找想要的代码元素及通过DFG过滤来生成最后的扫描结果。
在源代码分析过程中,Checkmarx扫描引擎负责代码解析、生成AST、构建DOM以及绘制DFG。我们所能干涉的只有第一步提交扫描和第六步执行Query。因此,优化Query便是我们优化Checkmarx扫描结果的主要途径。
通常,判断数据流是否存在风险需要考虑三个方面:是否有外部输入、是否有中间清洗方法、是否有输出。
例如,以下是Checkmarx检测反射型XSS的原生规则,它便是一条典型的Query。
然而,由于Checkmarx是一款自动化的静态代码分析工具,可能会出现一些误报和漏报,特别是在分析开发人员自定义方法时容易出现偏差。当Input、Sanitize、Output这三个方面出现任何偏差,就可能导致漏报或误报。以XSS为例,以下是Checkmarx识别的一条反射型XSS的结果。
该结果包含从request获取的location作为输入和最后的println作为输出。然而,由于Checkmarx未能识别escape函数的清洗,导致Checkmarx将其识别为存在XSS漏洞的数据流,从而产生了误报。为了解决这个问题,我们可以自定义规则,将escape函数添加到Find_XSS_Santize查询结果中,以优化扫描结果并消除误报.
原文始发于微信公众号(联想全球安全实验室):源代码安全之自动化扫描工具Checkmarx
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论