🇰🇷 한글 설명
Eclipse BaSyx Helm Charts 2.2.0의 aas-basyx-v2-full 차트에서 번들 Keycloak 활성화 시 basyx-technical-user 클라이언트 시크릿이 Kubernetes ConfigMap에 평문으로 저장됩니다. ConfigMap만 읽을 수 있는 사용자가 이 시크릿으로 admin 역할 토큰을 발급받아 모든 BaSyx 리포지토리와 레지스트리에 대한 전체 권한을 얻을 수 있습니다.
💡 쉬운 설명
인증에 쓰이는 비밀번호가 설정 저장소에 암호화되지 않은 채 보관되어 있습니다. 이를 읽을 수 있는 사람은 관리자 권한을 얻어 시스템 전체를 조작할 수 있습니다.
🇺🇸 원문 (English)
In Eclipse BaSyx Helm Charts version 2.2.0 of the `aas-basyx-v2-full` chart, deployments with the bundled Keycloak enabled store the client secret of the `basyx-technical-user` OAuth2 client in cleartext in a Kubernetes ConfigMap. This client uses the client-credentials grant and its service account holds the realm `admin` role.
The chart correctly writes `keycloak.technicalUser.clientSecret` to a Kubernetes Secret, but the template `basyx-keycloak-realm.yaml` also substitutes the same value into the Keycloak realm-import JSON, which is stored in the ConfigMap `<keycloak.fullnameOverride>-realm`. A principal that can read ConfigMaps but not Secrets in the release namespace, such as a holder of the built-in Kubernetes `view` ClusterRole, can read the client secret from the ConfigMap. They can then exchange it at the Keycloak token endpoint for an access token with the `admin` role. That token grants full create, read, update, delete and execute rights on all BaSyx repositories and registries in the deployment.
The bundled Keycloak is disabled by default. No fixed release of the `aas-basyx-v2-full` chart exists. Affected users should migrate to the `basyx` chart, or deploy without the bundled Keycloak and rotate the `basyx-technical-user` client secret.
📍 영향받는 시스템
Eclipse BaSyx Helm Charts 2.2.0의 aas-basyx-v2-full 차트 (번들 Keycloak 활성화 배포, 수정 버전 없음)
⚔️ 공격 벡터
view 등 ConfigMap 읽기 권한을 가진 사용자가 realm-import ConfigMap에서 클라이언트 시크릿을 추출한 뒤 Keycloak 토큰 엔드포인트에서 admin 토큰을 발급받아 권한을 탈취합니다.
🛡️ 대응 방법
aas-basyx-v2-full 차트 대신 basyx 차트로 마이그레이션하거나 번들 Keycloak 없이 배포한 후 basyx-technical-user 클라이언트 시크릿을 즉시 교체합니다.
🔧 검증 코드
결과에 basyx-technical-user 클라이언트 시크릿 값이 포함된 ConfigMap이 나오면 취약하며, 출력이 없으면 해당 노출이 확인되지 않은 것입니다.
kubectl get configmap -A -o json 2>/dev/null | grep -i 'basyx-technical-user' | head -n 5