当前位置: 首页 > news >正文

CodeQL和数据流分析的简介

在这里插入图片描述

文章目录

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


前言

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

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


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

一、CodeQL 简介

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

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

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

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

import javascriptfrom 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 orsource instanceof ClientRequest::Range orsource instanceof SomeOtherSource
}

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


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

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

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

from DataFlow::PathNode source, DataFlow::PathNode sink,UnsafeDOMManipulationConfiguration configwhere 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() andsucc = array)orexists(DataFlow::MethodCallNode find |find.getMethodName().regexpMatch("find|filter|some|every|map") andpred = find.getReceiver() andsucc = find.getCallback(0).getParameter(0))
}

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

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

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

总结

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

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


http://www.mrgr.cn/news/56142.html

相关文章:

  • C++加密解密问题解惑答疑
  • 第一章 计算机基础(一)
  • Qt编写的modbus模拟器/支持网络和串口以及websocket/支持网络rtu
  • OCR经典神经网络(三)LayoutLM v2算法原理及其在发票数据集上的应用(NER及RE)
  • xlnt加载excel报错:xl/workbook.xml:2:2581: error: attribute ‘localSheetId‘ expected
  • 每日一题学习笔记——移动零
  • 双十一有哪些值得购买的好物品?2024双十一超级好用的五款品牌分享
  • Qt开发笔记(一)Qt的基础知识及环境编译(泰山派)
  • 关于美团外卖霸王餐系统的详细介绍?你了解多少
  • 低代码平台:让系统开发随需而变,轻松应对各种需求!
  • [电子科大]王丽杰 离散数学 第二讲 特殊集合和集合间关系 笔记
  • 2024 年入门编程培训,仍然值得
  • 川宁生物三季报:抗生素中间体稳健增长,合成生物学产能蓄势待发
  • 深入解析 ThreadPoolExecutor:参数配置与源码分析
  • OAK相机的标定流程更新与优化通知
  • 高标准农田灌区信息化助力精准农业发展
  • springboot在线学习系统-计算机毕业设计源码78477
  • Android 添加线性亮度,替换原来的不平滑亮度曲线
  • 小巧设计,强大功能:探索SoC模块的多样化功能
  • 【视频生成大模型】 视频生成大模型 THUDM/CogVideoX-2b
  • Xcode真机运行正常,打包报错
  • 32匿名函数
  • uni-app组件使用(uv-ui)
  • 无线电测向运动80m(3.5-3.6MHz)信号源制作
  • c++ libtorch tensor 矩阵分块
  • 壹肆柒·2025郑州台球展会,3月12-14日盛大举办