CodeQL在代码审计中的应用

news2024/11/17 14:45:47

一、CodeQL简介

CodeQL是一种基于静态分析的程序分析工具,由GitHub开发和维护。截止到此刻,CodeQL在Github上已经有超过6100个Star。它可以用于发现代码中的漏洞、代码质量问题和安全问题。CodeQL使用了一种特殊的编程语言QL(查询语言),可以帮助开发人员进行更加高效和精确的代码分析。
CodeQL的核心思想是使用数据流分析技术去发现代码中的潜在安全问题和漏洞,它可以在编译时或者运行时对代码进行分析,找出潜在的程序缺陷和安全隐患。CodeQL不仅支持多种编程语言,而且提供了大量的现成代码库和规则,使开发人员可以快速地构建和扩展自己的代码分析平台。

二、CodeQL环境搭建

2.1 引擎安装

引擎不开源,可以直接下载二进制文件使用。https://github.com/github/codeql-cli-binaries/releases 下载已经编译好的codeql执行程序,本次下载windows平台是安装包。添加codeql环境变量。
在这里插入图片描述
查看codeql命令,验证安装是否成功。
在这里插入图片描述

2.2 SDK安装

https://github.com/github/codeql 下载代码仓库。

2.3 Vscode开发插件安装

Vscode插件搜素codeql,并且配置codeql的引擎路径。
在这里插入图片描述
在这里插入图片描述

2.4 验证开发环境

