CodeQL和数据流分析的简介

在这里插入图片描述

文章目录

  • 前言
  • 一、CodeQL 简介
  • 二、编写污点跟踪查询
    • 扩展传播功能
  • 总结


前言

最近,CodeQL使用非常广泛(GitHub 开发的一种强大的静态分析工具)来将代码扫描作为 CI/CD 管道的一部分。其核心是 QL 语言,它用于编写对代码进行推理的查询。与竞争对手相比,CodeQL 擅长污点跟踪和数据流分析,它非常擅长并强调潜在的恶意或不安全数据如何流经您的代码并最终进入引入安全性的危险位置和代码的脆弱性。

本质上,QL 是一种声明性逻辑编程语言,因此它建立在集合论和谓词逻辑的基础上。


提示:以下是本篇文章正文内容,下面案例可供参考

一、CodeQL 简介

QL 是一种声明性语言。这意味着查询是以描述所需结果的方式编写的,而不是实现它的步骤。这与 Python 或 Java 等命令式语言形成鲜明对比,在这些语言中,编写的代码描述了实现所需结果的步骤。

典型的 CodeQL 分析工作流程如下所示:

  • 源代码被编译到数据库中。该数据库包含代码库的关系表示,其中包括有关代码结构、控制流和数据流的信息。
  • CodeQL 引擎对数据库运行 QL 查询,类似于对关系数据库3、运行 SQL 查询,以查找代码中与查询匹配的模式。
  • 结果导出为 SARIF 格式,可供 CI 工具或自定义集成使用。

从这个意义上说,CodeQL 很像 SQL。甚至可能会认识到跟sql语法的相似之处:

import javascript
 
from Function f
where not exists(CallExpr c | c.getCallee() = f)
select f, "This function is never called."

例如,此查询查找 JavaScript 代码库中从未调用的所有函数。注意存在量词“exists”,它检查是否至少有一个 CallExpr 调用函数 f。

QL 是面向对象的。 CallExpr::getCallee() 返回一个 Expr,它可以是一个 FunctionExpr。但是,传统意义上的类对象(分配内存来保存类实例的状态)在 QL 中不存在,类更像是描述现有值集的抽象数据类型。

二、编写污点跟踪查询

来看一下 CodeQL 查询,该查询在 JavaScript 代码库中查找基于 DOM 的基本 XSS 漏洞。首先,我们需要定义污点跟踪的配置:

class UnsafeDOMManipulationConfiguration extends TaintTracking::Configuration {
  UnsafeDOMManipulationConfiguration()
   { 
   this = "UnsafeDOMManipulationConfiguration" 
   }
}

现在,我们需要定义来源。这些是不受信任的数据首次进入程序的地方。在本例中,我们正在寻找 RemoteFlowSource(例如来自请求参数的数据)、ClientRequest::Range(来自 HTTP 响应的数据)和SomeOtherSource (我们在其他地方定义的自定义来源)。

override predicate isSource(DataFlow::Node source) {
  source instanceof RemoteFlowSource or
  source instanceof ClientRequest::Range or
  source instanceof SomeOtherSource
}

接下来,我们需要定义接收器。这些是受污染数据可能造成危害的地方。最终,我们希望找到从任何源到任何接收器的所有路径,这些将是我们查询的结果。


override predicate isSink(DataFlow::Node sink) {
  // Direct assignment to innerHTML or outerHTML
  exists(DataFlow::PropWrite pw |
    pw.getPropertyName() in ["innerHTML", "outerHTML"] and
    sink = pw.getRhs()
  )
  or
  // Element.insertAdjacentHTML()
  exists(DataFlow::MethodCallNode call |
    call.getMethodName() = "insertAdjacentHTML" and
    sink = call.getArgument(1)
  )
  or
  // Direct assignment to iframe.srcdoc
  exists(DataFlow::PropWrite pw |
    pw.getPropertyName() = "srcdoc" and
    sink = pw.getRhs()
  )
  or
  // document.write() and document.writeln()
  exists(DataFlow::MethodCallNode call |
    call.getMethodName() in ["write", "writeln"] and
    call.getReceiver() = DOM::documentRef() and
    sink = call.getArgument(0)
  )
  or
  // DOMParser.parseFromString()
  exists(DataFlow::MethodCallNode call |
    call.getMethodName() = "parseFromString" and
    call.getReceiver().getALocalSource() instanceof DataFlow::NewNode and
    call.getReceiver().getALocalSource().(DataFlow::NewNode).getCalleeName() = "DOMParser" and
    sink = call.getArgument(0)
  )
  or
  sink instanceof DomBasedXss::TooltipSink
}

