개발자 / 보안

'패치 속도 느리다' 스프링4셸 취약점 탐지 및 완화 방법

Lucian Constantin | CSO 2022.04.07
3월 말 스프링4셀(Spring4Shell) 취약점이 발견된 후부터 각 기업은 자체 애플리케이션과 서드파티 소프트웨어 제품이 스프링4셸에 취약한지 조사하고 있다. 스프링4셸은 자바 애플리케이션용으로 가장 널리 사용되는 개발 프레임워크인 스프링 프레임워크(Spring Framework)에 영향을 미치는 치명적인 원격 코드 실행(Remote Code Execution, RCE) 취약점이다. 악용 시도가 이미 관측되었음에도 개발자들은 스프링 인스턴스 업데이트에 굼뜬 모습이다.
 
ⓒ Getty Images Bank

가장 큰 자바 구성요소 및 라이브러리 리포지토리인 메이븐 센트럴(Maven Central)을 운영하는 소나타입(Sonatype)에 따르면, 결함이 확인된 3월 31일 이후 다운로드된 스프링의 80%가 취약한 프레임워크 버전이다. 메이븐 센트럴이 많은 개발 툴과 통합되는 만큼 소니타입이 공개한 데이터는 개발자들이 전반적으로 스프링 인스턴스 업그레이드를 서두르지 않고 있음을 나타낸다.

하지만 패치되지 않은 스피링 버전을 실행하는 앱이라고 해서 무조건 취약한 것은 아니다. 현재 알려진 익스플로잇이 작동하려면 기본 구성에서 보편적인 여러 조건을 애플리케이션이 충족해야 한다. 또한 프레임워크 자체를 업그레이드하지 않고 적용할 수 있는 위험 완화 방법도 있다.


스프링4셸 익스플로잇의 전제 조건

패치가 나오기 전에 유출된 최초의 개념 증명 익스플로잇 외에도 여러 변종이 돌고 있다. 아카마이(Akamai) 보안 연구원들은 GET과 POST 요청을 모두 사용하는 공격 변형을 관측했다. 특히 GET 요청은 공격자가 서버에 대한 하나의 요청만으로 취약점을 악용할 수 있도록 해준다. 웹 애플리케이션 방화벽(Web Application Firewalls, WAF)의 입력 필터링 또는 탐지 규칙을 회피하기 위해 코드 난독화 기법을 사용하는 변종도 있다.

독일 대형 통신사인 도이체 텔레콤(Deutsche Telekom)의 CERT팀은 3월 31일부터 도이체 텔레콤의 허니팟 서버를 대상으로 악용 시도가 일어나고 있다고 보고했다. 마이크로소프트의 위협 인텔리전스팀도 횟수가 많지는 않지만 자사 클라우드 서비스에서 악용 시도가 발생 중이라고 전했다. 미국 사이버보안 및 인프라 보안국(Cybersecurity and Infrastructure Security Agency, CISA)은 지난 4일 악용된 취약점 카탈로그에 스프링4셸(CVE-2022-22965)을 추가했다.

스프링4셸 취약점은 class.getModule이라는 새로운 API가 도입된 자바 개발 키트(JDK9)에서 실행되는 애플리케이션에만 영향을 미친다. 이 API는 공격자에게 클래스로더(ClassLoader)에 대한 대체 경로를 제공한다. 클래스로더는 매개변수를 외부에서 제어하면 안 되는 위험한 속성이다. 스프링은 비슷한 취약점이 패치됐던 2010년부터 이 속성에 대한 접근을 차단하는 코드를 적용했지만, JDK9에 추가된 getModule API는 블랙리스트에 포함되지 않았다. 다행인 것은 자바 애플리케이션 런타임으로 현재 더 많이 사용되고 있는 것이 스프링4셸 취약점을 악용할 수 없는 JDK8이라는 점이다. 

악용을 위한 다른 2가지 전제 조건은 취약한 애플리케이션이 아파치 톰캣(Tomcat) 웹 서버에서 실행되고 WAR(Web application ARchive) 패키지로 배포되어야 한다는 것이다. 다행히 많은 스프링 애플리케이션이 스프링 부트(Spring Boot)를 사용해 만들어진다. 스프링 부트는 독립형 애플리케이션을 쉽게 만들 수 있는 툴로, 실행 가능한 JAR(Java ARchive) 포맷을 기본으로 사용한다. 이런 애플리케이션은 취약하지 않다.

또한 애플리케이션이 스프링4셸 취약점에 노출되려면 개발자가 HTTP 요청 매개변수를 자바 객체에 바인딩할 수 있게 해주는 스프링 프레임워크의 데이터 바인딩 메커니즘을 사용해야 한다는 조건도 있다. 모든 애플리케이션이 이 기능을 사용하는 것은 아니지만, 스프링 웹사이트에 게시된 양식 제출 처리를 위한 기본 자습서 가운데 하나가 취약하다. 개발자가 해당 참조 코드를 사용했다면 취약점이 유입되었을 수 있다.


