前言

开始学习使用CodeQL,做一些笔记,可供参考的资料还是比较少的,一个是官方文档,但是Google翻译过来,总觉得怪怪的,另一个就是别人的一个资源整合,其中可供参考的也不是很多,大多也是官方文档翻译过来的,要不然就是你抄我,我抄你,抄来抄去,其中有些东西就变了味。

还是需要好好学英语,直接看官方一手文档不香吗?

https://codeql.github.com/docs/

先看一篇科普文章Github安全实验室:开源代码分析引擎codeql,设漏洞奖励计划 (qq.com)防止文章失效,文章重点如下:

  1. GitHub启动securitylab社区计划:https://securitylab.github.com/

  2. 开源了codeql:https://securitylab.github.com/tools/codeql/

  3. 可以在lgtm平台(类似云平台)上直接写语句分析:https://lgtm.com

  4. 开设了针对codeql的CTF比赛:https://securitylab.github.com/ctf,在Research这一栏有很多研究人员挖和分析漏洞的技术经验分享

  5. GitHub成为了授权的CVE编号颁发机构(CNA),这意味着它可以发布漏洞的CVE标识符。

    赏金规则查看:https://securitylab.github.com/bounties

    从描述来看,Github还是希望安全研究员使用CodeQL进行挖掘新漏洞,并可以提交赏金。最高获得2500美元

除了发现漏洞有钱之外,编写CodeQL查询,如果写的够好,也可以拿钱,最高可以拿3000美元

CodeQL

Semmle公司最早独创性的开创了一种QL语言,Semmle QL,并且运行在自家LGTM平台上。

LGTM平台上存放的就是一些开源项目,用户可以选择分析的语言,编写ql语句进行程序安全性查询

2019年,GitHub(背后是微软)收购了Semmle公司,开源了CodeQL分析引擎,来看引擎的该矿图

  1. 将源码通过Extractor模块进行代码信息分析&提取,构建一套自己的关系型数据库Snapshot Database

    1. 编译型语言:Extractor观察编译器的编译过程,捕获编译器生成的AST,语义信息(名称绑定、类型信息、运算操作等),控制流,数据流信息,外加一份源码。

    2. 解释型语言:Extractor直接分析源代码

  2. Snapshot Database里面包括:源代码,关系数据

  3. 接下来用户输入QL语句,经过CodeQL的工具库转换为Compiled Query,参与查询

  4. 最终展示查询结果

这是大概的一个原理,其核心原理也可以在Academic publications--官方给出的Paper,说实话,看天书一样,中文的都看不懂,还想看英文的,洗洗睡吧,不说废话了

我们的关注点应该在于怎么样提炼出来某种类型的漏洞的规则,一句话,CodeQL,规则为王。

要想写规则,个人认为需要有以下几种知识:

  1. 漏洞核心原理:这点不用多说

  2. AST语法树:编写规则的时候,需要用到这块知识,

  3. 离散数学:其中涉及到一些集合,命题等等,大学肯定学过。

  4. 数据流分析:将漏洞代码抽象为数据流进行分析,这也是CodeQL核心原理之一,~~应该也不难吧(当我没说)

  5. 污点分析:下面对南大的课程里边也有讲

推荐资料

数据流分析: https://www.bookstack.cn/read/CTF-All-In-One/doc-5.4_dataflow_analysis.md

北京大学 软件分析: https://www.bilibili.com/video/BV14X4y1N7nx?from=search&seid=9073392278546408847

南京大学 软件分析: https://www.bilibili.com/video/BV1b7411K7P4

静态程序分析Static Program Analysis:https://pascal-group.bitbucket.io/teaching.html

强推南京大学的课程,可以先看这个,关于课程的一些资料

https://github.com/RangerNJU/Static-Program-Analysis-Book

https://www.cs.cornell.edu/courses/cs6120/2020fa/self-guided/

https://zhuanlan.zhihu.com/p/128156349

环境搭建

管它会不会写规则,环境先搭起来看看。

环境准备

以Java为例,Java是编译型语言,所以你需要事先安装好项目编译所需的全部环境,例如:JDK、Maven

CodeQL CLI

CodeQL CLI用来创建和分析数据库。也就是分析引擎