这定义了数据流图中的哪些节点被视为接收器。在本例中,我们正在识别可用于将不受信任的数据注入 DOM 的方法,例如innerHTML、、、、、、和。当不受信任的数据到达这些接收器时,outerHTML它可用于在页面上下文中执行任意 JavaScript 代码。insertAdjacentHTMLsrcdocdocument.writedocument.writelnDOMParser.parseFromString

计算出最小不动点后(并且我们拥有程序中所有受污染元素的完整集合),我们便可以根据这组受污染元素评估接收器,以确定是否有任何受污染数据可以到达接收器。如果是这样,我们就有一个潜在的漏洞。

from DataFlow::PathNode source, DataFlow::PathNode sink,UnsafeDOMManipulationConfiguration config

where config.hasFlowPath(source, sink)

select sink.getNode(), "Potentially unsafe DOM manipulation with $@.",source.getNode(), "untrusted data"

扩展传播功能

有时,默认的污染步骤不足以捕获所需的传播。可以通过覆盖来扩展它isAdditionalTaintStep:

override predicate isAdditionalTaintStep(DataFlow::Node pred, DataFlow::Node succ) {
  exists(DataFlow::ArrayCreationNode array |
    pred = array.getAnElement() and
    succ = array
  )
  or
  exists(DataFlow::MethodCallNode find |
    find.getMethodName().regexpMatch("find|filter|some|every|map") and
    pred = find.getReceiver() and
    succ = find.getCallback(0).getParameter(0)
  )
}

这会通过数组元素和数组方法传播污点,例如:ind, filter, some, every, 和 map.

还可以通过覆盖来实现isSanitizer:

override predicate isSanitizer(DataFlow::Node node) {
  node = DataFlow::moduleImport("dompurify").getAMemberCall("sanitize")
}

总结

它是一款非常有趣且功能强大的工具,虽然缺乏其他一些静态分析工具的用户友好性,但它的灵活性和表现力弥补了这一缺陷。

    文章原创,欢迎转载,请注明文章出处: CodeQL和数据流分析的简介.。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

炒股VS炒CSGO游戏装备,哪个更好做

这个项目,赚个10%都是要被嫌弃的 虽然天天都在抒发自己对股市的看法,但自己自始至终也没有买进任何一支股票。之所以对这个话题感兴趣,着实是因为手上的游戏搬砖项目也是国际性买卖,跟国际形势,国际汇率挂钩&#xff…

k8s可以部署私有云吗?私有云部署全攻略

k8s可以部署私有云吗?K8S可以部署私有云。Kubernetes是一个开源的容器编排引擎,能够自动化容器的部署、扩展和管理,使得应用可以在各种环境中高效运行。通过使用Kubernetes,企业可以在自己的数据中心或私有云环境中搭建和管理容器…

鸿蒙开发融云demo消息时间格式化

鸿蒙开发融云demo消息时间格式化 融云没有提供鸿蒙版本带ui的,跟着我一步步搭建起来基本功能。 这次说消息时间格式化 一、消息时间格式化 先看下效果图: 二、关键代码: 看起来简单,但处理起来还是挺麻烦的 // 处理时间函数入…

​​CMU生成式人工智能大模型:从入门到放弃(七)

引言 在前面的系列博客中,我们探讨了生成式对抗网络(GANs)的基本原理和应用。今天,我们将深入探讨变分自编码器(VAEs),这是一种能够学习数据的低维表示并从中生成新数据的生成式模型。 变分自…

路由器 相关知识

一、路由器是什么 参考:图解系列--路由器和它庞大的功能_路由功能-CSDN博客 路由器是指:主要负责 OSI参考模型中网络层的处理工作,并根据路由表信息在不同的网络 之间转发IP 分组的网络硬件(图3-1)。这里的网络一般是指IP 子网,…

为Windows Terminal 配置zsh + Oh-My-Zsh!

参考: 为Windows Terminal 配置zsh Oh-My-Zsh! [非WSL] https://zhuanlan.zhihu.com/p/625583037 Package: zsh - MSYS2 Packages 安装配置 1、安装 Windows Terminal(必须) Method 1: 打开 Microsoft Store,搜索 “Windows Terminal”。点击 “…

修改el-table默认滚动条样式

el-table原有滚动条样式对有些用户来说太窄&#xff0c;拖动起来不方便&#xff0c;因此做出如下修改。 修改前的样式图&#xff1a; 修改后的样式图&#xff1a; 样式代码&#xff1a; <style lang"scss" scoped> ::v-deep ::-webkit-scrollbar {width: 6px;…

CSS易漏知识