스프링4셸에 취약한 애플리케이션을 탐지하는 방법

여러 보안 연구원과 기업이 취약한 애플리케이션을 로컬 또는 원격으로 탐지하는 데 도움이 되는 툴을 내놨다. 사이버 보안 업체 제이프로그(JFrog)는 WAR 및 JAR 파일에서 가능한 데이터 바인딩 사례를 찾을 수 있는 파이썬 스캐너를 출시했다. 연구원 잔 샤우만은 리눅스 셸 스크립트로 된 비슷한 파일 시스템 스캐너를, 연구원 힐코 벵겐은 고 언어로 작성된 스캐너를 각각 발표했다.

마이크로소프트는 curl 명령줄 툴로 다음과 같은 요청을 실행해 원격으로 라이브 애플리케이션을 테스트할 수 있다고 강조했다.

curl host:port/path?class.module.classLoader.URLs%5B0%5D=0

연구원 플로리안 로스는 시스템에서 스프링4셸을 통해 발생할 수 있는 침해를 확인하는 데 사용하는 YARA 규칙을 게시했다. 이 규칙은 알려진 익스플로잇이 배포하는 악성 JSP(JavaServer Pages) 백도어 파일을 탐지한다.

카네기멜론대학교의 CERT 합동 운영 센터는 취약한 제품이 확인된 벤더와 아직 조사 중인 벤더 목록을 관리한다. SwitHak이라는 이름으로 활동하는 프랑스 연구원도 정보보안 커뮤니티의 도움을 받아 스프링4셸에 대한 벤더 대응 및 공지 목록을 만들어 운영하고 있다.


스프링4셸의 위험을 완화하는 방법

스프링4셸 취약점을 봉쇄하는 최선의 방법은 스프링 프레임워크를 버전 5.3.18 또는 5.2.20으로, 스프링 부트를 버전 2.6.6 또는 2.5.12로 업데이트하는 것이다. 그러나 프레임워크를 당장 업데이트하지 못하는 상황에서 사용할 수 있는 몇 가지 대안이 있다.

예를 들어, 개발자는 일부 클래스로더 내부 필드에 대한 할당을 차단하는 @ControllerAdvice를 애플리케이션에 추가할 수 있다. 그러나 스프링 개발진은 이 방법이 완벽하게 작동하지 않는 상황도 일부 있다며, 더 자세한 가이드라인을 제시했다.

또 다른 임시 대응책은 톰캣 버전을 스프링4셸에 대응해 출시된 10.0.20, 9.0.62 또는 8.5.78로 업그레이드하는 것이다. 현재 돌고 있는 익스플로잇은 톰캣 기능인 AccessLogValve를 사용해 임의의 파일을 덮어쓰고 서버에 백도어를 배포하는데, 톰캣 개발진은 이 공격 벡터를 막기 위해 새로운 버전을 출시했다. 그러나 이 방법으로 현재의 익스플로잇을 차단할 수 있다고 해도 공격자가 대체 공격 벡터를 찾을 수 있으므로 장기적인 해결책으로 간주해서는 안 된다.

'스프링4셸'이라는 이름은 로그4셸(Log4Shell)과 비슷하다. 로그4셸은 수많은 애플리케이션에 사용되는 Log4j 자바 로깅 라이브러리에서 지난해 12월 발견된 치명적인 취약점이다. 그러나 스프링4셸의 경우 악용을 위한 요구사항이 더 까다롭고 이를 충족하는 애플리케이션의 수가 적어 로그4셸만큼 광범위한 영향을 미치지는 않는다. 

그렇다 해도 스프링4셸은 장기적으로 엔터프라이즈 애플리케이션에 상주할 가능성이 있는 심각한 취약점이다. 소나타입 데이터에 따르면, 로그4셸이 공개된 지 3개월이 지났지만 메이븐 센트럴에서 다운로드되는 log4j2 가운데 40%는 여전히 취약한 버전인 것으로 나타났다.
editor@itworld.co.kr
Sponsored

회사명 : 한국IDG | 제호: ITWorld | 주소 : 서울시 중구 세종대로 23, 4층 우)04512
| 등록번호 : 서울 아00743 등록발행일자 : 2009년 01월 19일

발행인 : 박형미 | 편집인 : 박재곤 | 청소년보호책임자 : 한정규
| 사업자 등록번호 : 214-87-22467 Tel : 02-558-6950

Copyright © 2024 International Data Group. All rights reserved.