CodeQL的处理对象并不是源码本身,而是中间生成的AST结构数据库,所以我们先需要把我们的项目源码转换成CodeQL能够识别的CodeDatabase。本次使用开源靶场项目java-sec-code(https://github.com/JoyChou93/java-sec-code)。
1、 下载靶场源代码到本地,创建数据库。Java语言需要编译,db-ql为数据库名称。
codeql database create db-ql --language=java --command=“mvn clean install”
在这里插入图片描述

2、 Vscode添加数据库db-ql
在这里插入图片描述

3、 选择sdk中的\ql\java\ql\src\Security\CWE\CWE-078\ExecTainted.ql文件,运行ql查询语句查找源代码中的命令注入漏洞。
在这里插入图片描述

查看结果可以看到检测出四处命令注入,可以看到代码行数,能够追踪代码流程图,点击可以跳转到对应的源代码文件中。
在这里插入图片描述

4、 使用analyze命令可以导出excel格式的漏洞。
codeql database analyze “G:\java\SecExample-main\webgoat-ql”
“G:\java\CodeQL\ql\java\ql\src\Security\CWE\CWE-078\ExecTainted.ql”
–format=csv --output=result.csv

三、CodeQL检测原理

3.1 数据库生成原理

它的工作流程大致是,在javac编译目标代码时,通过Extractor与其进行交互。Extractor会根据每一个java文件的内容生成一个trap文件,后续再根据trap文件生成实际的数据库。同时它会将处理的每一个java文件拷贝一份保存在数据中,便于后续展示查询结果时能看到代码的上下文。
在这里插入图片描述
VSCode中可以看到抽象语法树(AST)
在这里插入图片描述

3.2 QL查询语法

基本语法
CodeQL的查询语法有点像SQL,如果你学过基本的SQL语句,基本模式应该不会陌生

CodeQL的查询语法有点像SQL,如果你学过基本的SQL语句,基本模式应该不会陌生
	import java
from int i
where i = 1
select i
QL查询的语法结构为:
from [datatype] var
where condition(var = something)
select var

类库
常使用的类库
在这里插入图片描述
查看一个获取调用方法和类的案例
在这里插入图片描述
谓词
和SQL一样,where部分的查询条件如果过长,会显得很乱。CodeQL提供一种机制可以让你把很长的查询语句封装成函数。
这个函数,就叫谓词
在这里插入图片描述
设置source和sink
在代码自动化安全审计的理论当中,有一个最核心的三元组概念,就是(source,sink和sanitizer)。
source是指漏洞污染链条的输入点。比如获取http请求的参数部分,就是非常明显的Source。
sink是指漏洞污染链条的执行点,比如SQL注入漏洞,最终执行SQL语句的函数就是sink(这个函数可能叫query或者exeSql,或者其它)。
sanitizer又叫净化函数,是指在整个的漏洞链条当中,如果存在一个方法阻断了整个传递链,那么这个方法就叫sanitizer。
命令注入的查询语句
在这里插入图片描述

四、CodeQL靶场检测效果

使用java-sec-code、两个java靶场进行检测,能够检测出大部分漏洞。靶场检测结果如下显示。
在这里插入图片描述
在这里插入图片描述

五、CodeQL集成方案

CodeQL可以通过流水线集成到研发流程中,提升应用安全管控能力。

pipeline {
    agent any

    stages {
        stage('Checkout') {
            steps {
                git branch: 'main', url: 'https://github.com/my-org/my-repo.git'
            }
        }

        stage('Build') {
            steps {
                sh './gradlew build'
            }
        }

        stage('CodeQL analysis') {
            steps {
                withEnv(['PATH+MAVEN=/usr/local/maven/bin']) {
                    sh 'codeql database create --language=java --source-root=$(pwd) my-db'
                    sh 'codeql database analyze my-db --results-dir=my-results -j auto /opt/codeql-java/ql/src/codeql-suites/java-security/java-security.qls'
                }

                archiveArtifacts '**/my-results/**'
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/730296.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Unity项目】Unity实现 双屏显示效果

需求:两个屏显示项目,一个屏显示列表,一个屏显示列表按钮点击后的效果。 最近在修改一个项目,是要求分屏显示项目,一个一体机,一个大屏,一体机当作目录界面,大屏当作模型显示界面&am…

NC140 排序

冒泡排序 public int[] BubbleSort(int[] arr) {// write code herefor (int i 0; i < arr.length - 1; i) {for (int j 0; j < arr.length - 1 - i; j) {if (arr[j] > arr[j 1]) {int temp arr[j];arr[j] arr[j 1];arr[j 1] temp;}}}return arr;}插入排序 p…

HTTP1.0、HTTP1.1、HTTP2.0、HTTP3.0的关系和区别

文章目录 一、对比二、HTTP1.0三、HTTP1.1四、HTTP2.0四、HTTP/3.0五、总结 一、对比 二、HTTP1.0 浏览器的每次请求都需要与服务器建立一个TCP连接&#xff0c;服务器处理完成后立即断开TCP连接&#xff08;无连接&#xff09;&#xff0c;服务器不跟踪每个客户端也不记录过去…

如何使用js对图像进行压缩

JavaScript 可以使用类似于 canvas 和 web workers 来实现图像压缩。 使用 canvas&#xff0c;可以将图像绘制到 canvas 上&#xff0c;然后使用 canvas 提供的 toBlob() 或 toDataURL() 方法将其转换为不同格式的图像。在这些方法中指定图像质量参数即可实现压缩。 使用 web…

python接口自动化(二十)--token登录(详解)

简介 为了验证用户登录情况以及减轻服务器的压力&#xff0c;减少频繁的查询数据库&#xff0c;使服务器更加健壮。有些登录不是用 cookie 来验证的&#xff0c;是用 token 参数来判断是否登录。token 传参有两种一种是放在请求头里&#xff0c;本质上是跟 cookie 是一样的&…

【JS】自调用函数(自执行函数)

文章目录 自调用函数&#xff1a;只能自己在定义的同时调用自己一次&#xff0c;对外界不可见。 语法 // 函数名加与不加都可以 (function 函数名(形参){console.log(11); })(实参)使用&#xff1a; // 用法一 const str 流星; (function (params){console.log(params); // …

33.RocketMQ之Broker启动源码

highlight: arduino-light Broker启动流程:BrokerStartup#main java public static void main(String[] args) { //手动指定了 nameServer start(createBrokerController(args)); } java public static BrokerController start(BrokerController controller)…

Docker开启远程端口访问2375

开启方法&#xff1a; 1、修改/etc/default/docker下的配置 cat >> /etc/default/docker <<EOF DOCKER_OPTS"-H tcp://0.0.0.0:2375" EOF systemctl restart docker 2、修改/usr/lib/systemd/system/docker.service配置 cat >> /usr/lib/systemd/s…

第四章 网络层【计算机网络】

第四章 网络层【计算机网络】 前言推荐第四章 网络层4.1 网络层的几个重要概念4.1.1 网络层提供的两种服务4.1.2 网络层的两个层面 4.2网际协议IP4.2.1 虚拟互连网络4.2.2 IP地址4.2.3IP地址与硬件地址4.2.4地址解析协议ARP4.2.5IP数据报的格式 4.3 IP层转发分组的过程4.3.1 基…

个人域名邮箱无法给gmail发邮件

问题描述 我注册了一个域名 mydomain.com, 并在此域名下创建了 mailbox&#xff0c;从该邮箱向外发送邮件和接收邮件会失败。 主要是一些配置工作没有做好。 接收邮件 当创建邮箱 xxxmydomain.com&#xff0c;尝试向该邮箱发送邮件时&#xff0c;邮件会被拒收&#xff0c;并…

选择正确的负载均衡器:LVS还是Nginx?

选择正确的负载均衡器&#xff1a;LVS还是Nginx&#xff1f; 博主简介一、前言二、什么是LVS&#xff1f;2.1、LVS的架构 三、什么是Nginx&#xff1f;3.1、Nginx 特性3.2、Nginx 架构 四、LVS和Nginx的区别五、总结 博主简介 &#x1f4a1;一个热爱分享高性能服务器后台开发知…

windows环境下根据端口号查询进程编号并杀掉此进程

说在前面 当端口号备占用时&#xff0c;我们需要找到占用端口的进程&#xff0c;然后杀掉该进程&#xff0c;即可 开干 1、找占用端口的进程&#xff0c;比如现在是3306端口备占用了 netstat -nao|findstr 3306运行如下&#xff1a; 2、杀掉进程&#xff0c;比如进程号为…

【InnoDB 存储引擎】15.4 InnoDB Architecture

文章目录 1 InnoDB 存储引擎结构2 参考资料 1 InnoDB 存储引擎结构 下面的图显示了内存和磁盘结构组成InnoDB存储引擎架构 内存结构&#xff1a;Section 15.5, “InnoDB In-Memory Structures” Buffer Pool&#xff08;缓冲池&#xff09;Change Buffer&#xff08;修改缓冲&…

JavaScript笔记——快速了解 ES6 新增字符串方法,开箱即用(含案例)

文章目录 &#x1f4cb;前言&#x1f3af;includes() 方法&#x1f3af;startsWith() 方法&#x1f3af;endsWith() 方法&#x1f3af;repeat() 方法&#x1f3af;padStart() 方法&#x1f3af;padEnd() 方法&#x1f3af;trim() 方法&#x1f3af;trimStart() 或 trimLeft() 方…

Atlassian Jira敏感信息获取

我是一个平凡的人&#xff0c;但一个平凡的人&#xff0c;也可以过得不平凡。 漏洞复现 构造payload /secure/ViewUserHover.jspa?usernameadmin用户名存在会返回&#xff0c;且版本在影响范围之内 用户名不存在会返回&#xff0c;且版本在影响范围之内 文笔生疏&#xff…

【雕爷学编程】Arduino动手做(155)---2262/2272四键无线遥控套件模块2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

基于单片机的教室智能照明台灯控制系统的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;LCD1602液晶显示当前时间、年月日、时分秒、前教室人数&#xff1b;2路红外探头用来感应当前教室进出人数&#xff1b;按键可以设置当前时间、自动手动模式、开启和关闭教室灯光时间&#xff1b;在手动模式下&#xff0c;可以通过按…

OpenCV图像金字塔pyrDown下采样

#include <opencv2/opencv.hpp> #include <opencv2/imgproc/imgproc.hpp>using namespace cv;int main() {// Load the original imageMat srcImage

【C++ OJ练习】3.反转字母

1.题目链接 力扣 2.解题思路 前后分别给两个指针 进行遍历 找到字母后就交换 然后往下走 没找到就直接往下走 注意双循环条 件 3.代码 class Solution { public://判断是不是字符bool IsChar(char ch){if ((ch > a && ch < z)|| (ch > A && ch …

区间dp(动态规划)

动态规划——区间dp 什么是动态规划区间dp定义应用 例题引入题目描述输入格式输出格式样例样例输入样例输出 提示 贪心法区间dp优缺点&#xff1a;AC代码&#xff1a;代码详解三层for循环状态转移方程环形的处理 什么是动态规划 动态规划&#xff08;dp&#xff09;是一种通过…