复杂选择器可以通过&#xff08;id的个数&#xff0c;class的个数&#xff0c;标签的个数&#xff09;的形式&#xff0c;计算权重。 如果我们需要将某个选择器的某条属性提升权重&#xff0c;可以在属性后面写!important&#xff1b;注意!importent要写在;前面 很多公司不允许…

C++:模版初阶

目录 1. 泛型编程 2.函数模版 2.1. 函数模版的用法 2.2. 函数模版的原理 2.3 函数模板的实例化 2.4 模版参数的匹配原则 3. 类模版 3.1 类模版的格式 3.2. 类模版的实例化 1. 泛型编程 如何实现整形、字符串&#xff0c;或者其他自定义类型的交换函数&#x…

028.爬虫专用浏览器-抓取#shadowRoot(closed)下的内容

一、什么是Shadow DOM Shadow DOM是一种在web开发中用于封装HTML标记、样式和行为的技术&#xff0c;以避免组件间的样式和脚本冲突。它允许开发者将网页的一部分隐藏在一个独立的作用域内&#xff0c;从而实现更加模块化和可维护的代码结构 二、js操作Shadow DOM // 获取宿…

命名空间std, using namespace std

命名空间std&#xff0c;using namespace std 在标准C以前&#xff0c;都是用#include<iostream.h>这样的写法的&#xff0c;因为要包含进来的头文件名就是iostream.h。标准C引入了名字空间的概念&#xff0c;并把iostream等标准库中的东东封装到了std名字空间中&#x…

React类组件详解

React类组件是通过创建class继承React.Component来创建的&#xff0c;是React中用于构建用户界面的重要部分。以下是对React类组件的详细解释&#xff1a; 一、定义与基本结构 类组件使用ES6的class语法定义&#xff0c;并继承自React.Component。它们具有更复杂的功能&#xf…

笔记整理—linux驱动开发部分(2)模块信息与编译

对于linux而言&#xff0c;.ko文件为驱动文件&#xff0c;在终端可以使用lsmod列出已经安装的模块&#xff0c;使用insmod xxx.ko安装所需要的模块&#xff0c;modinfo xxx.ko打印某个模块提供的信息&#xff0c;rmmod xxx卸载某个不需要的模块。 insmod与module_init宏。在源代…

智能台灯设计(一)原理图设计

1. 前言 作者最近突发奇想&#xff0c;想自己做一个小台灯&#xff0c;设想的功能有&#xff1a;带锂电池可充电、可以调节亮度&#xff0c;后续通过增加WIFI模块实现手机控制开关功能。目前先实现最简单的功能&#xff0c;有时间再一步步完善吧。 2. 原理图设计 充电芯片使用…

[LitCTF 2023]破损的图片(初级)的write up

开启靶场&#xff0c;下载附件&#xff0c;解压后得到文件&#xff1a; 破损的图片&#xff0c;那应该是文件头缺失 用010editor打开&#xff1a; 文件尾是AE 42 60 82&#xff0c;说明原图片是png格式&#xff0c;文件头前八个字节是3F&#xff0c;且对应8个"?"&am…

0softmax和背后的最大熵(极大似然法)

只要无穷阶矩都一样&#xff0c;那么两个分布一定一样。 整理思路&#xff1a;1、设定样本的概率模型与目标概率模型一致&#xff08;两个模型特性函数一致&#xff09;建立服从伯努利分布的变量&#xff08;此处需要理解样本空间及变量的关系&#xff09;对两个模型进行降维&a…

Could not retrieve mirrorlist http://mirrorlist.centos.org错误解决方法

文章目录 背景解决方法 背景 今天在一台新服务器上安装nginx&#xff0c;在这个过程中需要安装相关依赖&#xff0c;在使用yum install命令时&#xff0c;发生了以下报错内容&#xff1a; Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&archx8…

HarmonyOS 相对布局(RelativeContainer)

1. HarmonyOS 相对布局&#xff08;RelativeContainer&#xff09; 文档中心:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-layout-development-relative-layout-V5   RelativeContainer为采用相对布局的容器&#xff0c;支持容器内部的子元素设…

ssh服务器相关实验

相关命令 下载软件 yum install openssh-server 查看公私钥 ll /etc/ssh/ 查看配置文件 rpm -qf /etc/ssh/sshd_config 修改ssh端口号&#xff08;改成2222&#xff09; vim /etc/ssh/sshd_config 拒绝root用户远程登录 进入配置文件所在文件夹 cd /etc/ssh/sshd_config.d/ 进…

ionic Capacitor 生成 Android 应用

官方文档 https://ionic.nodejs.cn/developing/android/ https://capacitorjs.com/docs/getting-started 1、创建新的 Capacitor 应用程序 空目录下面 npm init capacitor/app2、install Capacitor npm install npm start在这里插入图片描述 3、生成dist目录 npm run buil…