
Keycloak 데이터베이스에서 CVE-2026-18963 악용 흔적(Keycloak 인증되지 않은 계정 탈취)을 탐색합니다.
Keycloak PostgreSQL 데이터베이스에서 CVE-2026-18963 악용 흔적(reset-credentials 흐름을 통한 인증되지 않은 계정 탈취)을 검색하는 psql 스크립트입니다.
KYOS가 게시했습니다. 운영 중인 Keycloak 배포를 패치하면서 노출 기간 동안 아무도 탈취되지 않았는지 확인하기 위해 작성했습니다.
CVE-2026-18963은 keycloak-services의 reset-credentials 흐름에 존재하는 결함입니다(keycloak#51833). 인증되지 않은 공격자가 메일 확인 링크를 클릭하지 않고도 모든 사용자의 비밀번호 재설정 프로세스를 완료한 다음 해당 계정에 새 비밀번호를 설정할 수 있습니다. 사용자 상호작용은 필요하지 않습니다.
심각도: Critical, CVSS v3.1 9.1(AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N), Red Hat 및 NVD 기준. 근본 원인은 인증 흐름에서의 부적절한 상태 검증이며, keycloak#51844에서 수정되었습니다.
| 스트림 | 수정 버전 |
|---|
| 26.7.x | 26.7.2 (릴리스 노트) |
| 26.6.x | 26.6.6 |
| 26.4.x (LTS) | 26.4.15 |
| 26.8 | 26.8.0 |
지원되는 스트림에서 해당 버전 미만의 모든 버전은 취약합니다. 지원이 종료된 릴리스(26.5.x, 26.3 및 이전 버전)에는 수정 사항이 제공되지 않으므로 노출된 것으로 간주하고 수정된 스트림으로 업그레이드하세요. Red Hat은 레거시 RH-SSO 7을 영향받지 않는 것으로 명시합니다. Red Hat Build of Keycloak 26.4/26.6은 26.4.15-1 / 26.6.6-1에서 수정되었습니다.
셀프 서비스 비밀번호 재설정을 비활성화하면 취약한 진입점이 제거됩니다. 모든 realm에 대해 Admin console > Realm settings > Login > "Forgot password"를 끄세요. 관리자 API를 통해서는 PUT /admin/realms/{realm}에 {"resetPasswordAllowed": false}를 포함하여 호출합니다.
이렇게 하면 login-actions/reset-credentials 엔드포인트가 차단되지만 정당한 사용자가 자신의 비밀번호를 재설정하는 것도 막으므로 업그레이드할 때까지의 임시 방편으로 취급하세요. Red Hat은 이 CVE에 대해 공식적으로 권장하는 완화 조치를 제공하지 않습니다. 패치가 유일한 실제 해결책입니다.
cve-2026-18963-keycloak-hunt.sql은 네 가지 읽기 전용 쿼리를 실행합니다:
| 쿼리 | 발견 내용 |
|---|---|
| Q0 | realm이 로그인/관리자 이벤트를 저장하는지 여부와 그 TTL. 이벤트가 꺼져 있거나 만료된 경우 Q2/Q3의 빈 결과는 아무것도 증명하지 못합니다. |
| Q1 | 노출 기간 내에 설정된 모든 비밀번호 자격 증명(credential.created_date). 이는 탈취 그 자체이며 이벤트 로깅이 꺼져 있어도 작동합니다. |
| Q2 | 재설정/자격 증명 로그인 이벤트로, 이전 24시간 내 SEND_RESET_PASSWORD 없이 완료된 재설정에 플래그를 지정합니다(no_email_before = t). 이 플래그가 CVE 시그니처입니다. 공격자는 메일을 트리거한 적이 없습니다. |
| Q3 | 관리자 API 자격 증명 재설정 및 execute-actions 작업으로, 관리자 주도 경로를 배제하기 위한 것입니다. |
# defaults: realm 'master', window since 2026-06-01
psql -U keycloak -d keycloak -f cve-2026-18963-keycloak-hunt.sql
# explicit realm and window (run once per realm, quote values exactly like this)
psql -U keycloak -d keycloak \
-v realm="'myrealm'" -v since="'2026-05-01'" \
-f cve-2026-18963-keycloak-hunt.sql
since를 취약한 버전이 출시되기 직전 시점으로 설정하세요. Kubernetes에서는:
kubectl exec -it my-postgres-pod -- \
psql -U keycloak -d keycloak -v realm="'myrealm'" -v since="'2026-05-01'" \
-f - < cve-2026-18963-keycloak-hunt.sql
Q1의 행이 자동으로 침해를 의미하지는 않습니다. 각 행을 알려진 정당한 원인(셀프 서비스 재설정, 헬프데스크 작업, 신규 등록)과 대조하고 설명되지 않는 모든 항목을 탈취 후보로 취급하세요.
RESET_PASSWORD, UPDATE_CREDENTIAL 또는 UPDATE_PASSWORD에서 no_email_before = t가 표시된 Q2 행은 이 CVE가 악용되었음을 나타내는 가장 강력한 지표입니다. ip_address 열을 액세스 로그와 대조하세요.
Q0을 먼저 확인하세요. 로그인 이벤트는 만료되며(events_expiration) 완전히 비활성화될 수도 있습니다. Q1은 만료되지 않으므로 가장 신뢰할 수 있는 확인 방법입니다.
MIT, LICENSE 참조. 있는 그대로 제공되며, 어떠한 보증도 없습니다.