CyberKareem/kameQL
GitHub: CyberKareem/kameQL
kameQL 是一套基于 CodeQL 数据流与污点追踪的安全查询包,用于检测跨租户 IDOR、授权缺失和不安全反序列化等应用层漏洞。
Stars: 0 | Forks: 0
# kameQL
**用于检测授权缺失、跨租户 IDOR 和不安全反序列化的 CodeQL 查询包** —— 这些是我在实际审计中发现并披露的同类漏洞,以标准的数据流/污点追踪查询的形式呈现,而非简单的 AST 模式匹配。
由 **Abdullah Kareem** ([@CyberKareem](https://github.com/CyberKareem)) 维护。这是我的 Semgrep 规则集 [`kameRules`](https://github.com/CyberKareem/kameRules) 的 CodeQL 对应版本。
## 布局
CodeQL 数据库是单语言的,因此本仓库为每种语言提供了一个查询包:
```
kameQL/
├── codeql-workspace.yml # ties the packs together for tooling
├── javascript/ # pack: cyberkareem/kameql-javascript
│ ├── qlpack.yml
│ ├── src/
│ │ ├── CrossTenantIdor.ql (+ .qhelp)
│ │ └── MissingAuthorization.ql (+ .qhelp)
│ └── test/ # codeql test run fixtures + .expected
└── java/ # pack: cyberkareem/kameql-java
├── qlpack.yml
├── src/
│ ├── JacksonUnsafeDeserialization.ql (+ .qhelp)
│ └── UnsafeNativeDeserialization.ql (+ .qhelp)
└── test/
```
## 查询 → CWE → CVE 映射
| 查询 | 语言 | 技术 | CWE | 本可捕获的已披露 CVE |
|-------|----------|-----------|-----|-------------------------------------|
| [`CrossTenantIdor`](javascript/src/CrossTenantIdor.ql) | JS/TS | 污点追踪:请求 ID → 无租户防护的按 ID 数据库查找 | CWE-639, CWE-284 | **CVE-2026-59979** |
| [`MissingAuthorization`](javascript/src/MissingAuthorization.ql) | JS/TS | 路由模型 + 启发式方法:已进行身份验证但未进行授权的状态变更路由 | CWE-862, CWE-285 | **CVE-2026-59979** |
| [`JacksonUnsafeDeserialization`](java/src/JacksonUnsafeDeserialization.ql) | Java | 污点追踪:远程源 → 在具有默认类型的 mapper 上执行 Jackson `readValue` | CWE-502 | **CVE-2026-59889** |
| [`UnsafeNativeDeserialization`](java/src/UnsafeNativeDeserialization.ql) | Java | 污点追踪:远程源 → `ObjectInputStream` | CWE-502 | — |
## 查询工作原理(不仅仅是 AST 匹配)
- **`CrossTenantIdor`** — 一个 `TaintTracking::Global` 配置,其**源**是任何 `RemoteFlowSource`(请求参数/query/body),其 **sink** 是按 ID 查找(`findById`、`findByPk`、`findOne({_id})`、Prisma `findUnique`/`findFirst`)的标识符参数。该 sink 谓词排除了同时约束了 `organizationId` / `orgId` / `tenantId` / `teamId` / … 键的查找,因此租户范围内的查询不会被标记。
- **`MissingAuthorization`** — 对 Express 路由注册进行建模,通过本地数据流按名称解析每个 middleware 引用,并报告带有身份验证 middleware 但没有授权 middleware 的状态变更路由。这是一个特意设计为审查级别的启发式方法(已在其 `.qhelp` 中说明)。
- **`JacksonUnsafeDeserialization`** — 从 `RemoteFlowSource` 到 Jackson `readValue`/`readValues` 参数的污点追踪,前提是接收方 mapper 已对其调用了 `enableDefaultTyping()` / `activateDefaultTyping()`。
- **`UnsafeNativeDeserialization`** — 从 `RemoteFlowSource` 到 `java.io.ObjectInputStream` 构造的流参数的污点追踪。
## 用法
### 1. 安装 CodeQL CLI
下载 [CodeQL CLI](https://github.com/github/codeql-cli-binaries/releases) 并将其放在您的 `PATH` 中,然后解析包依赖项:
```
codeql pack install javascript
codeql pack install java
```
### 2. 为要扫描的项目构建数据库
```
# JavaScript / TypeScript(无需构建)
codeql database create /tmp/app-js-db --language=javascript --source-root=/path/to/project
# Java(autobuild,或使用 --build-mode=none 进行仅源码提取)
codeql database create /tmp/app-java-db --language=java --build-mode=none --source-root=/path/to/project
```
### 3. 针对该数据库运行查询包
```
# 运行 pack 中的每个 query
codeql database analyze /tmp/app-js-db javascript/ --format=sarif-latest --output=js.sarif
codeql database analyze /tmp/app-java-db java/ --format=sarif-latest --output=java.sarif
# …或单个 query
codeql query run javascript/src/CrossTenantIdor.ql -d /tmp/app-js-db
```
将 SARIF 导入 GitHub code scanning,或使用任何 SARIF 查看器阅读它。
## 测试
每个查询都有一个 `test/` 目录,其中包含一个易受攻击的**和**一个安全的代码片段,以及一个提交的 `.expected` 结果集,因此 `codeql test run` 会验证查询是否标记了易受攻击的代码行并保留了安全的代码行。CI ([`.github/workflows/ci.yml`](.github/workflows/ci.yml)) 会编译每个查询并运行完整的测试套件。
```
codeql test run javascript/test --additional-packs "$HOME/.codeql/packages"
codeql test run java/test --additional-packs "$HOME/.codeql/packages"
```
## 许可证
[MIT](LICENSE) © 2026 Abdullah Kareem ([@CyberKareem](https://github.com/CyberKareem))。
标签:CMS安全, CodeQL, JavaScript, JS文件枚举, 图数据库, 安全评估工具, 数据可视化, 错误基检测, 防御机制, 静态代码分析