cengo441337-a11y/IDORacle
GitHub: cengo441337-a11y/IDORacle
IDORacle 是一个通过 canary token 见证已提交状态变化来确定性验证 API 写入型 IDOR/BOLA 漏洞真伪的审计 oracle,旨在消除传统状态码扫描器带来的误报。
Stars: 0 | Forks: 0
# IDORacle
### 为访问控制漏洞提供证明,而非猜测。
[](LICENSE)
[](#)
[](#)
[](#)
一个可靠且与目标无关的 oracle,它**证明**了写入型 IDOR / BOLA 是真实存在的,而不是通过 HTTP 状态码进行猜测。它会植入一个唯一的高熵 canary,让攻击者账户去写入它,并确认更改确实已落地到已提交状态(committed state)中。它见证真实的漏洞,并拒绝那些破坏所有状态码扫描器的误报(false positive)。当它无法可靠地观察某个对象时,它会在记录中声明这一点,并附上签名。
## 问题所在
服务器会撒谎。一个 `200 OK` 可能是一个静默的空操作(no-op)。一个 `403 Forbidden` 可能隐藏了一个已经持久化的写入。几乎所有的自动化 IDOR/BOLA 扫描器都会读取这些响应,并生成人类必须重新分拣的长达数公里的误报列表。
## IDORacle 的不同之处
它不读取响应。它读取**已提交状态**(committed state)。
1. 作为主体 A,植入一个携带全新 128 位 canary token 的对象。
2. 作为主体 B(攻击者),写入该对象。
3. 作为主体 A,重新读取它。如果 canary 发生了改变,那么无论 B 收到了什么状态码,都**确凿地**发生了一次未授权写入。误报概率 `<= 2^-128`。
如果 A 无法植入对象,或者没有任何已提交状态视图能反映它,IDORacle 会返回 `provably_blind` 且不作任何断言。诚实的盲区胜过自信的错误答案。
## 在真实的第三方应用上得到验证
这不是一个玩具演示。它是针对本项目组无人参与编写的软件进行的实时运行:
| 目标 | 发现结果 | IDORacle 判定 | 状态码扫描器会做出的行为 |
|---|---|---|---|
| **OWASP Juice Shop** v20 | 真实的写入型 IDOR(编辑其他用户的评论) | `witness` -> 签名 `fail` | 也会标记它(真阳性) |
| **OWASP crAPI** 最新版 | 跨用户 `PUT` 返回 **HTTP 200** 但什么也没写入 | `no-bug`(可靠) | 大喊“BOLA!”(**误报**) |
在真实代码上展现了双向的可靠性:它既能抓到真实的漏洞,也不会凭空捏造不存在的漏洞。
## 快速开始
```
git clone https://github.com/cengo441337-a11y/IDORacle && cd IDORacle
python -m unittest discover -s idoracle/tests -p "test_*.py" # 57 tests, stdlib only
python idoracle/demo.py # the canary soundness table
python idoracle/obs_demo.py # which observation views are SOUND to witness on
```
验证来自 JSON recipe(ARES 原生工具)的一项发现:
```
python idoracle/witness_tool.py --recipe recipes/juiceshop-review-bola.json
# -> 已签名的判定 JSON:witness / no-bug / hold,content addressed + HMAC
```
## 它如何保持可靠性:合格视图自检
在你证明所搜索的视图反映了已提交状态之前,token 搜索仅仅是一种启发式方法。IDORacle 在信任每个观察通道之前都会对其进行合格性检验:
- **O1** 已授权:测试者可以读取该视图。
- **O2** 提交门控(commit gated):来自真实路径 **non-commit** 的 token 绝不能出现(这是一种阴性对照,用于排除尝试型和审计日志带来的误报)。
- **O3** 熵保持(entropy preserving):已提交的 token 必须原样存续(阳性对照)。
- **O4** 唯一因果路径:通过任何其他写入路径注入的 token 绝不能出现,且该视图不可被攻击者写入。
- **O5** 耐久性:token 能够在 settle 窗口期之后的新会话中存续。
已提交状态搜索、灰盒 DB 副本以及 OOB webhook 都符合条件。源于尝试操作的审计日志无法通过 O2。可被攻击者写入的 feed 无法通过 O4。同一个引擎会对它们全部进行评级。
## 设计上的诚实
- **签名回执。** 每个判定都是一个内容寻址、经 HMAC 签名的回执,其判定结果可离线重新推导。带有错误判定的有效签名回执将被拒绝。
- **双分母覆盖范围。** 一份随时有效的证书会报告在那些由构造保证为 `provably_blind` 的类别旁边,未经测试的授权类别的剩余质量。输出示例:`1 confirmed, 2 clean, 1 held; coverage >= 95% over 2/2 plantable classes; 4/6 declared classes provably_blind`。
- **感知策略。** 一个 B 有权写入的合法共享对象会触发原始见证(witness),但正确地**不将其视为**漏洞。
## ARES 原生
IDORacle 是 [ARES](https://github.com/cengo441337-a11y/ares)(自适应红队执行系统)的确定性验证 oracle。ARES 负责发现候选项,IDORacle 将每一个候选项转化为可靠的判定、签名回执以及覆盖率报告。`idoracle/witness_tool.py` 是一个独立的、仅依赖标准库(stdlib)的 ARES 工具,由 JSON recipe 驱动。
## 诚实的范围与现有技术
Token 注入加视图搜索的**机制属于现有技术**:BACScan(Liu 等人,CCS 2025,杰出论文奖)注入高熵 token 并通过依赖状态页进行确认。IDORacle 声明在此之上**没有提供任何新的检测能力**。其贡献是狭义且坦率的:即可执行的阴性和平行对照组套件,使得此类 oracle 在仅声明内容(content-only)模型内的误报在理论上是不可能的;此外还包括诚实的盲区报告和签名回执。可靠性是依赖于模型的(黑盒可能会通过 timing 或你无法通过认证消除的其他侧信道发生泄漏)。纯粹的黑盒完整性(completeness)在信息论上是不可能的,而 IDORacle 对此直言不讳。
脉络传承:honeytoken(Spitzner,“Honeytokens: The Other Honeypot”,2003),二阶注入从源到汇聚点(Dahse 和 Holz,USENIX Security 2014),置信序列博弈(Waudby-Smith 和 Ramdas,JRSS-B 86(1):1-27, 2024)。
## 目录结构
```
idoracle/
oracle.py canary write witness + signed receipt + verify_witness
views.py the O1-O5 qualifying view self test
schema.py authorization equivalence class DSL
coverage.py classifier + policy aware verdict + ENVELOPE_NOTES
certificate.py anytime valid coverage certificate (betting test martingale)
pipeline.py one audit bundle: validate + certify + honest report
witness_tool.py ARES native, recipe driven CLI
target_app.py / obs_target.py / ext_target.py deterministic lab targets
tests/ 57 tests, stdlib unittest
recipes/ validation recipes (e.g. juiceshop-review-bola.json)
docs/ the model conditional soundness write up
```
## 许可证
MIT。仅用于授权测试。标签:API安全, BOLA/IDOR验证, CISA项目, JSON输出, Python, 对称加密, 无后门, 自动化审计, 逆向工具