본문 바로가기

보안/취약점

[CVE-2022-22965] Spring4Shell 취약점

728x90

 

 이 취약점이 발생하는 주요 원인은 spring framework에 data binding 기능에 있다. 이 취약점을 통해 공격자는 애플리케이션의 컨텍스트에서 권한 없는 원격 코드를 실행 할 수 있다.

 또한 특정 상황에서 class라는 특수한 변수가 사용자에게 노출되어 classloader에 접근할 수 있을때 발생하게 된다. 

 

💥 취약점 발생 절차

① 취약한 애플리케이션 설정

  • 취약한 Spring 애플리케이션이 JDK 9이상에서 실행중
  • Spring MVC 또는 Spring WebFlux 애플리케이션이 있으며 Data Binding 기능을 사용중

② 악의적 입력 전달

  • 공격자는 HTTP 요청을 통해 특정 매개변수를 조작하여 애플리케이션에 전달한다. 'class.module.classloader'와 같은 필드를 포함하는 요청을 보낸다
  • 이러한 요청은 주로 POST 요청으로 이루어지며 Content-Type 헤더가 application/x-www-form-urlencoded 또는 multipart/form-data로 설정된다.

③ Data Binding 과정에서 객체 주입

  • Spring 애플리케이션의 Data Binding 기능이 요청의 매개변수를 객체의 필드에 바인딩하는 과정에서 class.module. classloader 필드를 처리한다
  • 이 필드가 처리되면 공격자가 조작한 값이 클래스 로더 객체로 설정될 수 있다.

④ ClassLoader 조작

  • 조작된 Classloader를 통해 공격자가 원격에서 클래스 파일을 조작하고 실행할 수 있게 된다.
  • 이는 결국 악성코드가 애플리케이션 내에서 실행될 수 있는 원격코드 실행 취약점으로 이어진다. 

 

 

💥 취약점 주요 원인

1. Data Binding

Data Binding (사용자 인터페이스 요소와 데이터 소스간의 연결을 설정하는 과정이다. 이를 통해 UI 요소가 데이터 소스의 값을 자동으로 반영하거나 업데이트 될 수 있다.) 기능이 충분히 검증되지 않은 객체를 바인딩하는 과정에서 공격자가 임의의 객체를 주입할 수 있는 취약점이 있다.

2. ClassLoader 매개변수 조작

 공격자가 Data Binding 기능을 통해 특정 매개 변수 (class.module.classLoader)를 조작하면 Spring 애플리케이션의 클래스 로더를 변경하여 악의적인 코드를 실행 할 수 있다.

 

📌 취약점 완화 방법

  • Spring Framework 업데이트
  • 매개변수 필터링: Data Binding 과정에서 클래스 로더와 같은 민감한 필드에 대한 매개변수 바인딩을 금지해야 한다. 이를 위해 커스텀 바인딩을 구현하거나 화이트리스트 방식을 사용하여 허용된 매개변수만 수락하도록 설정해야 한다.
  • JDK 버전 업데이트
  • WAF 설정: WAF를 사용하여 의심스러운 요청을 필터링하고 차단할 수 있다. 'class.module.classloader'와 같은 매개변수를 포함한 요청을 차단하도록 설정할 수 있다.