- 개요
spring-cloud-config-server는 spring으로 개발된 웹 어플리케이션의 환경설정을 외부화 하기 위해 사용됩니다.
특정 버전에서 spring-cloud-config-server의 모듈을 통해 임의 환경설정 파일을 제공할 수 있습니다.
환경설정 파일을 요청할 때 조작된 URI로 인해 Directory Traversal (디렉토리 탐색) 취약점이 발생합니다.
- 취약한 버전
2.2.x < 2.2.3
2.1.x < 2.1.9
All older versions
- 취약점 설명 및 분석
해당 취약점의 주요 패치를 보면 다음과 같습니다. 위 패치에서 #에 대한 검증과 아래 패치에서
name, label 변수에 검증이 추가된 것을 볼 수 있습니다.
EnvironmentController.java 를 보면 http://127.0.0.1:port/1/2/3 URI를 기준으로 순서대로
name = 1, profiles = 2, label = 3로 설정된다는 것을 확인할 수 있습니다.
getArgs를 보면 요청받은 URI 형태를 이용해 새 경로를 생성합니다.
생성된 인자는 NativeEnvironmentRepository.java 의 builder.run(args) 로 전달되어 spring boot로 전달합니다.
아래와 같은 요청을 보냈을 때 URI가 어떻게 파싱되어 처리되는지 확인할 수 있습니다.
name과 profile 값이 존재하는 파일인지 확인하고 존재한다면 name에 새 경로를 받아
파일의 리소스를 응답해주는 것을 볼 수 있습니다. 존재하지 않는다면 기본으로 설정된 경로의 파일을 보여줍니다.
PassthruEnvironmentRepository Class에서 보면 name, profile, label 을 이용해 파일이 존재하는지 확인하고 name에 새 경로를 넣어 줍니다.
또한 위의 요청과 응답을 봤을 때 label은 name이 재 설정될 때 큰 역할을 하지 않는 것으로 판단됩니다.
때문에 profiles은 존재하는 값으로 고정하고 name값 만을 조정해서 테스트를 진행하였습니다.
그리고 위의 패치 노트에서 "#"에 대한 패치를 하였으니 "#" 문자를 이용해 location을 끊어줄 수 있다는 추측을 할 수 있습니다.
즉, name과 "#" 을 이용해 대상 시스템의 디렉토리 탐색을 할 수 있습니다.
아래와 같은 URI 요청으로 시스템의 주요 파일을 탈취할 수 있습니다
- 위협요소
spring-cloud-config-server 의 주요 파일들이 탈취당할 수 있으며 통신하는 서버에 추가적인 침투가 가능할 수 있습니다. 특히 내부망의 경우 내부망 침투의 key가 될 수 있습니다.
- 대응방안
1) Version Update
2) config-server는 내부 네트워크에서만 접근 가능하도록 하고 접근 시 로그인 절차가 필요