@better-auth/scim: SCIM 공급자 ID 충돌을 통한 계정 탈취 및 오래된 액세스
애플리케이션이 @better-auth/scim 플러그인을 등록하고 인증된 사용자가 SCIM 토큰을 생성하도록 허용하는 경우 영향을 받습니다. 기본 canGenerateToken 정책이 영향을 받았으며, 다른 계정 공급자가 이미 사용하는 공급자 ID를 거부하지 않을 때 사용자 지정 정책도 영향을 받았습니다. 공급자 ID 충돌 문제에는 추가로 SSO, SAML, OIDC, 일반 OAuth 또는 계정 행이 사용자 지정 공급자 ID를 사용하는 소셜 공급자와 해당 ID 아래의 기존 계정 행이 필요합니다.
프로비저닝 해제 및 이메일 업데이트 문제에는 SCIM 플러그인과 유효한 SCIM 전달자 토큰만 필요합니다. @better-auth/scim@1.4.0-beta.27부터 1.6.21까지 게시된 버전이 영향을 받습니다. '1.7.0-beta.0'부터 '1.7.0-beta.9'까지의 베타 버전이 영향을 받습니다. @better-auth/scim@1.6.22 또는 1.7.0-beta.10으로 업그레이드하세요.
@better-auth/scim은 SCIM 공급자 구성 및 계정 소유권에 동일한 논리 공급자 ID를 사용했습니다. SCIM 토큰 발행은 모든 계정 제공자 네임스페이스를 거부하지 않았습니다. 따라서 인증된 사용자는 공급자 ID가 기존 SSO, SAML, OIDC, 일반 OAuth 또는 소셜 공급자와 일치하는 SCIM 토큰을 만들 수 있습니다. SCIM 사용자는 해당 공급자 ID를 기준으로 선택한 계정 행을 라우팅하고 해당 사용자를 SCIM 토큰이 프로비저닝한 적이 없는 경우에도 SCIM 관리 사용자로 처리합니다.
동일한 쓰기 경로에 2개의 추가 유효성 검사 문제가 있었습니다. 첫째, SCIM active: false는 모델링되지 않았으므로 사용자가 활성 상태를 유지하는 동안 ID 공급자가 성공적인 응답을 받을 수 있었습니다. 둘째, SCIM PUT 및 PATCH 업데이트는 create에서 사용하는 것과 동일한 고유성 확인 없이 전역 이메일 주소를 변경했으며 이메일 재할당 후에도 'emailVerified'는 변경되지 않았습니다.
SCIM 전달자 미들웨어는 전달자 토큰에서 공급자 ID를 디코딩하고 일치하는 'scimProvider' 행을 로드했습니다. 그런 다음 사용자 목록 및 사용자 조회는 account.providerId를 통해 일반 계정 행을 쿼리했습니다. 이로 인해 공급자 ID가 사용자 제어 인증 키가 되었습니다. SCIM 토큰이 SSO, SAML, OIDC, 일반 OAuth 또는 다른 계정 공급자에 속한 공급자 ID를 사용한 경우 SCIM 경로는 토큰이 소유하지 않은 사용자를 확인할 수 있습니다.
가장 큰 영향을 받은 경로는 비조직 삭제였습니다. 영향을 받는 버전에서 비조직 SCIM 토큰에 대한 'DELETE /scim/v2/Users/:id'는 충돌하는 공급자 ID를 통해 사용자를 확인한 후 전역 Better Auth 사용자와 해당 세션을 삭제했습니다. 따라서 권한이 낮은 인증된 사용자는 충돌하는 공급자 네임스페이스와 연결된 사용자를 삭제할 수 있습니다.
조직 범위 토큰도 공급자 ID 충돌의 영향을 받았습니다. 충돌하는 공급자 ID가 조직의 SSO 또는 OIDC 연결과 일치하는 경우 SCIM PUT 또는 PATCH는 SSO 프로비저닝된 조직 구성원을 확인하고 전역 프로필 필드를 다시 작성할 수 있습니다. 패치 이전에는 SCIM을 통해 사용자의 이메일을 변경하면 고유성 확인을 건너뛰고 'emailVerified'가 변경되지 않았습니다.
SCIM 비활성화에는 별도의 실패 모드가 있었습니다. SCIM 'active' 속성이 사용자 스키마 및 PATCH 매핑에서 누락되어 'active: false'가 요청에서 제거되었습니다. 표준 ID 제공자 비활성화 신호는 사용자가 ID, 세션 및 액세스를 유지하는 동안 성공을 반환할 수 있습니다.
@better-auth/scim@1.6.22 및 @better-auth/scim@1.7.0-beta.10에서 수정되었습니다.
패치는 토큰이 생성되기 전에 내장 공급자, 구성된 소셜 공급자, 일반 OAuth 공급자 및 SSO 공급자 행과 충돌하는 SCIM 공급자 ID를 거부합니다. 또한 사용자에게 다른 ID가 있는 경우 SCIM 삭제 범위를 SCIM 계정 링크로 지정합니다. 글로벌 사용자는 SCIM 계정이 사용자의 유일한 연결 계정인 경우에만 삭제됩니다.
패치는 SCIM active 속성을 모델로 합니다. 앱 수준 SCIM 비활성화는 active: false를 관리 플러그인의 강제 비활성화된 사용자 상태에 매핑하고 세션을 취소합니다. 관리 플러그인이 없으면 요청이 자동으로 삭제되는 대신 거부됩니다.
패치는 SCIM PUT에 이메일 고유성 검사를 추가하고 PATCH는 SCIM이 사용자의 이메일을 변경할 때마다 'emailVerified'를 업데이트하고 재설정합니다.
즉시 업그레이드할 수 없는 경우 'canGenerateToken'을 구성하여 애플리케이션에서 사용하는 계정 공급자 ID와 일치하는 공급자 ID를 거부하세요. 내장 공급자, 소셜 공급자, 일반 OAuth 공급자, SSO, SAML 및 OIDC 공급자 ID를 포함합니다. 또한 SCIM 토큰을 생성할 수 있는 사용자를 제한합니다.
업그레이드할 때까지 ID 공급자의 비활성화 보고서에 의존하지 마십시오. 비활성화된 사용자가 실제로 액세스 권한을 상실했는지 확인하세요. 특히 ID 공급자가 active: false를 통해 프로비저닝을 해제한 경우 더욱 그렇습니다.
SCIM 계정 연결을 사용하는 경우 광범위한 도메인 기반 연결 규칙을 피하세요. 공유 이메일 도메인은 SCIM 토큰이 기존 사용자를 관리할 수 있다는 증거가 아닙니다. 조직 멤버십 확인이나 명시적인 애플리케이션 조건을 선호합니다.
기존 scimProvider 행을 감사하고 providerId가 다른 계정 공급자 네임스페이스와 일치하는 행을 제거합니다.
공급자 ID 충돌 문제로 인해 인증된 공격자는 자신이 소유하지 않은 공급자 네임스페이스를 통해 행동할 수 있습니다. 충돌하는 공급자에 연결된 사용자의 SCIM 사용자 리소스를 나열하고 읽을 수 있습니다. 또한 프로필 및 계정 필드를 업데이트하고 비조직 경로에서 전역 사용자 기록을 삭제할 수도 있습니다. 조직 범위 배포에서 충돌 토큰은 SSO 프로비저닝된 조직 구성원에 대한 전역 프로필 필드를 변경할 수 있습니다.
비활성화 문제로 인해 ID 공급자가 active: false를 통해 성공적인 프로비저닝 해제를 보고한 후 종료된 사용자가 활성 상태로 남아 있을 수 있습니다. 이메일 업데이트 문제로 인해 SCIM은 강제 고유 인덱스 없이 어댑터에서 한 사용자의 이메일을 다른 사용자에게 할당할 수 있습니다. 이로 인해 이메일 입력 로그인 및 조회가 손상될 수 있으며, SQL 어댑터에서는 처리되지 않은 어댑터 오류가 발생할 수 있습니다.
내부 검증을 통해 발견되었습니다.
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 99.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 99.00 |
VPI 공식 vpi-v1 기준