
CVE-2026-59358에 대한 개념 증명(Proof-of-concept) 랩 및 익스플로잇 클라이언트로, Cloud Foundry UAA가 사용자 PKCE 토큰을 client_credentials Bearer로 재사용하여 권한 있는 클라이언트 토큰을 발급하는 취약점을 시연합니다.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · CVE-2026-59358
분류: 권한 잔존(Privilege leftover) 도달 범위: 원격
Cloud Foundry UAA v79.6.0 - VMware by Broadcom / Cloud Foundry Foundation
저는 @abraxas_null입니다. 루프백 랩입니다. 클라이언트는 CVE-2026-59358-Abraxas-Labs.py입니다.
공개 PKCE 사용자 액세스 토큰이 동일한 이중 그랜트(dual-grant) 클라이언트에 대한 grant_type=client_credentials에서 Bearer 클라이언트 인증으로 허용됩니다. UAA는 해당 클라이언트의 권한(이 랩에서는 clients.write)을 가진 클라이언트 전용 토큰을 발급합니다. 사용자 토큰 자체는 POST /oauth/clients에서 403을 반환합니다. 이 잔존 토큰이 새로운 OAuth 클라이언트를 생성합니다. 공개된 CVE에 대한 독립적인 랩입니다. 크레딧: Minseong Kim (mak3bread).
| CVE | CVE-2026-59358 · CVE.org |
| 분류 | 권한 잔존 (사용자 토큰이 client_credentials Bearer로 재사용됨; RCE 아님) |
| 도달 범위 | 원격 (공격자 자신의 사용자 액세스 토큰) |
| CWE | CWE-287 |
| CVSS | High: 7.6 CVSS:4.0/AV:N/AC:L/AT:P/PR:L/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N |
| 제품 | Cloud Foundry UAA |
| 영향받는 버전 | UAA v3.7.0 ~ v79.6.0; cf-deployment ~ v60.4.0 |
| 패치됨 | UAA v79.7.0; cf-deployment v60.5.0 |
| 인증 | 인증됨 (공격자 자신의 사용자 PKCE 토큰) |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1 전용 |
client_credentials도 함께 나열하는 공개 OAuth 클라이언트를 통해 로그인합니다. 해당 사용자 JWT를 grant_type=client_credentials와 함께 POST /oauth/token의 Authorization: Bearer로 재전송합니다. UAA는 해당 클라이언트의 권한을 가진 클라이언트 전용 토큰을 반환합니다. 그 권한에 clients.write가 포함되어 있으면 공격자가 선택한 권한으로 새로운 OAuth 클라이언트를 생성할 수 있습니다. 클라이언트 시크릿은 필요하지 않습니다.
사용자 토큰만으로는 클라이언트를 관리할 수 없습니다. 이 잔존 취약점은 client_id가 일치하는 유효한 액세스 토큰을 클라이언트 인증으로 취급하는 토큰 엔드포인트 검사입니다.
영향은 해당 클라이언트의 권한에 따라 확대됩니다. 이 조합(공개 사용자 플로우와 하나의 client_id에 대한 client_credentials)은 기본값이 아닙니다.
Cloud Foundry는 2026년 10월 5일 CVE-2026-59358을 공개했습니다. 저는 마지막 영향 버전인 cfidentity/uaa:v79.6.0을 고정하고, 전용 이중 그랜트 공개 클라이언트 labpub을 세우고, 기본 사용자 marissa로 PKCE를 진행했습니다. 부정 통제: POST /oauth/clients에 대한 사용자 토큰은 403입니다. 공격: client_credentials에 동일한 Bearer를 사용하면 200이고, 그다음 labwit-CVE-2026-59358-WITNESS를 생성하면 201입니다.
이미 기록된 시행착오: v79.7.0(패치됨) 고정; /uaa 컨텍스트 경로 없이 /oauth/token 호출; issuer와 redirect에서 localhost와 127.0.0.1 혼용; 기본 login 클라이언트 사용(clients.write 없음); PKCE 대신 password grant; Basic client_id:secret과 사용자 Bearer를 함께 전송(이는 정당한 클라이언트 인증임).
루프백의 HTTP 18258. 이미지 docker.io/cfidentity/uaa:v79.6.0 (linux/amd64). Compose 프로젝트 cve-2026-59358. ./run.sh.
대상은 오직 127.0.0.1:18258 (또는 바인딩한 루프백)입니다.
python3 CVE-2026-59358-Abraxas-Labs.py
이 명령은 lab/로 chdir한 후 run.sh를 실행합니다(compose up, /uaa/info 대기, 그다음 poc.py).
증거: 발급된 client_credentials JWT는 clients.write를 포함하고, POST /oauth/clients는 labwit-CVE-2026-59358-WITNESS에 대해 201을 반환합니다. 동일 엔드포인트에 대한 사용자 토큰은 403입니다.
SUCCESS CVE-2026-59358 grant=client_credentials clients.write create-http=201 id=labwit-CVE-2026-59358-WITNESS CVE-2026-59358-WITNESS
아무것도 배우지 못하는 실패 방법:
v79.7.0 이상UAA를 v79.7.0 이상으로, 또는 cf-deployment를 v60.5.0으로 업그레이드하십시오. 그때까지는 공개 사용자 대상 그랜트와 client_credentials를 동일한 client_id에 두지 말고, clients.write는 전용 비공개 클라이언트에 유지하십시오.
패치된 빌드에 대해 CVE-2026-59358-Abraxas-Labs.py를 다시 실행하십시오: client_credentials에 대한 사용자 Bearer는 200이 아니어야 합니다.
hub.docker.com/r/cfidentity/uaa 태그 v79.6.0
Abraxas Labs: abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected]
GNU Affero GPL v3.0. LICENSE를 참조하십시오.
클라이언트는 루프백과 통신합니다. 소유하지 않은 시스템에 대해 사용하는 것은 Abraxas Labs에 의해 승인되지 않습니다. 보증하지 않습니다.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected]