mvcRequestMatcher Spring 취약점에 대한 심층 분석

2023년 3월 20일, Spring 보안 권고팀은 블로그 게시물을 통해 내부적으로 발견된 취약점인 CVE-2023-20860을 언급했습니다. mvcMatchers 사용과 관련된 접근 제어 문제라는 점 외에 자세한 정보는 공개되지 않았습니다. mvcMatchers Spring 개발자들은 해당 문제를 해결했으며, 버전 업데이트를 권장합니다.
직접 경험해 보고 싶으신가요? 여기에서 미션을 시도해 보세요.
Secure Code Warrior는 보안을 최우선으로 생각하기 때문에, 이번 mvcRequestMatchers 취약점을 심층 분석하여 근본적인 문제가 어디에 있는지 파악해 보기로 했습니다.
Spring은 요청이 경로 패턴과 일치하는지 확인하기 위해 RequestMatcher 인터페이스를 제공합니다. 아래 코드 스니펫에서 mvcMatchers 헬퍼 메서드가 엔드포인트와 해당 인증 및 권한 부여 요구 사항을 등록하는 데 어떻게 사용되는지 살펴보세요. 예를 들어, ADMIN 역할을 가진 사용자만 /logs/audit 엔드포인트에 액세스할 수 있음을 알 수 있습니다.

MvcMisMatchers?
Spring에서 **은 URL의 모든 디렉터리 및 하위 디렉터리와 일치하는 패턴입니다. 예를 들어, /bankaccount/**는 /bankaccount/로 시작하는 모든 URL과 일치하며, /bankaccount/dashboard/settings와 같은 하위 디렉터리도 포함합니다.
* 패턴은 모든 URL과 일치하며 정확히 한 단계의 하위 디렉터리만 포함하는 패턴입니다. 예를 들어, /bankaccount/* 는 bankaccount/dashboard와 일치합니다.
Spring은 *로 매처를 구성할 때 "Spring Security와 Spring MVC 간의 패턴 매칭 불일치"가 발생하여 취약점이 생성되었다고 설명합니다.
본질적으로, 이중 와일드카드 앞에 구분 기호가 없기 때문에 모든 수신 요청 앞에 슬래시가 붙는 상황에서 경로가 수신 요청과 일치하지 않게 됩니다. 이는 접근 제어 규칙이 적용되지 않아 인증되지 않은 사용자가 리소스에 액세스할 수 있게 됨을 의미합니다.
문제를 해결한 커밋을 살펴보겠습니다.

가장 눈에 띄고 중요한 변경 사항은 315번째 줄의 추가입니다. 이 변경은 권한 부여 및 인증 규칙 우회를 수정합니다. 제출된 모든 경로 패턴 앞에 슬래시(/)가 추가되도록 보장합니다.
404 일치 항목을 찾을 수 없음

/bankaccounts/view 로 웹 요청을 보낼 때 match 메서드는 보안 필터에 정의된 패턴과 요청된 경로를 구문 분석하고 비교합니다. 파서는 주어진 패턴을 경로 요소 트리로 변환합니다.

파서는 첫 번째 문자를 SeparatorPathElement로 읽습니다. 그런 다음 다음 구분 기호가 나올 때까지 문자열 문자를 계속 읽으며 새로운 LiteralPathElement를 생성합니다.
그렇다면 **를 패턴으로 사용할 때 어디에서 문제가 발생하는 걸까요?
경로 요소 유형은 다양하지만, 여기서 가장 흥미로운 것은 WildcardPathElement와 WildcardTheRestPathElement이며, 각각의 문자열 표현은 *와 /**입니다.
WildcardPathElement는 단일 경로 세그먼트 내에서 0개 이상의 문자와 일치하며, WildcardTheRestPathElement는 (구분 기호를 포함하여) 0개 이상의 경로 세그먼트 자체와 일치합니다.
후자는 **를 패턴으로 제출할 때 무엇이 잘못되는지에 대한 단서를 제공합니다. 구문 분석 중에 패턴을 찾지만, **는 예상되는 슬래시(/)로 시작하지 않습니다. 따라서 WildcardTheRestPathElement가 되는 대신, 연속된 두 개의 WildcardPathElement가 됩니다.
다음으로, 구문 분석된 패턴은 요청된 URL과 일치하는지 확인하는 데 사용됩니다. 경로는 슬래시(/)로 시작해야 하지만, 와일드카드는 구분 기호와 일치하지 않습니다.

이는 RequestMatchResult 대신 null이 반환됨을 의미합니다. 결과적으로, 이 매처에 설정된 접근 제어 규칙은 요청된 URL에 적용되지 않습니다.
Spring은 슬래시를 앞에 추가하여 이 문제를 해결했습니다. 즉, 모든 ** 패턴은 /**가 되어 WildcardTheRestPathElement로 구문 분석될 수 있으며, 패턴이 요청된 URL과 일치하게 되어 RequestMatchResult가 반환됩니다.
취약점인가, API 오용인가?
코드가 의도한 대로 작동하기 때문에 이를 취약점으로 간주해야 할지는 논쟁의 여지가 있습니다. 근본적인 문제는 Spring 문서에 경로가 구분 기호로 시작해야 한다는 명시적인 언급이 부족하다는 점입니다. 따라서 이는 버그나 취약점이라기보다는 API 오용 사례로 보는 것이 더 적절할 수 있습니다.
배포 전 AI 기반 개발 거버넌스 확보
AI 기반 위험을 측정하고, 커밋 시점에 보안 코딩 정책을 적용하며, SDLC 전반에 걸쳐 안전한 소프트웨어 제공 속도를 높이세요.
더 많은 블로그 살펴보기
보안 코딩, AI 거버넌스, 소프트웨어 리스크 관리에 관한 전문가 콘텐츠를 확인해 보세요.
%252520%252520(3).avif)
Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

Security as culture: How Blue Prism cultivates world-class secure developers
Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed
배포 전 AI 기반 개발 보안 확보
소프트웨어 개발 수명 주기 전반에서 개발자 리스크를 파악하고, 정책을 시행하며, 취약점을 예방하세요.



.avif)