JFOZ1010/CVE-2026-14871
GitHub: JFOZ1010/CVE-2026-14871
该项目记录了 osTicket 系统中一个 CVSS 8.2 高危 BOLA/IDOR 漏洞的完整披露过程,包含 PoC 脚本、技术报告及官方修复详情。
Stars: 0 | Forks: 0
# CVE-2026-14871 - osTicket `ajax.tickets.php` 中的 BOLA / IDOR
## 概览
| 字段 | 详情 |
|---|---|
| **漏洞** | BOLA / IDOR (Broken Object Level Authorization) |
| **目标** | osTicket v1.18-git - commit `2570d69` |
| **组件** | `include/ajax.tickets.php` |
| **函数** | `viewField()` - 第 805–806 行 |
| **Endpoint** | `GET /scp/ajax.php/tickets/{ticket_id}/field/{field_id}/view` |
| **CVSS 4.0 评分** | **8.2 高危** - `AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N` |
| **CWE** | CWE-862 (Missing Authorization), CWE-639 (Auth Bypass via User-Controlled Key) |
| **状态** | ✅ **已修复** — 已在 osTicket v1.17.8 和 v1.18.4 中修复 |
## 关于我
我是 Juan Felipe Oz ([@JF0x0r](https://www.linkedin.com/in/juanfelipeoz/)),一名对开源安全充满热情的安全研究员。我做这些不是为了赏金,而是因为我相信人们所依赖的工具应该是安全的。当我发现问题时,我会负责任地报告,妥善地记录下来,并在修复后将其公开。
## 发现了什么
在对 osTicket 的 AJAX 子系统进行手动代码审查时,我注意到 `ajax.tickets.php` 中有些不对劲。`viewField()` 函数处理查看工单字段数据的请求——它确实获取了工单对象并验证了字段是否存在。但它**从未检查发出请求的 agent 是否真的有权限访问该工单**。
没有 `checkStaffPerm()`。没有部门验证。什么都没有。
这意味着任何经过身份验证的 agent,即使是那些被严格限制在单一部门的 agent,也可以读取系统**任何其他部门**的工单字段,只需知道或猜出 `ticket_id` 和 `field_id`。这些都是连续的整数。很容易枚举。
让这一点特别明确的是与同一文件中正上方同级函数 `editField()` 的对比。`editField()` 正确地调用了 `$ticket->checkStaffPerm($thisstaff, Ticket::PERM_EDIT)` 并在违规时返回 HTTP 403。针对写入操作的修复已经实现——只是从未应用于读取操作。
## 概念验证:在线演示
我在受控的实验环境中录制了完整的端到端漏洞利用演示:
[](https://drive.google.com/file/d/1xpHmI-3ZFSYQc7qeRtKGVTEbbtanohl7/view)
视频演示了以下内容:
- 两个相互隔离的部门(Dept-A 和 Dept-B)的实验环境设置
- 经过身份验证的 agent `agent_a`,其访问权限仅限于 Dept-A
- 构造针对 Dept-B 机密工单的未授权请求
- 服务器返回 **HTTP 200**,暴露了受限的工单字段数据
- 修复后的重放演示,显示 **HTTP 403 — 权限被拒绝**
本仓库中的 `exploit.py` 脚本自动化了整个链条(身份验证 → 枚举 → 未授权字段访问),并在评估期间用于确认该问题已超出手动测试的范围。
## 影响
- **敏感数据泄露** - 任何 agent 都可以跨所有部门读取机密工单字段
- **水平越权** - 部门边界被完全绕过
- **大规模枚举** - 连续的 `ticket_id` / `field_id` 整数使得批量抓取变得轻而易举
- **多租户机密性破坏** - 破坏了 osTicket 部门隔离模型的核心设计原则
## 修复方案
在 `viewField()` 中插入了一行代码,紧接在获取工单对象之后——与 `editField()` 已经正确执行的操作完全一致。完整的技术细节、代码差异 (diff) 和 CVSS 详解见随附报告。
📄 [`BOLA_IDOR_osTicket_Report_v2.pdf`](./BOLA_IDOR_osTicket_Report_v2.pdf)
### ✅ 官方补丁 (由 osTicket 团队确认)
osTicket 确认了该报告,并通过在解析/渲染请求字段之前添加 `$ticket->checkStaffPerm($thisstaff)` 来实现缓解措施——这与 `editField()` 中已有的检查相呼应。现在,Staff 在查看字段数据之前必须拥有对父级工单的访问权限。
| 详情 | 参考 |
|---|---|
| **补丁 commit** | [`d590a9770d25159fb7741681f36e23a35f1fb5e9`](https://github.com/osTicket/osTicket/commit/d590a9770d25159fb7741681f36e23a35f1fb5e9) |
| **修复于** | [v1.17.8](https://github.com/osTicket/osTicket/releases/tag/v1.17.8) · [v1.18.4](https://github.com/osTicket/osTicket/releases/tag/v1.18.4) |
| **官方下载** | [osticket.com/download](https://osticket.com/download) |
| **发布类型** | 加速安全发布 |
| **致谢** | Juan Felipe Oz ([@JF0x0r](https://x.com/PwnedRar_)) |
## 漏洞披露时间线
| 日期 | 事件 |
|---|---|
| 2026年3月27日 | 发现并记录漏洞 |
| 2026年3月27日 | 将报告发送至 `security@osticket.com` |
| 2026年6月17日 | osTicket 确认该问题,并分享了缓解补丁以供验证 |
| 2026年6月17日 | osTicket 发布包含修复的 **v1.17.8** 和 **v1.18.4** (commit `d590a9770d25159fb7741681f36e23a35f1fb5e9`) |
| — | CVE 分配正在通过 GitHub CNA 处理中 |
## 本仓库的文件
```
.
├── README.md # This file
├── BOLA_IDOR_osTicket_Report_v2.pdf # Full technical disclosure report
├── exploit.py # PoC automation script
└── PoC_osTicket.mov # Local copy of the demo video
```
## 负责任的漏洞披露
在发布任何内容之前,我已经私下将此问题报告给了 osTicket 安全团队。本仓库仅在负责任的漏洞披露窗口期过后公开,并且现在官方补丁已经发布,完整的报告也已可供查阅。如果您是 osTicket 的维护者并有任何疑问,请随时直接通过 GitHub 与我联系。
发现者 @JF0x0r · 开源安全至关重要。
标签:BOLA/IDOR, CISA项目, CVE, Web安全, 数字签名, 漏洞披露, 蓝队分析, 逆向工具