공지사항

[JAVA] Spring Framework 취약점 발견 / CVE-2022-22965

작성자 :
welldy
작성일 :
2022-04-05
조회 :
414

발생 버전 / 영향 버전


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

}

}

감사합니다.