CodeQL从入门到入土 | 您所在的位置:网站首页 › 静态代码分析方法 › CodeQL从入门到入土 |
为什么在现在写这文章 CodeQL传闻找到了Log4j的漏洞,这段时间上边要求,把公司系统内部常见的问题用CodeQL写检测脚本,用于系统长期检测。主要是记录这段时间的学习,以及自己总结的常用写法。 一个需求,不同人写出来的脚本可能完全不同,各种内置库用法多样,表达式和参数等各种类型之间的转换也很麻烦,本文会提供案例一步一步从分析需求一步一步走下去。 CodeQL是什么如果你已经了解CodeQL是什么,可以直接跳过这个章节。 当谈及代码分析和漏洞检测工具时,CodeQL无疑是一款备受推崇的解决方案。作为一种革命性的语义代码查询语言,CodeQL在软件安全领域展现出了卓越的实力。 语义分析的特点是,搜索规则能在一定程度上理解代码上下文,内置的数据流判断十分强大,也可以自行补充各种例外场景。最基础的脚本需要定义,source(输入源),sink(污染点),比如检测SSRF漏洞,source为外部用户输入,sink为创建URL链接的点,可能是new URL(),也可能是其他的不在默认库里的,可自行添加。 CodeQL是由GitHub开发的一种强大的静态代码分析工具。它基于高级数据流分析技术,可深入理解代码结构、语义和行为。这意味着CodeQL能够超越传统的基于规则或模式匹配的静态分析方法,更全面地检测代码中潜在的安全风险和缺陷。 它提供了一个灵活的查询语言,使开发者能够针对不同编程语言和框架编写自定义的代码查询。通过CodeQL,开发者可以发现诸如内存泄漏、空指针引用、SQL注入等常见的漏洞,并及时修复这些问题,从而提高代码的质量和安全性。 与其他工具相比,CodeQL具有独特的优势。首先,它不仅仅是一个工具,而是一个完整的静态分析平台,提供了丰富的内置库和查询示例,帮助开发者快速上手。其次,CodeQL支持多种编程语言,包括C、C++、Java、Python等,使其适用于各种项目和团队。此外,CodeQL还具备可扩展性,可以根据具体需求进行定制和扩展,以应对不同项目的特殊需求。 CodeQL安装CodeQL本身包含两部分解析引擎+SDK。 1、官方规则库,各种内置的ql脚本,这部分是开源的,地址:codeql-sdk 默认推荐将路径添加进path环境变量(多个版本另外说)。 命令行运行codeql -v,输出结果说明安装成功。 2、数据库编译引擎,不开源,只有二进制执行文件。将源代码转换为CodeQL脚本能识别的抽象语法树。 地址:codeql-cli 下面以java为例,利用codeql引擎对java代码进行编译,在pom文件目录执行。 codeql database create java-database --language=java --command="mvn clean install -Dmaven.test.skip=true --settings 路径/setting.xml"源码目录会生成 java-database目录,打开看看里面有src.zip文件才算编译成功。 因此,编写一个最简单的CodeQL脚本,需要代码中指定SDK路径,编写代码后用解析引擎运行。 编译中的注意点:1、源码目录不能有中文 2、网络问题导致编译错误,比如公司内部网络可能要加证书啥的 CodeQL基本语法&常用语法总结基本语法CodeQL的查询语法有点像SQL语法,基本结构如下: import /*导入对应的语言包*/ from [datatype] vat /*构建数据类型表,便于理解可以认为是声明变量*/ where condition[var = something] /*设置逻辑表达式*/ select var /*打印结果*/其实就三个步骤,定义数据类型,设置条件,进行查询。 谓词在CodeQL中谓词可以说是最常见的概念,叫做 Predicates,可以理解为类似函数。PS:谓词首字母要小写。 谓词也分为有返回词和无返回词(下面有例子) 先说无返回值的,个人比较常用。 个人拙见说下无返回值谓词的作用。CodeQL的查询大概是这么个流程,定义一张大的数据表,然后根据脚本一步一步缩小数据表的内容,同时构建各种数据之间的关系,最后把满足条件的数据查询出来。那谓词的作用,就是用来缩小数据范围,也就是做限定。最简单的例子,定义一张整数类型的数据表,然后限制数据只能在1-10之间,这就是无返回值谓词的作用,用于限定数据集。 比如: predicate isList(Parameter p){ //声明谓词,入参为参数类型 p.getType().toString().indexOf("List |
CopyRight 2018-2019 实验室设备网 版权所有 |