flawopen.com/Teardowns/cve-2026-105750-docling-html-render-local-file-disclosure
CVE-2026-105750: Docling HTML 렌더링 로컬 파일 노출
2.118.1 이전 Docling은 Python 코드가 Playwright를 설치한 상태에서 render_page=True로 filesystem Path의 신뢰할 수 없는 HTML을 렌더링할 경우 로컬 텍스트 파일을 노출할 수 있습니다. 브라우저 경로에서 enable_local_fetch를 강제하지 않았고 문서 디렉터리로 접근을 제한하지 않았습니다. 2.118.1 이상으로 업그레이드하세요.
문서 변환기를 브라우저에서 열린 페이지를 촬영하는 직원이라고 생각해 보세요. 설정은 “로컬 파일을 가져오지 말라”고 했지만, 렌더링 경로 하나가 해당 요청을 그대로 통과시켰습니다. 제출된 페이지가 변환 프로세스에서 읽을 수 있는 파일을 브라우저에 표시하게 하면 그 텍스트가 반환된 문서 이미지에 들어갈 수 있습니다. 수정 사항은 설정을 확인하고 허용된 로컬 파일을 원본 문서 디렉터리 안으로 제한합니다.
핵심 개념 및 용어
Docling HTML backend- HTML을 처리하고 시각적 레이아웃 캡처를 위해 페이지를 헤드리스 브라우저에서 렌더링할 수 있는 Docling 구성요소입니다.
HTMLBackendOptions(render_page=True)- 브라우저 렌더링 경로를 활성화하는 Python API 옵션이며 기본값은 비활성화입니다.
enable_local_fetch- 로컬 파일을 문서 리소스로 가져올 수 있는지 제어하는 정책 옵션입니다. 각 backend는 모든 리소스 요청에서 이를 강제해야 합니다.
Playwright- Docling HTML 페이지 렌더링에 사용되는 선택적 브라우저 자동화 종속성입니다.
Path input- 파일 시스템 경로로 전달되는 입력 파일입니다. stream 입력과 달리 브라우저 렌더링 경로에 file URL origin을 제공합니다.
CWE-863- Incorrect Authorization: 렌더링 모드 요청 필터가 설정된 로컬 파일 접근 정책을 강제하지 못했습니다.
프레임워크 매핑
- 이 가이드에서 설명하는 약점의 CWE 참조: CWE-863
근본 원인 분석 (Root Cause)
영향받는 렌더링 버전에서 HTMLDocumentBackend._get_browser_request_block_reason()은 enable_local_fetch를 확인하거나 해석된 경로를 원본 문서 디렉터리로 제한하기 전에 file: URL을 허용했습니다. Docling 2.82.0–2.90.x는 렌더링 모드에서 요청 필터링 자체가 없었다고 권고문은 설명합니다. 취약 경계는 브라우저 리소스 요청 정책이며 일반적인 HTML 파싱이나 모든 Docling 배포가 아닙니다. GitHub 권고는 원인에 CWE-863을, 노출 영향에 CWE-552도 기재합니다. 이 문서는 원인 분류의 기본값으로 CWE-863을 사용합니다.
단계별 공격 실행 흐름
애플리케이션이 선택적 HTML 렌더링을 활성화합니다
영향받는 배포는 Python API에서 HTMLBackendOptions(render_page=True)를 사용하고 Playwright가 설치되어 있습니다. 기본 설정, Docling CLI, docling-serve는 권고문상 영향받는 구성에 포함되지 않습니다.
애플리케이션이 HTML을 filesystem Path로 전달합니다
권고문은 Path로 전달된 신뢰할 수 없는 HTML을 영향 범위로 제한합니다. stream 입력은 page.set_content()와 opaque origin을 사용하므로 이 file 하위 리소스 경로의 영향을 받지 않습니다.
헤드리스 브라우저가 로컬 리소스를 요청합니다
HTML은 렌더링 중 하위 리소스 요청을 유발할 수 있습니다. 영향받는 callback은 로컬 접근 허가를 적용하지 않은 채 file: 요청을 허용했고, 옵션이 켜진 경우에도 비렌더 경로와 달리 원본 디렉터리로 제한하지 않았습니다.
읽을 수 있는 텍스트가 렌더링 이미지에 나타날 수 있습니다
공개된 영향은 로컬 파일이 브라우저 표시 영역에 보여주는 텍스트로 제한됩니다. Docling 2.91.0부터 브라우저에서 JavaScript가 비활성화됩니다. 이를 임의 코드 실행이나 보이지 않는 바이트 읽기로 확대 해석하지 마세요.
수정된 필터가 두 검사를 복구합니다
Docling 2.118.1은 원본 문서 자체의 로드를 허용하고, enable_local_fetch가 활성화되지 않으면 다른 file 요청을 차단하며, 허용된 로컬 하위 리소스를 문서 디렉터리 안으로 제한합니다.
소스 코드 비교: 취약한 구현 vs 보안 패치
취약한 발췌문은 유지관리자 권고문에 설명된 file: 무조건 허용 규칙을 보여주며 전체 소스 파일은 아닙니다. 수정 발췌문은 upstream commit 1612b88을 따릅니다. 원본 HTML을 허용하고, 다른 로컬 파일에는 enable_local_fetch를 요구하며, 요청 경로를 해석해 문서 디렉터리 안으로 제한합니다. 이 발췌문을 복사하지 말고 2.118.1 이상으로 업그레이드하세요. data:, about:, blob:의 별도 처리는 로컬 파일 규칙의 범위가 아닙니다.
소스 코드 발췌: docling/backend/html_backend.py — 요청 및 렌더링 정책의 주요 발췌
# 영향받는 렌더링 경로: 로컬 가져오기 정책을 확인하기 전에 file:를 허용 목록에 넣었습니다.
if scheme in {"file", "data", "about", "blob"}:
return None
def _is_allowed_browser_file_request(self, request_url: str) -> bool:
local_base_path = self._get_browser_local_base_path()
if local_base_path is not None and request_url == local_base_path.as_uri():
return True # The source document itself must remain loadable.
if not self.options.enable_local_fetch or local_base_path is None:
return False
requested_path = Path(url2pathname(urlparse(request_url).path)).resolve()
return requested_path.is_relative_to(local_base_path.parent)
# _get_browser_request_block_reason()에서:
if scheme == "file":
if self._is_allowed_browser_file_request(request_url):
return None
# 그렇지 않으면 요청이 차단된 이유를 반환합니다.
엔지니어링 및 시스템 보안 강화 체크리스트
- ✓
docling과docling-slim을 2.118.1 이상으로 업그레이드하고 개발 환경이 아니라 실행 중인 Python 서비스가 사용하는 패키지를 확인하세요. - ✓
HTMLBackendOptions(render_page=True)를 사용하는 Python 통합을 찾아 Playwright 설치 여부를 확인하세요. 권고문에 따르면 CLI, docling-serve, 기본 렌더링, stream 입력은 영향을 받지 않습니다. - ✓업그레이드 전까지 신뢰할 수 없는 HTML을
render_page=True로 렌더링하지 마세요. 호환되는 경우 filesystemPath대신 stream으로 문서를 전달하세요. - ✓변환 작업을 최소 권한 계정과 최소 파일 시스템 접근으로 실행하고 신뢰할 수 없는 문서를 처리하는 프로세스에 애플리케이션 비밀을 마운트하지 마세요.
- ✓신뢰할 수 없는 입력에는
enable_local_fetch를 비활성화하고 수정 callback이 허용된 file 리소스를 원본 디렉터리 안으로 제한하는지 확인하세요. - ✓원본 문서, 로컬 fetch 비활성화 시 외부 로컬 파일, 활성화 시 디렉터리 내부 파일에 대한 regression test를 추가하고 예상대로 차단 또는 허용되는지 확인하세요.
- ✓이 문제는 CVE-2026-105751과 별도로 다루세요. 후자는 Docling OpenDocument Format backend 문제이며 2.120.3에서 별도 수정됐습니다. 참고자료의 관련 문서를 보세요.
- ✓영향받는 서비스가 신뢰할 수 없는 HTML을 처리했다면 렌더링 화면에 표시될 수 있었던 텍스트를 평가하고 조직의 비밀정보 노출 대응 절차를 따르세요.