
CVE-2026-44166을 위한 실습 및 분석: 검증되지 않은 createData.email을 통한 PocketBase OAuth2 계정 사전 하이재킹
PocketBase 인증 컬렉션에서 OAuth2가 활성화되면 클라이언트가 가입 시 createData 객체를 전달할 수 있습니다. createData 안의 이메일은 OAuth2 제공자가 확인한 이메일과 비교되지 않습니다. 구성된 제공자에 계정이 있는 사람은 자신의 OAuth2 ID에 연결된 타인의 이메일을 포함하는 레코드를 등록할 수 있습니다.
하나의 제공자가 구성된 경우 실제 소유자는 잠깁니다. 두 개 이상인 경우 소유자는 나중에 다른 제공자를 통해 로그인하여 공격자와 계정을 공유하게 됩니다.
영향: < 0.22.42 및 >= 0.30.0, < 0.37.4. 0.22.42 및 0.37.4에서 수정됨.
권고: GHSA-pq7p-mc74-g65w. CWE-287. CVSS 4.0 6.1.
전체 분석: WRITEUP.md
python fetch_binaries.py # pulls vulnerable 0.37.3 + patched 0.37.4 for your OS
python poc.py # pre-claim and lockout against the vulnerable build
python verify_fix.py 0.37.4 # same steps on the patched build, attacker gets evicted
Python 3.8 이상, 표준 라이브러리만 사용. PoC는 번들로 제공된 모의 OAuth2 제공자를 대상으로 오프라인에서 실행되므로 실제 IdP나 네트워크 대상이 없습니다.
취약한 0.37.3:
[1] Attacker token issued for: [email protected] (verified=False)
[2] Victim login: HTTP 400 -- Failed to authenticate.
[3] Attacker re-auth: [email protected] -- same record: True
패치된 0.37.4:
[1] Attacker pre-claims: [email protected] verified=False id=...
[2] Victim login: SUCCESS verified=True id=... => victim owns the account
[3] Attacker re-auth: [email protected] id=... same-as-victim=False
교육 및 승인된 보안 테스트용: 자신의 실습 환경, CTF 및 HTB 박스, 범위 내 버그 바운티 대상. 실습 환경은 오프라인이며 직접 실행하지 않는 모든 것을 건드리지 않습니다.
| 파일 | 용도 |
|---|
WRITEUP.md | 근본 원인 분석, 두 공격 변종, 수정, 탐지 |
fetch_binaries.py | OS/아키텍처에 맞는 0.37.3 / 0.37.4 바이너리 다운로드 |
mock_oauth2_server.py | 소형 오프라인 모의 OAuth2 제공자 (토큰 + 사용자 정보) |
poc.py | 취약한 빌드에 대한 익스플로잇 |
verify_fix.py | 모든 빌드에서 동일한 단계를 실행하고 결과 보고 |