끝나지 않은 RCE 취약점, 이번 타켓은 Spring Framework
안녕하세요, 정보보호 전문 업체 보안클라우드입니다. Java 개발자들이 주로 사용하는 프레임워크는 스프링 프레임워크(Spring Framework)인데요, 최근 이 스프링 프레임워크에 원격 코드 실행이 가능한 치명적인 취약점이 발견되었습니다. Java 개발자들이 주로 사용하는 스프링 프레임워크에 발견된 치명적인 취약점이 무엇인지 알아보겠습니다.
Spring Framework / Spring Boot
Spring4Shell에 대해 설명하기 앞서 스프링 프레임워크(Spring Framework)와 스프링 부트(Spring Boot)가 무엇인지 살펴보겠습니다. 스프링 프레임워크는 Java 웹 개발에 사용되는 유명한 프레임워크로 대표적으로 MVC 모델이 있고, 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하고 있습니다. 국내 대부분의 자바 웹 프레임워크로 사용 중으로 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준프레임워크의 기반 기술로서 쓰이고 있습니다. 반면에 기능이 많은 만큼 환경설정이 복잡한 스프링 프레임워크에 대해 어려움을 느끼는 사용자들을 위해 나온 것이 바로 스프링 부트입니다. 스프링 부트는 스프링 프레임워크의 설정 많은 부분을 자동화하여 사용자가 정말 편하게 스프링 프레임워크를 사용할 수 있게 하는 프레임워크입니다.
Spring4Shell
현재 "Spring4Shell"로 명명된 CVE-2022-22965 취약점은 Spring Core 프레임워크에서 특정 조건 하에 원격 코드 실행 (RCE: Remote Code Execution)이 가능한 취약점이며 스프링 프레임워크가 매개변수를 바인딩 하는 과정에서 'class' 객체가 노출되어 발생합니다. 공격자는 해당 'class' 객체에서 로깅 관련 기능을 사용해 웹 쉘 코드를 업로드하여 명령어를 실행할 수 있습니다. 다만 이러한 취약점 공격이 이루어지기 위해서는 2가지 전제조건이 필요하며 전제조건은 다음과 같습니다. 웹 서버가 아파치 톰캣(Tomcat) 웹 서버에서 실행되어야 하며 WAR(Web application ARchive) 패키지로 배포되어야 합니다. 즉 Spring Boot에서 실행 가능한 JAR(Executable Jar)를 활용하여 배포를 한 경우에는 취약하지 않다고 하고 있습니다. 또한 애플리케이션이 Spri4Shell 취약점에 노출되려면 개발자가 HTTP 요청 매개변수를 자바 객체에 바인딩 할 수 있게 해주는 스프링 프레임워크의 데이터 바인딩 메커니즘을 사용해야 한다는 조건도 있습니다. 모든 애플리케이션이 이 기능을 사용하는 것은 아니지만, 스프링 웹사이트에 게시된 양식 제출 처리를 위한 기본 자습서 가운데 하나가 취약하며 개발자가 해당 참조 코드를 사용했다면 취약점이 유입되었을 수 있습니다. 이 외에 악용하는 다른 방법이 있을 수 있으며 21년 12월에 발생한 "Log4Shell"에 비해 취약점 공격 조건이 까다롭지만 취약점 공격 방법이 매우 쉬우므로 패치를 권장 드립니다.
Java Spring 프레임워크 보안 업데이트 권고
출처 : KISA 한국인터넷진흥원(https://www.krcert.or.kr/data/secNoticeView.do?bulletin_writing_sequence=66592)
CVE | 취약한 버전 |
CVE-2022-22965 (Spring4Shell) | JDK 9 이상의 Spring 프레임워크 사용하는 경우 Spring Framework 5.3.0 ~ 5.3.17, 5.2.0 ~ 5.2.19 및 이전 버전 ※ JDK 8 이하의 경우 취약점의 영향을 받지 않음 |
JDK 버전 확인 | - “java -version” 명령 입력 |
Spring 프레임워크 사용 유무 확인
- 프로젝트가 jar, war 패키지로 돼 있는 경우 zip 확장자로 변경하여 압축풀기
이후 아래와 같이 “spring-beans-.jar”, “spring.jar”, “CachedIntrospectionResuLts.class” 로 검색
find . -name spring-beans*.jar |
해결방안
Spring Framework 5.3.18 및 5.2.20 이상 업데이트
신규 업데이트가 불가능할 경우 아래와 같이 조치 적용
· 프로젝트 패키지 아래 해당 전역 클래스 생성 후 재컴파일(테스트 필요)
DataBinder에는 특정 패턴을 허용하지 않는 기능이 있는데 이를 통해 Class 접근을 허용하지 않도록 구성하여 임시적인 조치 가능
import org.springwork.core.Ordered; import org.springwork.core.annotation.Order; import org.springwork.web.bind.WebDataBinder; import org.springwork.web.bind.annotation.ControllerAdvice; import org.springwork.web.bind.annotation.InitBinder; @ControllerAdvice @Order(10000) public class BinderControllerAdvice { @InitBinder public setAllowedFields(WebDataBinder dataBinder) { String[] denylist = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"}; dataBinder.setDisallowedFields(denylist); } } |
※그 외 다른 해결방안
Tomcat 업데이트
- Apache Tomcat 10.0.20, 9.0.62, 8.5.78로 업데이트하면 보호 기능을 제공하지만 스프링 프레임워크 버전 업데이트를 하는 것을 권장
Java 8 다운그레이드
- 스프링 프레임워크를 업그레이드하거나 아파치 톰캣을 업데이트 할 수 없는 경우 Java 8로 다운그레이드
Java 개발 시 자주 사용되는 프레임워크인 스프링 프레임워크에 RCE 취약점이 발견되어 Spring4Shell은 취약점 공격 조건이 까다로워 Log4Shell 보다 쉬쉬해 하고 있지만 CVSS 점수 9.8로 여전히 위험한 취약점입니다. 스프링 프레임워크로 개발한 웹 및 SW의 개발 환경 버전을 체크하여 Spring4Shell 취약점에 해당하는 버전인지, 아닌지 다시 한번 체크하셔서 안전한 시스템 구축을 바라며, 오늘은 이만 Spring4Shell 취약점에 대한 내용을 마치며 다음에 다른 주제로 찾아뵙겠습니다.