
BOLA/IDOR-Schwachstelle in osTicket ajax.tickets.php | Verantwortungsvolle Offenlegung
ajax.tickets.phpBroken Object Level Authorization (BOLA): Insecure Direct Object Reference (IDOR)
include/ajax.tickets.php→viewField()Funktion
Gemeldet von @JF0x0r · 27. März 2026
Status: GEPATCHT - Fix veröffentlicht in osTicket v1.17.8 / v1.18.4
| Feld | Details |
|---|---|
| Schwachstelle | BOLA / IDOR (Broken Object Level Authorization) |
| Ziel | osTicket v1.18-git - Commit 2570d69 |
| Komponente | include/ajax.tickets.php |
| Funktion | viewField() - Zeilen 805–806 |
| Endpunkt | GET /scp/ajax.php/tickets/{ticket_id}/field/{field_id}/view |
| CVSS 4.0 Punktzahl | 8.2 HOCH - AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N |
| CWE | CWE-862 (Fehlende Autorisierung), CWE-639 (Auth-Bypass über benutzergesteuerten Schlüssel) |
| Status | ✅ Gepatcht — behoben in osTicket v1.17.8 und v1.18.4 |
Ich bin Juan Felipe Oz (@JF0x0r), ein Sicherheitsforscher, der sich leidenschaftlich für Open-Source-Sicherheit einsetzt. Ich mache das nicht für Bountys, sondern weil ich glaube, dass die Werkzeuge, auf die Menschen angewiesen sind, sicher sein sollten. Wenn ich etwas finde, melde ich es verantwortungsvoll, dokumentiere es ordnungsgemäß und teile es öffentlich, sobald es behoben ist.
Bei einer manuellen Code-Überprüfung des AJAX-Subsystems von osTicket ist mir etwas in ajax.tickets.php aufgefallen. Die Funktion viewField() bearbeitet Anfragen zur Anzeige von Ticketfelddaten – sie ruft das Ticketobjekt ab und prüft, ob das Feld existiert. Aber sie prüft nie, ob der anfragende Agent tatsächlich die Berechtigung hat, auf dieses Ticket zuzugreifen.
Kein checkStaffPerm(). Keine Abteilungsvalidierung. Nichts.
Das bedeutet, dass jeder authentifizierte Agent, selbst wenn er streng auf eine einzige Abteilung beschränkt ist, Ticketfelder aus jeder anderen Abteilung im System lesen kann – nur durch Kenntnis oder Erraten der ticket_id und field_id. Dies sind sequentielle Ganzzahlen. Leicht zu enumerieren.
Was dies besonders eindeutig macht, ist der Vergleich mit editField(), der Schwesterfunktion direkt darüber in derselben Datei. editField() ruft korrekt $ticket->checkStaffPerm($thisstaff, Ticket::PERM_EDIT) auf und gibt bei Verstoß HTTP 403 zurück. Der Fix war bereits für Schreibvorgänge implementiert – er wurde nur nie auf Lesevorgänge angewendet.
Ich habe eine vollständige End-to-End-Demonstration des Exploits in einer kontrollierten Laborumgebung aufgezeichnet:
Das Video zeigt:
agent_a authentifiziert mit Zugriff nur auf Dept-ADas Skript exploit.py in diesem Repository automatisiert die gesamte Kette (Authentifizierung → Enumeration → unbefugter Feldzugriff) und wurde während der Bewertung verwendet, um zu bestätigen, dass das Problem über manuelle Tests hinausgeht.
ticket_id- / field_id-Ganzzahlen machen Massen-Scraping trivialEine einzelne Zeileneinfügung in viewField(), unmittelbar nachdem das Ticketobjekt abgerufen wurde – genau das, was editField() bereits korrekt tut. Vollständige technische Details, Diff und CVSS-Aufschlüsselung finden Sie im beigefügten Bericht.
📄 BOLA_IDOR_osTicket_Report_v2.pdf
osTicket bestätigte den Bericht und implementierte die Abhilfe, indem $ticket->checkStaffPerm($thisstaff) vor dem Auflösen/Rendern des angeforderten Feldes hinzugefügt wurde – dies spiegelt die bereits in editField() vorhandene Prüfung wider. Mitarbeiter müssen nun Zugriff auf das übergeordnete Ticket haben, bevor sie Felddaten anzeigen können.
osTicket empfiehlt eine kurze Upgrade-Frist, bevor vollständige Exploit-Schritte öffentlich geteilt werden. Dieses Repository folgt dieser Richtlinie – siehe Offenlegungszeitplan unten.
.
├── 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
Ich habe dies privat an das osTicket-Sicherheitsteam gemeldet, bevor ich etwas veröffentlicht habe. Dieses Repository wurde erst nach Ablauf der verantwortungsvollen Offenlegungsfrist und nachdem ein offizieller Patch ausgeliefert wurde, öffentlich gemacht. Der vollständige Bericht ist nun verfügbar. Wenn Sie ein osTicket-Maintainer sind und Fragen haben, können Sie mich gerne direkt über GitHub kontaktieren.
Gefunden von @JF0x0r · Open-Source-Sicherheit ist wichtig.
| Detail | Referenz |
|---|
| Patch-Commit | d590a9770d25159fb7741681f36e23a35f1fb5e9 |
| Behoben in | v1.17.8 · v1.18.4 |
| Offizielle Downloads | osticket.com/download |
| Release-Typ | Beschleunigtes Sicherheits-Release |
| Danksagung | Juan Felipe Oz (@JF0x0r) |
| Datum | Ereignis |
|---|
| 27. März 2026 | Schwachstelle entdeckt und dokumentiert |
| 27. März 2026 | Bericht an [email protected] gesendet |
| 17. Juni 2026 | osTicket bestätigt das Problem und teilt den Abhilfe-Patch zur Überprüfung |
| 17. Juni 2026 | osTicket veröffentlicht v1.17.8 und v1.18.4 mit dem Fix (Commit d590a9770d25159fb7741681f36e23a35f1fb5e9) |
| — | CVE-Zuweisung ausstehend über GitHub CNA |