본문 바로가기
Security

Spring4Shell - Spring RCE 취약점 및 조치 방안 정리

by 올엠 2022. 4. 1.
반응형

https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement

 

Spring Framework RCE, Early Announcement

<p><strong>Updates</strong> </p> <ul> <li><strong>[15:40 BST]</strong> <a href="https://spring.io/blog/2022/03/31/spring-boot-2-6-6-available-now">Spring Boot 2.6.6</a> is available.</li> <li><strong>[14:38 BST]</strong> <a href="https://spring.io/blog/202

spring.io

최근 Spring 관련 RCE 취약점이 나오면서 많은 보안 업체들이 정보를 확인하고 있다.

공부하는 차원으로 글을 작성해본다.

 

Spring Framework 란

Spring Framework는 Java 웹 개발에 사용되는 유명한 프레임워크이다. 대표적으로 MVC 모델이 있고, 국내 대부분의 자바 웹 프레임워크로 사용중으로 정부에서 권장하는 Spring 기반 프레임워크가 별도로 있을 정도이니 세계적으로 많은 개발자들이 사용하는 Java 웹 표준 프레임워크라고 할 수 있다.

https://www.egovframe.go.kr/home/sub.do?menuNo=12

 

구성 - 버전별 구성 | 표준프레임워크 포털 eGovFrame

처리중입니다. 잠시만 기다려주십시오.

www.egovframe.go.kr

 

CVE-2022-22965 취약점은

CVE-2022-22965 취약점은 JDK 9+에서 실행되는 스프링 MVC 또는 스프링 WebFlux 애플리케이션은 데이터 바인딩을 통해 원격으로 코드 실행이 가능한 취약점이다. 취약점이 동작하기 위해서는 Tomcat이 WAR 패키지로 배포된 경우에 발생한다고 한다. 만약 기본 Spring Boot를 활용하여 배포를 한 경우에는 취약점이 발생하지 않는다고 하지만, 되도록 조치를 하기를 권장한다. 공격 방식은 DataBinding 부분을 공격하는 방식으로 확인이 되었다. 

 

https://gist.github.com/esell/c9731a7e2c5404af7716a6810dc33e1a

Spring4Shell 0-day POC 코드는 아래 사이트에서 확인 가능하다.

— vx-underground (@vxunderground) March 30, 2022

 

POC 재현과 관련된 글은 아래 내용을 참고하면 도움이 될 것이다.

CVE-2022-22965 (SpringShell): RCE Vulnerability Analysis and Mitigations (paloaltonetworks.com)

 

취약한 버전

  • JDK 9 or higher
  • Apache Tomcat as the Servlet container.
  • Packaged as a traditional WAR (in contrast to a Spring Boot executable jar).
  • spring-webmvc or spring-webflux dependency.
  • Spring Framework versions 5.3.0 to 5.3.17, 5.2.0 to 5.2.19, and older versions.

 

조치방안

Spring Framework 5.3.18 ~ 5.2.20 은 문제가 없는것으로 확인되었다. 문제가 없는 버전으로, 업그레이드하는 것을 권장한다.

추가로 임시적으로 현재 알려진 조치방법으로는 DataBinder에는 특정 패턴을 허용하지 않는 기능이 있는데 이를 통해

Class 접근을 허용하지 않도록 구성하는것으로 임시적인 조치가 가능하다.

import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.InitBinder;


@ControllerAdvice
@Order(10000)

public class BinderControllerAdvice {
    @InitBinder
    public void setAllowedFields(WebDataBinder dataBinder) {
         String[] denylist = new String[]{"class.*", "Class.*", "*.class.*", "*.Class.*"};
         dataBinder.setDisallowedFields(denylist);
    }
}

 

 

 

참고

Spring Framework RCE, Early Announcement

반응형