
Vulnérabilité BOLA/IDOR dans osTicket ajax.tickets.php | Divulgation responsable
ajax.tickets.phpAutorisation au niveau objet brisée (BOLA) : Référence directe à un objet non sécurisée (IDOR)
include/ajax.tickets.php→viewField()fonction
Signalé par @JF0x0r · 27 mars 2026 Statut : CORRIGÉ - Correctif publié dans osTicket v1.17.8 / v1.18.4
| Champ | Détails |
|---|
| Vulnérabilité | BOLA / IDOR (Autorisation au niveau objet brisée) |
| Cible | osTicket v1.18-git - commit 2570d69 |
| Composant | include/ajax.tickets.php |
| Fonction | viewField() - lignes 805–806 |
| Endpoint | GET /scp/ajax.php/tickets/{ticket_id}/field/{field_id}/view |
| Score CVSS 4.0 | 8.2 ÉLEVÉ - AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N |
| CWE | CWE-862 (Absence d'autorisation), CWE-639 (Contournement d'authentification via clé contrôlée par l'utilisateur) |
| Statut | ✅ CORRIGÉ — corrigé dans osTicket v1.17.8 et v1.18.4 |
Je suis Juan Felipe Oz (@JF0x0r), un chercheur en sécurité passionné par la sécurité des logiciels open source. Je ne fais pas cela pour des primes, je le fais parce que je crois que les outils sur lesquels les gens comptent doivent être sûrs. Quand je trouve quelque chose, je le signale de manière responsable, je le documente correctement, et je le partage publiquement une fois corrigé.
Lors d'une revue manuelle du code du sous-système AJAX d'osTicket, j'ai remarqué quelque chose d'anormal dans ajax.tickets.php. La fonction viewField() gère les demandes de visualisation des données de champ de ticket - et elle récupère bien l'objet ticket et valide l'existence du champ. Mais elle ne vérifie jamais si l'agent demandeur a réellement la permission d'accéder à ce ticket.
Pas de checkStaffPerm(). Pas de validation de département. Rien.
Cela signifie que tout agent authentifié, même strictement limité à un seul département, peut lire les champs de ticket de n'importe quel autre département du système, simplement en connaissant ou en devinant le ticket_id et le field_id. Ce sont des entiers séquentiels. Faciles à énumérer.
Ce qui rend cela particulièrement flagrant, c'est la comparaison avec editField(), la fonction sœur située juste au-dessus dans le même fichier. editField() appelle correctement $ticket->checkStaffPerm($thisstaff, Ticket::PERM_EDIT) et renvoie un HTTP 403 en cas de violation. Le correctif était déjà implémenté pour les écritures — il n'a simplement jamais été appliqué aux lectures.
J'ai enregistré une démonstration complète de bout en bout de l'exploitation dans un environnement de laboratoire contrôlé :
La vidéo présente :
agent_a authentifié avec un accès restreint au seul Dept-ALe script exploit.py dans ce dépôt automatise la chaîne complète (authentification → énumération → accès non autorisé aux champs) et a été utilisé lors de l'évaluation pour confirmer que le problème s'étend au-delà des tests manuels.
ticket_id / field_id rendent le scraping en masse trivialUne insertion d'une seule ligne dans viewField(), immédiatement après la récupération de l'objet ticket - ce qui reflète exactement ce que editField() fait déjà correctement. Les détails techniques complets, le diff et la décomposition CVSS se trouvent dans le rapport joint.
osTicket a confirmé le rapport et a mis en œuvre l'atténuation en ajoutant $ticket->checkStaffPerm($thisstaff) avant de résoudre/afficher le champ demandé - ce qui reflète la vérification déjà présente dans editField(). Les membres du personnel doivent désormais avoir accès au ticket parent avant de visualiser les données de champ.
| Détail | Référence |
|---|---|
| Commit du correctif | d590a9770d25159fb7741681f36e23a35f1fb5e9 |
| Corrigé dans | v1.17.8 · v1.18.4 |
| Téléchargements officiels | osticket.com/download |
| Type de version | Version de sécurité accélérée |
| Remerciements | Juan Felipe Oz (@JF0x0r) |
osTicket recommande un court délai de mise à niveau avant de partager publiquement les étapes complètes de l'exploitation. Ce dépôt suit cette directive - voir Calendrier de divulgation ci-dessous.
| Date | Événement |
|---|---|
| 27 mars 2026 | Vulnérabilité découverte et documentée |
| 27 mars 2026 | Rapport envoyé à [email protected] |
| 17 juin 2026 | osTicket confirme le problème et partage le correctif d'atténuation pour vérification |
| 17 juin 2026 | osTicket publie les versions v1.17.8 et v1.18.4 contenant le correctif (commit d590a9770d25159fb7741681f36e23a35f1fb5e9) |
| — | Attribution CVE en attente via GitHub CNA |
.
├── README.md # Ce fichier
├── BOLA_IDOR_osTicket_Report_v2.pdf # Rapport de divulgation technique complet
├── exploit.py # Script d'automatisation de la PoC
└── PoC_osTicket.mov # Copie locale de la vidéo de démonstration
J'ai signalé ceci en privé à l'équipe de sécurité d'osTicket avant de publier quoi que ce soit. Ce dépôt a été rendu public seulement après la fenêtre de divulgation responsable, et maintenant qu'un correctif officiel a été publié, le rapport complet est disponible. Si vous êtes un mainteneur d'osTicket et avez des questions, n'hésitez pas à me contacter directement via GitHub.
Trouvé par @JF0x0r · La sécurité open source compte.