flawopen.com/Teardowns/cve-2026-105751-docling-odf-file-disclosure
CVE-2026-105751: раскрытие файлов через ODF в Docling
ODF-модуль Docling мог трактовать ссылку на изображение из документа как локальный путь и читать файл вне архива. Обновитесь до версии 2.120.3: исправление использует общий компонент контроля загрузки ресурсов.
Вектор CVSS
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:H/VI:N/VA:N/SC:L/SI:N/SA:NБиблиотекарь ищет фотографию в альбоме. Если её там нет, уязвимый обработчик открывает картотеку по пути, указанному на ярлыке альбома, не проверяя правило библиотеки о запрете локальной загрузки. Исправление направляет обработку через ту же защищённую стойку ресурсов, что и другие форматы документов.
Ключевые понятия и термины
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); не называйте её неаутентифицированной удалённой эксплуатацией без дополнительного доступного сервиса и пути конвертации.
Пошаговый сценарий атаки
Документ попадает в путь конвертации ODF
Речь идёт об OpenDocument-файле, который обрабатывает Docling 2.107.0–2.120.2. Проблема находится в ODF-модуле изображений, а не во всех форматах Docling или интеграциях HTML/RAG.
Ссылка на изображение поступает из XML документа
Элемент ODF draw:image задаёт xlink:href. Сначала Docling ищет ресурс внутри архива.
Отсутствующая часть архива превращается в путь на хосте
Если поиск внутри архива неудачен, уязвимый helper использовал ту же ссылку как Path и читал файл напрямую. Резервный путь не проверял параметр локальной загрузки и не ограничивал путь архивом.
Docling обрабатывает данные как изображение
Чтение файловой системы выполняется до декодирования. Если содержимое является поддерживаемым изображением, его байты могут попасть в DoclingDocument и экспорт HTML, Markdown или JSON.
Исправленный загрузчик восстанавливает границу ресурсов
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)
Чек-лист по защите системы для инженеров
- ✓Обновите docling до 2.120.3 или новее и проверьте версию реально запущенного пакета, включая транзитивные сервисы обработки документов.
- ✓Составьте перечень конвейеров, принимающих недоверенные .odt, .ods или .odp, и определите, какие файлы ОС доступны процессу конвертации для чтения.
- ✓Оставляйте enable_local_fetch выключенным для недоверенных документов; в уязвимых версиях эта настройка не защищает ODF-путь, обходящий общий загрузчик.
- ✓Запускайте конвертацию от непривилегированной учётной записи с минимальным доступом к файловой системе только для чтения и без смонтированных секретов.
- ✓В собственных backend используйте общий ImageResourceLoader вместо прямого открытия путей из документа; для локальных ресурсов требуйте доверенный базовый каталог.
- ✓Добавьте регрессионные тесты для изображений внутри архива, отсутствующих ссылок, ссылок без расширения, абсолютных путей и выключенной/включённой локальной загрузки с временными canary-файлами.
- ✓Проверяйте, что результаты содержат только ожидаемые ресурсы документа; успешная конвертация не доказывает, что другие файлы не открывались.
- ✓Если затронутый сервис обрабатывал недоверенные ODF-файлы, проверьте журналы и результаты на неожиданные данные изображений, учитывая только файлы, доступные учётной записи сервиса.