공지사항

[JAVA] Spring Framework 취약점 발견 / CVE-2022-22965
작성자 | admin 2022-04-01  |    조회수 : 1870  

발생 버전 / 영향 버전

1) JDK 9 이상에서 Spring Framework를 사용하는 경우

- Spring Framework 5.3.0 ~ 5.3.17, 5.2.0 ~ 5.2.19 및 이전 버전

※ JDK 8 이하를 사용하는 경우 취약점의 영향을 받지 않습니다.

 

발생 배경

Spring 보안 팀에서 Spring Framework 및 Spring Cloud Function 관련 원격 코드 취약점을 발견하였습니다.

 

특정 조건(JDK9↑) 이 만족하는 상황과 환경에서 원격 공격자가 Framework의 매개변수 바인드 기능을 이용하여

AccessLogValve 객체 및 악성 필드 값들을 획득하고 이를 이용하여 PipeLine 매커니즘을 트리거할 수 있습니다.

 

이와 같이 트리거를 진행한 이후 임의 경로 하위에 파일을 쓰는 방식이 가능한 것으로 확인되었습니다.

 

참고 자료

Spring Blog: https://spring.io/blog/2022/03/31/spring-work-rce-early-announcement

ESTSecurity: https://blog.alyac.co.kr/4600?category=750247

KISA: https://www.krcert.or.kr/data/secNoticeView.do?bulletin_writing_sequence=66592

 


이슈 버전 확인 방법

1) JDK 버전 확인

 

$ java -version

 

 

2) Spring Framework 사용 유무 확인

- 프로젝트 내 jar, war 패키지를 zip 확장자로 변경하여 압축 해제 후 대상 디렉토리에서 아래와 같이 명령어 실행

 

$ find . -name spring-beans*.jar

$ find . -name spring*.jar

$ find . -name CachedIntrospectionResuLts.class

 
 
 

 

해결 방안

사용하는 JDK 버전과 Spring Framework 사용 유무를 확인한 뒤 최신 버전으로 업데이트 적용이 필요합니다.

제조사 홈페이지에서 지속 신규 버전이 업데이트 되고 있는 상태로 확인 후 업데이트 적용이 필요합니다.

 

- CVE-2022-22965(Spring4Shell)

· Spring Framework 5.3.18, 5.2.20 버전으로 업데이트

 

- CVE-2022-22963

· Spring Cloud Function 3.1.7, 3.2.3 버전으로 업데이트

 

신규 버전의 프로그램 다운로드 경로

https://repo.maven.apache.org/maven2/org/springwork/cloud/spring-cloud-function-context/

 

임시 조치 방안 (업데이트가 불가한 경우) - CVE-2022-22965

프로젝트 패키지 아래 해당 전역 클래스를 생성한 뒤 재컴파일을 진행 후 적용합니다.

** 재컴파일을 진행한 이후에는 프로그램이 정상적으로 동작하는지 별도 테스트가 필요합니다.

 

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);

}

}

 
 

감사합니다.