
Vulnerabilidad BOLA/IDOR en osTicket ajax.tickets.php | Divulgación responsable
ajax.tickets.phpAutorización rota a nivel de objeto (BOLA): Referencia directa insegura a objetos (IDOR)
include/ajax.tickets.php→ funciónviewField()
Reportado por @JF0x0r · 27 de marzo de 2026 Estado: PARCHEADO - Corrección publicada en osTicket v1.17.8 / v1.18.4
| Campo | Detalles |
|---|---|
| Vulnerabilidad | BOLA / IDOR (Autorización rota a nivel de objeto) |
| Objetivo | osTicket v1.18-git - commit 2570d69 |
| Componente | include/ajax.tickets.php |
| Función | viewField() - líneas 805–806 |
| Endpoint | GET /scp/ajax.php/tickets/{ticket_id}/field/{field_id}/view |
| Puntuación CVSS 4.0 | 8.2 ALTA - AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N |
| CWE | CWE-862 (Autorización faltante), CWE-639 (Omisión de autenticación mediante clave controlada por el usuario) |
| Estado | ✅ Parcheado — corregido en osTicket v1.17.8 y v1.18.4 |
Soy Juan Felipe Oz (@JF0x0r), investigador de seguridad apasionado por la seguridad del código abierto. No hago esto por recompensas; lo hago porque creo que las herramientas en las que la gente confía deberían ser seguras. Cuando encuentro algo, lo reporto de forma responsable, lo documento adecuadamente y lo comparto públicamente una vez que está corregido.
Mientras realizaba una revisión manual del código del subsistema AJAX de osTicket, noté algo extraño en ajax.tickets.php. La función viewField() gestiona las solicitudes para ver los datos de los campos del ticket - y sí recupera el objeto del ticket y valida que el campo exista. Pero nunca comprueba si el agente que realiza la solicitud tiene realmente permiso para acceder a ese ticket.
Sin checkStaffPerm(). Sin validación de departamento. Nada.
Esto significa que cualquier agente autenticado, incluso uno estrictamente limitado a un solo departamento, puede leer campos de tickets de cualquier otro departamento del sistema, solo con conocer o adivinar el ticket_id y el field_id. Son enteros secuenciales. Fáciles de enumerar.
Lo que hace esto particularmente evidente es la comparación con editField(), la función hermana justo encima en el mismo archivo. editField() llama correctamente a $ticket->checkStaffPerm($thisstaff, Ticket::PERM_EDIT) y devuelve HTTP 403 ante una violación. La corrección ya estaba implementada para escrituras — simplemente nunca se aplicó a las lecturas.
Grabé una demostración completa de extremo a extremo del exploit en un entorno de laboratorio controlado:
El video muestra:
agent_a autenticado con acceso restringido únicamente a Dept-AEl script exploit.py de este repositorio automatiza toda la cadena (autenticación → enumeración → acceso no autorizado a campos) y se utilizó durante la evaluación para confirmar que el problema escala más allá de las pruebas manuales.
ticket_id / field_id hacen que el raspado masivo sea trivialUna inserción de una sola línea en viewField(), inmediatamente después de recuperar el objeto del ticket, replicando exactamente lo que editField() ya hace correctamente. Los detalles técnicos completos, el diff y el desglose CVSS están en el informe adjunto.
📄 BOLA_IDOR_osTicket_Report_v2.pdf
osTicket confirmó el informe e implementó la mitigación añadiendo $ticket->checkStaffPerm($thisstaff) antes de resolver/representar el campo solicitado, replicando la comprobación ya presente en editField(). El personal ahora debe tener acceso al ticket principal antes de ver los datos de los campos.
osTicket recomienda un breve margen de actualización antes de compartir públicamente los pasos completos del exploit. Este repositorio sigue esa directriz; consulte Cronograma de divulgación a continuación.
.
├── 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
Reporté esto de forma privada al equipo de seguridad de osTicket antes de publicar nada. Este repositorio se hizo público solo después de la ventana de divulgación responsable y, ahora que se ha publicado un parche oficial, el informe completo está disponible. Si eres mantenedor de osTicket y tienes preguntas, no dudes en contactar directamente a través de GitHub.
Encontrado por @JF0x0r · La seguridad del código abierto importa.
| Detalle | Referencia |
|---|
| Commit del parche | d590a9770d25159fb7741681f36e23a35f1fb5e9 |
| Corregido en | v1.17.8 · v1.18.4 |
| Descargas oficiales | osticket.com/download |
| Tipo de lanzamiento | Lanzamiento de seguridad acelerado |
| Agradecimiento | Juan Felipe Oz (@JF0x0r) |
| Fecha | Evento |
|---|
| 27 de marzo de 2026 | Vulnerabilidad descubierta y documentada |
| 27 de marzo de 2026 | Informe enviado a [email protected] |
| 17 de junio de 2026 | osTicket confirma el problema y comparte el parche de mitigación para verificación |
| 17 de junio de 2026 | osTicket publica v1.17.8 y v1.18.4 con la corrección (commit d590a9770d25159fb7741681f36e23a35f1fb5e9) |
| — | Asignación de CVE pendiente a través del CNA de GitHub |