Cargo 패키지 매니저에서 발생한 URL 정규화 오류로 인한 보안 권고(CVE-2026-5222)가 발표되었습니다.
최근 Rust 보안 응답 팀은 Cargo가 Sparse Index 프로토콜을 사용하는 서드파티 레지스트리의 URL을 처리할 때, 부적절하게 정규화(Normalization)를 수행하는 취약점을 발견했습니다. 이로 인해 특정 조건 하에서 공격자가 다른 사용자의 Cargo 인증 토큰(Credentials)을 탈취할 수 있는 가능성이 제기되었습니다.
최근 Rust 보안 응답 팀은 Cargo가 Sparse Index 프로토콜을 사용하는 서드파티 레지스트리의 URL을 처리할 때, 부적절하게 정규화(Normalization)를 수행하는 취약점을 발견했습니다. 이로 인해 특정 조건 하에서 공격자가 다른 사용자의 Cargo 인증 토큰(Credentials)을 탈취할 수 있는 가능성이 제기되었습니다.
취약점의 핵심: Git 레거시와 Sparse Index의 충돌
원래 Cargo는 레지스트리 인덱스를 Git 저장소 형태로 관리해 왔습니다. 대부분의 Git 호스팅 서비스는 URL 끝에.git접미사가 붙든 아니든 동일한 저장소로 간주하며, Cargo 역시 이를 반영하여 URL을 정규화했습니다. 즉,https://example.com/index.git과https://example.com/index를 동일한 엔드포인트로 인식하고 동일한 인증 정보를 사용하도록 설계된 것입니다.
하지만 이 정규화 로직이 Sparse Index(HTTPS 기반 프로토콜)에도 의도치 않게 적용되면서 문제가 발생했습니다. 일반적인 HTTPS 서버는
.git 유무를 엄격하게 구분하기 때문입니다. 만약 공격자가 동일 도메인 내에서 /index.git이라는 이름으로 악의적인 레지스트리를 구성하고 인증을 요구하도록 설정한다면, Cargo는 이를 정상 레지스트리와 혼동하여 사용자의 인증 토큰을 공격자의 서버로 전송할 수 있습니다.이 취약점의 영향도는 Low로 평가되었습니다. 이는 공격을 성공시키기 위해 동일 도메인 내 임의의 이름으로 다중 레지스트리를 호스팅할 수 있는 환경이 필요하다는 매우 까다로운 전제 조건 때문입니다.
영향을 받는 버전 및 조치 사항
- 영향 대상: Rust 1.68(Sparse Index 안정화 버전)부터 Rust 1.95까지의 모든 Cargo 버전.
- 해결 방안: 2026년 5월 28일 출시 예정인 Rust 1.96으로 업데이트. 해당 버전에서는 Git 프로토콜을 사용하는 경우에만
.git접미사를 제거하도록 수정됩니다. - 참고: 이전 버전에 대한 별도의 완화 방법은 제공되지 않습니다.
아키텍트의 분석
이번 CVE-2026-5222는 '하위 호환성을 위한 관대한 정규화 로직'이 현대적인 프로토콜 설계와 충돌할 때 발생하는 전형적인 보안 사례입니다.
첫째, 추상화의 누수(Leaky Abstraction) 관점에서 볼 때, Git이라는 특정 전송 계층의 특성(URL 유연성)을 패키지 매니저의 상위 URL 처리 로직에 전역적으로 적용한 것이 근본 원인입니다.
둘째, 인증 컨텍스트(Credential Context)의 모호성 문제입니다. 현대적인 클라우드 아키텍처나 멀티 테넌트 환경에서는 동일 도메인 내의 경로 기반 분리가 흔하게 발생합니다. 이때 URL 정규화가 지나치게 공격적이면 서로 다른 신뢰 경계(Trust Boundary)를 하나로 묶어버리는 'Credential Stuffing'의 변형된 통로를 열어주게 됩니다.
시스템 아키텍트들은 새로운 프로토콜(Sparse Index)을 도입할 때, 기존 레거시(Git)의 편의 기능이 보안 요구사항을 희석하지 않는지 엄격한 샌드박스형 로직 분리가 필요함을 시사합니다.
첫째, 추상화의 누수(Leaky Abstraction) 관점에서 볼 때, Git이라는 특정 전송 계층의 특성(URL 유연성)을 패키지 매니저의 상위 URL 처리 로직에 전역적으로 적용한 것이 근본 원인입니다.
둘째, 인증 컨텍스트(Credential Context)의 모호성 문제입니다. 현대적인 클라우드 아키텍처나 멀티 테넌트 환경에서는 동일 도메인 내의 경로 기반 분리가 흔하게 발생합니다. 이때 URL 정규화가 지나치게 공격적이면 서로 다른 신뢰 경계(Trust Boundary)를 하나로 묶어버리는 'Credential Stuffing'의 변형된 통로를 열어주게 됩니다.
시스템 아키텍트들은 새로운 프로토콜(Sparse Index)을 도입할 때, 기존 레거시(Git)의 편의 기능이 보안 요구사항을 희석하지 않는지 엄격한 샌드박스형 로직 분리가 필요함을 시사합니다.
댓글
댓글 쓰기