FlawOpen

flawopen.com/Teardowns/cve-2026-105751-docling-odf-file-disclosure

● CVE-2026-105751 · CVSS v4 6.9 · Средний
Исследования · FlawOpen

CVE-2026-105751: раскрытие файлов через ODF в Docling

ODF-модуль Docling мог трактовать ссылку на изображение из документа как локальный путь и читать файл вне архива. Обновитесь до версии 2.120.3: исправление использует общий компонент контроля загрузки ресурсов.

Вектор CVSSCVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:H/VI:N/VA:N/SC:L/SI:N/SA:N
💡 Простыми словами (ELI5)

Библиотекарь ищет фотографию в альбоме. Если её там нет, уязвимый обработчик открывает картотеку по пути, указанному на ярлыке альбома, не проверяя правило библиотеки о запрете локальной загрузки. Исправление направляет обработку через ту же защищённую стойку ресурсов, что и другие форматы документов.

Ключевые понятия и термины

OpenDocument Format (ODF)
Семейство офисных форматов, включающее текстовые документы .odt. Docling читает ссылки на изображения из XML документа.
draw:image
Элемент XML ODF, описывающий изображение. Значение xlink:href указывает на ресурс.
xlink:href
Ссылка на ресурс в элементе изображения ODF. Это входные данные документа, а не решение о правах доступа к файловой системе.
ImageResourceLoader
Общий загрузчик изображений Docling. Он применяет настройки локальной и удалённой загрузки, правила путей и проверки безопасности удалённых URL.
enable_local_fetch
Параметр, разрешающий поддерживаемым модулям загружать локальные изображения. Обход общего загрузчика обходит и эту проверку.

Связи со стандартами

  • Ссылка CWE для слабого места, описанного в этом руководстве: CWE-22

Анализ первопричины

В уязвимых версиях Docling функция _image_ref_from_odf_image() сначала искала ресурс draw:image внутри архива ODF. Если поиск не возвращал данные, резервный путь напрямую преобразовывал заданный документом xlink:href в Path и вызывал read_bytes(), если файл существовал. Так обходился общий ImageResourceLoader: обработка ODF не применяла enable_local_fetch, enable_remote_fetch и общие правила разрешения ресурсов. Фильтр типа изображения также принимал пустое расширение, пропуская пути без расширения. Чтение файла может произойти до декодирования изображения; раскрытие в итоговом документе подтверждено, когда данные можно декодировать как изображение. В уведомлении поставщика описано произвольное чтение локальных файлов и раскрытие изображений в форматах вывода Docling; последнее ограничено данными, декодируемыми как изображение. CVE относится к переданному документу, который обрабатывает процесс с доступом к локальным файлам; оно не доказывает, что каждая установка Docling доступна из сети. Исправление передаёт внешние ссылки в ImageResourceLoader.load_image_data() без локального базового пути, передаёт загрузчик по цепочке ODF и исключает пустое расширение из списка разрешённых. Общий загрузчик по умолчанию запрещает локальную загрузку и при её включении требует ограниченный базовый каталог. CNA GitHub оценивает проблему в CVSS 4.0 6.9 (Medium, UI:A); не называйте её неаутентифицированной удалённой эксплуатацией без дополнительного доступного сервиса и пути конвертации.

Пошаговый сценарий атаки

Шаг 1

Документ попадает в путь конвертации ODF

Речь идёт об OpenDocument-файле, который обрабатывает Docling 2.107.0–2.120.2. Проблема находится в ODF-модуле изображений, а не во всех форматах Docling или интеграциях HTML/RAG.

Шаг 2

Ссылка на изображение поступает из XML документа

Элемент ODF draw:image задаёт xlink:href. Сначала Docling ищет ресурс внутри архива.

Шаг 3

Отсутствующая часть архива превращается в путь на хосте

Если поиск внутри архива неудачен, уязвимый helper использовал ту же ссылку как Path и читал файл напрямую. Резервный путь не проверял параметр локальной загрузки и не ограничивал путь архивом.

Шаг 4

Docling обрабатывает данные как изображение

Чтение файловой системы выполняется до декодирования. Если содержимое является поддерживаемым изображением, его байты могут попасть в DoclingDocument и экспорт HTML, Markdown или JSON.

Шаг 5

Исправленный загрузчик восстанавливает границу ресурсов

Docling 2.120.3 направляет внешние ссылки ODF через ImageResourceLoader, не передаёт локальный базовый путь и исключает ссылки без расширения. Оставляйте локальную загрузку выключенной при обработке недоверенных документов.

Исходный код: Уязвимый vs Защищённый вариант

Это целевые фрагменты upstream-кода, а не самостоятельный патч. Исправление создаёт ImageResourceLoader с параметрами enable_local_fetch и enable_remote_fetch backend, передаёт его в обработку ODF и направляет внешние ссылки через него. При base_path=None локальные пути отклоняются даже при явно включённой локальной загрузке, так как загрузчик не может определить ограниченный каталог. Патч также отклоняет пустые расширения изображений. Обновитесь до 2.120.3 или новее, а не копируйте только этот фрагмент.

Фрагмент исходного кода: docling/backend/opendocument_backend.py — фрагмент исходного кода

УЯЗВИМАЯ РЕАЛИЗАЦИЯ
# Если ресурса нет в архиве, использовался путь, указанный документом.
if image_data is None and image_url:
    image_path = Path(image_url)
    if image_path.is_file():
        image_data = image_path.read_bytes()
БЕЗОПАСНЫЙ ИСПРАВЛЕННЫЙ ВАРИАНТ
# Исправленный путь: общий загрузчик с настройками backend.
if image_data is None and image_url and image_loader is not None:
    image_data = image_loader.load_image_data(image_url, base_path=None)

Чек-лист по защите системы для инженеров

Источники