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。针对写入操作的修复已经实现——只是从未应用于读取操作。 ## 概念验证:在线演示 我在受控的实验环境中录制了完整的端到端漏洞利用演示: [![PoC 视频 — BOLA/IDOR osTicket](https://img.shields.io/badge/▶%20Watch%20PoC-Google%20Drive-blue?style=for-the-badge&logo=google-drive)](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安全, 数字签名, 漏洞披露, 蓝队分析, 逆向工具