
osTicket ajax.tickets.php의 BOLA/IDOR 취약점 | 책임 있는 공개
ajax.tickets.php의 BOLA / IDOR깨진 객체 수준 권한 부여(BOLA): 안전하지 않은 직접 객체 참조(IDOR)
include/ajax.tickets.php→viewField()함수
보고자: @JF0x0r · 2026년 3월 27일 상태: 패치됨 - 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 HIGH - 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)입니다. 저는 현상금을 위해 이 일을 하지 않습니다. 사람들이 의존하는 도구가 안전해야 한다고 믿기 때문에 하는 것입니다. 무언가를 발견하면 책임감 있게 신고하고, 제대로 문서화한 뒤, 수정이 이루어진 후에 공개적으로 공유합니다.
osTicket의 AJAX 하위 시스템을 수동 코드 검토하던 중 ajax.tickets.php에서 이상한 점을 발견했습니다. viewField() 함수는 티켓 필드 데이터를 조회하는 요청을 처리하며, 티켓 객체를 검색하고 필드가 존재하는지 검증합니다. 그러나 요청한 상담원이 실제로 해당 티켓에 접근할 권한이 있는지는 절대 확인하지 않습니다.
checkStaffPerm() 호출도 없습니다. 부서 검증도 없습니다. 아무것도 없습니다.
즉, 인증된 상담원이라면 단일 부서로 엄격히 제한된 상담원이라 할지라도 ticket_id와 field_id만 알거나 추측하면 시스템의 다른 모든 부서의 티켓 필드를 읽을 수 있습니다. 이들은 순차적인 정수이므로 열거하기 쉽습니다.
이번 사례가 특히 명확한 이유는 같은 파일에서 바로 위에 있는 형제 함수 editField()와의 비교입니다. editField()는 $ticket->checkStaffPerm($thisstaff, Ticket::PERM_EDIT)를 올바르게 호출하고 위반 시 HTTP 403을 반환합니다. 쓰기 작업에는 이미 수정이 적용되어 있었지만, 읽기 작업에는 결코 적용되지 않았습니다.
통제된 실험실 환경에서 익스플로잇의 전체 과정을 처음부터 끝까지 녹화했습니다:
영상은 다음 단계를 보여줍니다:
agent_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 # 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
저는 어떤 것도 공개하기 전에 osTicket 보안 팀에 이 내용을 비공개로 보고했습니다. 이 저장소는 책임 있는 공개 기간이 지난 후에만 공개되었으며, 이제 공식 패치가 배포되었으므로 전체 문서를 공개합니다. osTicket 유지관리자이시고 궁금한 점이 있으시면 GitHub를 통해 직접 연락 주시기 바랍니다.
발견자: @JF0x0r · 오픈소스 보안은 중요합니다.
| 세부 정보 | 참조 |
|---|
| 패치 커밋 | d590a9770d25159fb7741681f36e23a35f1fb5e9 |
| 수정 버전 | v1.17.8 · v1.18.4 |
| 공식 다운로드 | osticket.com/download |
| 릴리스 유형 | 신속 보안 릴리스 |
| 공로 표기 | Juan Felipe Oz (@JF0x0r) |
| 날짜 | 내용 |
|---|
| 2026년 3월 27일 | 취약점 발견 및 문서화 |
| 2026년 3월 27일 | [email protected]으로 보고서 전송 |
| 2026년 6월 17일 | osTicket이 문제를 확인하고 검증용 완화 패치 공유 |
| 2026년 6월 17일 | osTicket이 수정 사항이 포함된 v1.17.8 및 v1.18.4 릴리스(커밋 d590a9770d25159fb7741681f36e23a35f1fb5e9) |
| — | GitHub CNA를 통한 CVE 지정 대기 중 |