
Vulnerabilidade BOLA/IDOR no osTicket ajax.tickets.php | Divulgação Responsável
ajax.tickets.phpAutorização de Nível de Objeto Quebrada (BOLA): Referência Direta a Objeto Insegura (IDOR)
include/ajax.tickets.php→ funçãoviewField()
Reportado por @JF0x0r · 27 de março de 2026 Status: CORRIGIDO - Correção lançada no osTicket v1.17.8 / v1.18.4
| Campo | Detalhes |
|---|---|
| Vulnerabilidade | BOLA / IDOR (Autorização de Nível de Objeto Quebrada) |
| Alvo | osTicket v1.18-git - commit 2570d69 |
| Componente | include/ajax.tickets.php |
| Função | viewField() - linhas 805–806 |
| Endpoint | GET /scp/ajax.php/tickets/{ticket_id}/field/{field_id}/view |
| Pontuação 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 (Autorização Ausente), CWE-639 (Bypass de Autenticação via Chave Controlada pelo Usuário) |
| Status | ✅ Corrigido — corrigido no osTicket v1.17.8 e v1.18.4 |
Sou Juan Felipe Oz (@JF0x0r), um pesquisador de segurança apaixonado por segurança em código aberto. Não faço isso por recompensas; faço porque acredito que as ferramentas nas quais as pessoas confiam devem ser seguras. Quando encontro algo, reporto de forma responsável, documento adequadamente e compartilho publicamente assim que é corrigido.
Durante uma revisão manual de código do subsistema AJAX do osTicket, percebi algo estranho em ajax.tickets.php. A função viewField() lida com requisições para visualizar dados de campos de tickets — e de fato ela recupera o objeto do ticket e valida se o campo existe. Mas nunca verifica se o agente solicitante realmente tem permissão para acessar aquele ticket.
Nenhum checkStaffPerm(). Nenhuma validação de departamento. Nada.
Isso significa que qualquer agente autenticado, mesmo estritamente limitado a um único departamento, pode ler campos de tickets de qualquer outro departamento no sistema, apenas conhecendo ou adivinhando o ticket_id e o field_id. Eles são inteiros sequenciais. Fáceis de enumerar.
O que torna isso particularmente claro é a comparação com editField(), a função irmã logo acima no mesmo arquivo. editField() corretamente chama $ticket->checkStaffPerm($thisstaff, Ticket::PERM_EDIT) e retorna HTTP 403 em caso de violação. A correção já estava implementada para gravações — simplesmente nunca foi aplicada para leituras.
Gravei uma demonstração completa de ponta a ponta da exploração em um ambiente de laboratório controlado:
O vídeo mostra:
agent_a autenticado com acesso restrito apenas ao Dept-AO script exploit.py neste repositório automatiza toda a cadeia (autenticação → enumeração → acesso não autorizado a campos) e foi usado durante a avaliação para confirmar que o problema escala além de testes manuais.
ticket_id / field_id tornam a raspagem em massa trivialInserção de uma única linha em viewField(), imediatamente após a recuperação do objeto do ticket — espelhando exatamente o que editField() já faz corretamente. Detalhes técnicos completos, diff e detalhamento CVSS estão no relatório anexo.
📄 BOLA_IDOR_osTicket_Report_v2.pdf
A equipe do osTicket confirmou o relatório e implementou a mitigação adicionando $ticket->checkStaffPerm($thisstaff) antes de resolver/renderizar o campo solicitado — espelhando a verificação já presente em editField(). Agora, a equipe deve ter acesso ao ticket pai antes de visualizar os dados do campo.
| Detalhe | Referência |
|---|---|
| Commit da correção | d590a9770d25159fb7741681f36e23a35f1fb5e9 |
| Corrigido em | v1.17.8 · v1.18.4 |
| Downloads oficiais | osticket.com/download |
| Tipo de lançamento | Lançamento de segurança acelerado |
| Agradecimento | Juan Felipe Oz (@JF0x0r) |
A equipe do osTicket recomenda um curto período de espera para atualização antes de compartilhar os passos completos da exploração publicamente. Este repositório segue essa orientação — veja a Cronologia da Divulgação abaixo.
| Data | Evento |
|---|---|
| 27 de março de 2026 | Vulnerabilidade descoberta e documentada |
| 27 de março de 2026 | Relatório enviado para [email protected] |
| 17 de junho de 2026 | osTicket confirma o problema e compartilha correção de mitigação para verificação |
| 17 de junho de 2026 | osTicket lança v1.17.8 e v1.18.4 contendo a correção (commit d590a9770d25159fb7741681f36e23a35f1fb5e9) |
| — | Atribuição de CVE pendente via GitHub CNA |
.
├── README.md # Este arquivo
├── BOLA_IDOR_osTicket_Report_v2.pdf # Relatório técnico completo
├── exploit.py # Script de automação do PoC
└── PoC_osTicket.mov # Cópia local do vídeo de demonstração
Reportei isso de forma privada à equipe de segurança do osTicket antes de publicar qualquer coisa. Este repositório foi tornado público somente após o prazo de divulgação responsável, e agora que uma correção oficial foi lançada, o relatório completo está disponível. Se você é mantenedor do osTicket e tem dúvidas, sinta-se à vontade para entrar em contato diretamente pelo GitHub.
Encontrado por @JF0x0r · Segurança em código aberto importa.