
Уязвимость BOLA/IDOR в osTicket ajax.tickets.php | Ответственное раскрытие
ajax.tickets.phpНарушение авторизации на уровне объектов (BOLA): Небезопасная прямая ссылка на объект (IDOR)
include/ajax.tickets.php→ функцияviewField()
Сообщено @JF0x0r · 27 марта 2026 Статус: ИСПРАВЛЕНО - исправление выпущено в osTicket v1.17.8 / v1.18.4
| Поле | Подробности |
|---|---|
| Уязвимость | BOLA / IDOR (Нарушение авторизации на уровне объектов) |
| Цель | osTicket v1.18-git - коммит 2570d69 |
| Компонент | include/ajax.tickets.php |
| Функция | viewField() - строки 805–806 |
| Конечная точка | 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 (Отсутствие авторизации), CWE-639 (Обход авторизации через управляемый пользователем ключ) |
| Статус | ✅ Исправлено — исправлено в osTicket v1.17.8 и v1.18.4 |
Я Хуан Фелипе Оз (@JF0x0r), исследователь безопасности, увлеченный безопасностью открытого кода. Я делаю это не ради вознаграждений, а потому что верю, что инструменты, на которые полагаются люди, должны быть безопасными. Когда я нахожу что-то, я ответственно сообщаю об этом, правильно документирую и публикую после исправления.
Проводя ручной аудит кода AJAX-подсистемы osTicket, я заметил нечто подозрительное в ajax.tickets.php. Функция viewField() обрабатывает запросы на просмотр данных полей тикета - она получает объект тикета и проверяет существование поля. But she никогда не проверяет, имеет ли запрашивающий агент разрешение на доступ к этому тикету.
Нет вызова checkStaffPerm(). Нет проверки отдела. Ничего.
Это означает, что любой аутентифицированный агент, даже строго ограниченный одним отделом, может читать поля тикетов из любого другого отдела системы, просто зная или угадывая ticket_id и field_id. Это последовательные целые числа. Легко перебираются.
Особенно наглядно это видно при сравнении с editField(), родственной функцией, расположенной в том же файле выше. editField() правильно вызывает $ticket->checkStaffPerm($thisstaff, Ticket::PERM_EDIT) и возвращает HTTP 403 при нарушении. Исправление уже было реализовано для записи - его просто не применили к чтению.
Я записал полную сквозную демонстрацию эксплуатации в контролируемой лабораторной среде:
В видео показано:
agent_a аутентифицирован с доступом только к Dept-AСкрипт exploit.py в этом репозитории автоматизирует всю цепочку (аутентификация → перебор → неавторизованный доступ к полям) и использовался при оценке для подтверждения, что проблема выходит за рамки ручного тестирования.
ticket_id / field_id делают массовый сбор тривиальнымВставка одной строки в viewField(), сразу после получения объекта тикета - точно так же, как это уже правильно сделано в editField(). Полные технические детали, diff и разбор CVSS содержатся в приложенном отчете.
📄 BOLA_IDOR_osTicket_Report_v2.pdf
osTicket подтвердил отчет и реализовал смягчение, добавив $ticket->checkStaffPerm($thisstaff) перед разрешением/отображением запрошенного поля - зеркально отражая проверку, уже присутствующую в editField(). Теперь сотрудник должен иметь доступ к родительскому тикету перед просмотром данных поля.
osTicket рекомендует короткую паузу перед публикацией полных шагов эксплуатации. Этот репозиторий следует этой рекомендации - см. График раскрытия ниже.
.
├── README.md # Этот файл
├── BOLA_IDOR_osTicket_Report_v2.pdf # Полный технический отчет
├── exploit.py # Скрипт автоматизации PoC
└── PoC_osTicket.mov # Локальная копия демонстрационного видео
Я сообщил об этом конфиденциально команде безопасности osTicket до публикации. Этот репозиторий был сделан публичным только после окончания периода ответственного раскрытия, и теперь, когда официальный патч выпущен, доступна полная документация. Если вы являетесь разработчиком osTicket и у вас есть вопросы, обращайтесь напрямую через GitHub.
Найдено @JF0x0r · Безопасность открытого кода важна.
| Деталь | Ссылка |
|---|
| Коммит патча | d590a9770d25159fb7741681f36e23a35f1fb5e9 |
| Исправлено в | v1.17.8 · v1.18.4 |
| Официальные загрузки | osticket.com/download |
| Тип релиза | Ускоренный релиз безопасности |
| Благодарность | Juan Felipe Oz (@JF0x0r) |
| Дата | Событие |
|---|
| 27 марта 2026 | Уязвимость обнаружена и задокументирована |
| 27 марта 2026 | Отчет отправлен на [email protected] |
| 17 июня 2026 | osTicket подтверждает проблему и предоставляет патч для проверки |
| 17 июня 2026 | osTicket выпускает v1.17.8 и v1.18.4 с исправлением (коммит d590a9770d25159fb7741681f36e23a35f1fb5e9) |
| — | Назначение CVE ожидается через GitHub CNA |