下载CodeQL压缩包并解压

https://github.com/github/codeql-cli-binaries/releases

将CodeQL CLI的可执行文件添加到环境变量,方便灵活调用

CodeQL 标准库

包含了必须的一些标准库(内置库)和一些查询样例

https://github.com/github/codeql,下载后更改文件名为ql,此时目录结构为:

注意:CodeQL解释器会按照某个规则(会查找CodeQL CLI所在目录的兄弟目录以及其子目录)寻找CodeQL标准库的位置,若是没有找到,则需要你手动将CodeQL标准库添加到VSCode的工作区中。所以我们这里直接放在同一个文件夹下。

安装VS code插件并配置

官方提供了VSCode编写CodeQL的插件作为前端来使用Codeql

这里的路径具体到codeql.exe,windows下也可以codeql.cmd

使用

下载WebGoat

我这里以WebGoat8.1.0 为例,此版本需要Java11环境,自行配置,

创建数据库

需要已经安装Maven,因为WebGoat项目是基于Maven构建的,CodeQL在创建数据库时,会自动探测并使用对应的编译方式。

在WebGoat根目录下面执行如下命令,会自动编译并且为该项目创建一个名为webgoat-qldb的QL数据库。

codeql database create webgoat-ql -l java

因为要下载很多的依赖,生成比较慢

创建完该项目的数据库后,该项目的源码文件在后面几乎就用不到了(除非像更新QL数据库这种需求),CodeQL查询时主要使用的便是该项目的数据库文件

创建QL包

需要创建一个文件夹来存放后续编写的CodeQL脚本,CodeQL官方称这个文件夹为QL Pack

例如名为query的文件夹,并在里面创建1个QL Pack的配置文件,名称固定为qlpack.yml;再创建一个ql后缀的文件,名称随意

在VSCode中打开这个文件夹

编写QL包的配置文件

将如下信息填入qlpack.yml文件

name: query
version: 0.0.0
libraryPathDependencies: codeql-java

第一行表示这个QL包的名称为query,必选,如果你在VSCode中同时打开多个QL包时,要保证这个name的值唯一不重复;

第二行表示这个QL包的版本号,必选;

第三行表示这个QL包的依赖,必选,codeql-java表示需要Java语言的QL标准库依赖

VSCode工作区增加CodeQL标准库

为了让CodeQL解释器能够访问标准库,我们需要将标准库所在文件夹也加入到加入工作区中。

VSCode - 文件 - 将文件夹加入工作区 - 选择在【环境搭建-CodeQL标准库】章节中存放CodeQL标准库的文件夹。

添加CodeQL数据库

在VSCode的CodeQL插件中添加之前用CodeQL创建的WebGoat的数据库。

选择webgoat-ql那个文件夹。如下是添加成功后的页面

编写一个简单查询

webgoat-queyr.ql文件中编写如下代码,用来查找WebGoat项目中所有声明的方法

import java

from Method m
select m

然后右键点击【CodeQL: Run Query 】来执行本次查询,执行完成后在右边可以看到多出一列用来显示查询结果

点击结果里面的任意条目,可以跳到对应的文件中:

