( 1 ) 취약점 정의
Tomcat 서버에서 세선 관리자 PersistentManager 클래스가 Filestore 를 사용하도록 설정된 경우 세션 저장 위치에 대한 입력값 검증을 제대로 이루어지지 않아 원격코드 실행이 가능한 취약점임.
2020년 04월 12일 jard threedr3am 님의 pdd 보안 연구 중 발견하였으며 Apache Tomcat 보안 팀에 보고함. 그리고 패치와 더불어 05월 20일에 공개됨.
영향받는 Tomcat 제품 버전
Apache Tomcat 10.x < 10.0.0-M5
Apache Tomcat 9.x < 9.0.35
Apache Tomcat 8.x < 8.5.55
Apache Tomcat 7.x < 7.0.104
( 2 ) 취약점 분석
세션 객체의 정보는 일반적으로 서버의 메모리에 저장되지만 장애 등으로 인해 서버가 다시 시작되거나 어플리케이션이 다시 로드될 경우 세션 객체의 정보는 손실됨.
위와 같이 위험한 상황을 피하기 위해 세션 객체의 정보를 파일 시스템이나 데이터베이스에 저장할 수 있으며 이러한 작업을 세션 개체 지속성이라고 함.
세션 객체를 유지시키기 위해 데이터를 저장할 경우 직렬화된 형태로 저장되므로 일반적으로 직렬화 가능 인터페이스(java.io.Serializable)를 구현해야 함.
세션 지속성을 완료하려면 세션에 저장된 오브젝트가 java.io.Serializable 인터테이스를 구현해야 하며 세션 관리자(Session Manager)가 세션 지속성을 관리함.
< 관리자 관련 클래스 다이어그램 >
Tomcat 서버에서는 세션 관리자에 대한 클래스를 두 가지로 구현해서 제공함.
각각 StandardManager 와 PersistentManager 이며 세션 객체를 저장하는 방식이 다름.
StandarManager
1. Tomcat이 실행되면 세션이 메모리에 저장됨.
2. Tomcat이 정상적으로 종료되면 세션이 디스크에 기록되고 Tomcat이 다시 시작된 후 로드됨.
PersistentManager
1. 항상 세션을 디스크에 저장함.
< FileStore.java 코드 비교 >
위 화면은 PersistentManager 와 관련된 각각 취약한 9.0.34 버전과 패치된 9.0.35 버전 화면임.
(각각의 버전 org.apache.catalina.session.FileStore.java 파일 비교)
오른쪽 패치된 화면을 보면 세션 ID 값에 대한 디렉토리 검증 코드가 삽입됨.
org.apache.catalina.session.FileStore.java 파일에서 Session load(String id) 에서 인수 ID 값에 포함된 디렉토리 지정 문자 "../" 를 제외하지 않고 검증하는 것이 원인임.
그리고 "세션 ID.seession" 파일명으로 저장되어 있는 상태이고 개체의 제한을 받지 않는 상태로 설정되어 있어 요청된 파일을 로드할 경우 직렬화된 코드가 실행하게 됨.
아래와 같이 특정 조건이 모두 성립되어야 취약점이 발생함.
1. Tomcat 서버의 PersistenceManager가 Filestore를 사용하도록 설정된 경우
2. PersistenceManager의 sessionAttributeValueClassNameFilter 항목이 "null"로 설정되거나 공격자가 제공한 객체의 검증이 미흡한 경우
3. 공격자가 Tomcat 서버의 컨텐츠와 파일의 이름을 설정할 수 있는 경우
4. 공격자가 FileStore에서 사용되는 저장 위치와 제어할 수 있는 파일의 상대 경로를 알고 있는 경우
( 3 ) 공격 탐지 방법
< PoC 코드 관련 스크린샷 >
현재 공개된 PoC 코드를 확인한 결과, ysoserial 를 사용하여 역직렬화 파일을 생성한 후 JSESSION 을 통한 악성 세션 파일을 로드시킴.
악성 세션 파일을 로드시켰을 시 Cookie 필드의 JSESSIONID 값에 Directory Traversal 공격 기법을 이용한 패턴을 탐지함.
alert tcp any any -> any any (msg:"KOROMOON_CVE-2020-9484_PoC"; flow:to_server,established; content:"Cookie|3a 20|JSESSIONID="; content:"../../";)
( 4 ) 취약점 방어
최신 버전으로 업데이트함.
Apache Tomcat 10.x -> 10.0.0-M5 업데이트
Apache Tomcat 9.x -> 9.0.35 업데이트
Apache Tomcat 8.x -> 8.5.55 업데이트
Apache Tomcat 7.x -> 7.0.104 업데이트
참고 사이트 :
============================================================
본 게시물은 KOROMOON 님께서 작성하였으며 CCL (Creative Commons License) 에서 "저작자표시-비영리-동일조건변경허락" 이용조건으로 자료를 이용하셔야 합니다.
혹시 네이버 블로그에 있는 Revenge-RAT 비밀번호 알수 있을까요?
답글삭제