CodeQL(1)的更多相关文章

  1. CodeQL CLI入门

    一.CodeQL CLI 安装和配置 1.下载CodeQL CLI 压缩包 https://github.com/github/codeql-cli-binaries/releases 2.创建Cod ...

  2. codeql初探

    CodeQL初探 环境搭建 基于Windows 基于Mac 下载codeql https://github.com/github/codeql-cli-binaries/releases/latest ...

  3. CodeQL使用流程

    前言 好久没用CodeQL了,看了自己之前写的文章发现竟然没有做过相关记录 然后就不知道怎么用了hhh 使用流程 0x1 生成数据库 我们拿到一套源码,首先需要使用CodeQL生成数据库 执行命令: ...

  4. Python 爬取 热词并进行分类数据分析-[App制作]

    日期:2020.02.14 博客期:154 星期五 [本博客的代码如若要使用,请在下方评论区留言,之后再用(就是跟我说一声)] 所有相关跳转: a.[简单准备] b.[云图制作+数据导入] c.[拓扑 ...

  5. 微软 Build 大会发布大量开发工具与服务!编码、协作、发布,如丝般顺滑

    Microsoft Build 2020开发者大会已经圆满落幕,在连续两天48小时的不间断直播中,来自全世界的开发者共赴盛宴,场面相当壮观.在这一年一度的大聚会里,微软也是诚意满满,带来了一连串的产品 ...

  6. 通读《构建之法》与CI/CD工具尝试

    项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 作业要求 我在这个课程的目标是 积累软件开发经验,提高工程能力 这个作业在哪个具体方面帮助我实现目标 通读课 ...

  7. python常见漏洞总结

    总结一下python里面常见安全问题,文章大部分内容来自MisakiKata师傅的python_code_audit项目,对原文进行了一些修改,后续会使用编写了规则对代码里面是否用到这些危险函数进行相 ...

  8. [Java反序列化]jdk原生链分析

    jdk原生链分析 原文链接 作为jdk中目前发现的原生链,还是有必要要分析这个用法的.全文仅限尽可能还原挖掘思路 JDK7u21 在很多链中,TemplatesImpl一直发挥着不可或缺的作用,它是位 ...

  9. java反序列化漏洞专项

    背景条件:java的框架,java的应用程序,使用序列化,反序列化操作非常多.在漏洞挖掘中,代码审计中,安全研究中,反序列化漏洞是个重点项,不可忽视.尤其是java应用程序的rce,10个里面有7个是 ...

随机推荐

  1. C++中的STL大法整理

    C++中的STL大法整理 由于碰到了一些不知道怎么用的STL vector vector是数组的STL,对于普通数组的优势就在于,可以动态地变化数组长度.那么面对一些数据范围非常大而又可以边读入边处理 ...

  2. 【PMP学习笔记】第5章 项目范围管理

    一.规范管理的内涵 项目范围管理:包括确保项目做且只做所需的全部工作,以成功完成项目的各个过程. 项目范围:为交付具有规定特性与功能的产品.服务或成果而必须完成的工作. 预测型:开始时定义可交付成果, ...

  3. 跟羽夏学 Ghidra ——窗口

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  4. 高德地图与CAD图叠加显示方法汇总及优缺点分析

    前言 ​ 高德地图应用在许多领域,平常我们用的地图导航,除过正常的地图导航指引功能之外,其实还有很多实用的功能.如高德影像地图应用在包括地理.土地测量.水文学.生态学.气象学以及海洋学等方面.Auto ...

  5. 【项目实战】自备相机+IMU跑通Vins-Mono记录

    前言 初次接触SLAM,公司要求用自己的设备来跑通vinsmono这个程序,虽然已经跑通了别人的数据包,但是真正自己上手来运行这个程序,发现真的是困难重重,特意在此记载下来整个过程,以供大家参考. 我 ...

  6. 如何使用DBeaver连接Hive

    1 DBeaver介绍 DBeaver是一个通用的数据库管理工具和 SQL 客户端,支持多种兼容 JDBC 的数据库.DBeaver 提供一个图形界面用来查看数据库结构.执行SQL查询和脚本,浏览和导 ...

  7. nginx配置文件内容详解

    events { # 服务器最大链接数 worker_connections 1024; # 设置一个进程是否同时接受多个网络连接,默认为off multi_accept on; #事件驱动模型,se ...

  8. Kafka Eagle 3.0.1功能预览

    1.概述 最近有同学留言,关于Kafka Eagle的一些使用问题.今天笔者就为大家来详细介绍Kafka Eagle 3.0.1的功能以及使用方法. 2.内容 在3.0.1版本中,EFAK优化了分布式 ...

  9. DML添加数据-删除数据-修改数据

    DML添加数据 语法 insert into 表名(列名1,列名2,列名n) values(值1,值2,值n) 列:INSERT INTO day02(id,NAME,age) VALUES(1,&q ...

  10. 市面上erp软件那么多,为什么很多卖家选择定制erp?

    为什么选择定制ERP?适合自己的才是最好的啊!就连头部ERP企业提供给用户的ERP系统,应该也没有不进行个性化定制的吧,匹配很重要!规模不同.行业不同.发展阶段不同.生产模式不同.管理理念不同,适用的 ...