flawopen.com/Teardowns/cve-2026-105751-docling-odf-file-disclosure
CVE-2026-105751: exposición de archivos ODF en Docling
El backend ODF de Docling podía tratar la referencia de una imagen del documento como una ruta local y leerla fuera del archivo. Actualiza a 2.120.3; la corrección usa el componente compartido que controla la carga de recursos.
Vector 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:NUna bibliotecaria busca una imagen dentro de un álbum. Si no está, el lector defectuoso va a un archivador y abre la ruta escrita en la etiqueta del álbum, sin comprobar la regla de la biblioteca que prohíbe obtener archivos locales. La corrección hace que el lector utilice el mismo mostrador de recursos protegido que los demás formatos.
Conceptos Clave y Términos
OpenDocument Format (ODF)- Familia de formatos de oficina que incluye documentos de texto .odt. Docling lee las referencias a imágenes del XML del documento.
draw:image- Elemento XML de ODF que describe una imagen. Su valor xlink:href identifica el recurso.
xlink:href- Referencia de recurso de un elemento de imagen ODF. Es entrada del documento y no debe decidir permisos del sistema de archivos.
ImageResourceLoader- Cargador de imágenes compartido de Docling. Aplica las opciones de carga local y remota, resuelve rutas y comprueba la seguridad de URL remotas.
enable_local_fetch- Opción que controla si los backends compatibles pueden cargar imágenes locales. Un backend que omite el cargador compartido también omite este control.
Mapeos de marcos
- Referencia CWE para la debilidad descrita en esta guía: CWE-22
Análisis de Causa Raíz
En las versiones afectadas de Docling, _image_ref_from_odf_image() primero intentaba localizar el recurso draw:image dentro del archivo ODF. Si la búsqueda no devolvía bytes, el fallback convertía directamente el xlink:href controlado por el documento en Path y llamaba a read_bytes() si la ruta existía. Así se eludía ImageResourceLoader: el procesamiento ODF no aplicaba enable_local_fetch, enable_remote_fetch ni las reglas compartidas de resolución de recursos. El filtro de tipo de imagen también aceptaba una extensión vacía, lo que admitía rutas sin extensión. La lectura puede producirse antes de decodificar la imagen; la divulgación en el documento resultante se demuestra cuando los bytes se pueden decodificar como imagen. El aviso del proveedor documenta la lectura arbitraria de archivos locales y la divulgación de imágenes en los formatos de salida de Docling, y limita esta última al contenido que puede decodificarse como imagen. Este CVE requiere que se convierta un documento proporcionado mediante un proceso con acceso a archivos locales; no demuestra que todas las implementaciones de Docling sean accesibles de forma remota. La corrección envía las referencias externas a ImageResourceLoader.load_image_data(), sin una ruta base local, propaga el cargador por el recorrido ODF y elimina la extensión vacía de las extensiones admitidas. El cargador compartido deniega por defecto la carga local y exige una ruta base confinada si se habilita. La CNA de GitHub asigna CVSS 4.0 6.9 Moderado (UI:A); no lo describas como explotación remota sin autenticación sin un servicio y una ruta de conversión adicionales que sean accesibles.
Flujo de Ataque Paso a Paso
Un documento entra en la ruta de conversión ODF
La entrada relevante es un archivo OpenDocument procesado por Docling 2.107.0 a 2.120.2. El problema está en el backend de imágenes ODF, no en todos los formatos de Docling ni en todas las integraciones HTML/RAG.
La referencia de imagen procede del XML del documento
El elemento ODF draw:image proporciona un xlink:href. Docling primero busca el recurso dentro del archivo.
Una parte ausente del archivo termina en una ruta del host
Si falla la búsqueda interna, el helper vulnerable utilizaba la misma referencia como Path y la leía directamente. El fallback no consultaba la opción compartida de carga local ni confinaba la ruta al archivo.
Docling procesa los bytes como recurso de imagen
La lectura del sistema de archivos ocurre antes de la decodificación. Si el contenido es una imagen compatible, los bytes pueden incorporarse al DoclingDocument y a sus exportaciones HTML, Markdown o JSON.
El cargador corregido restaura el límite de recursos
Docling 2.120.3 envía las referencias ODF externas a ImageResourceLoader, no proporciona una ruta base local y excluye las referencias sin extensión. Mantén desactivada la carga local al convertir documentos no confiables.
Código Fuente: Vulnerable vs. Seguro
Son extractos concretos del código upstream, no un parche independiente. La corrección crea ImageResourceLoader con las opciones enable_local_fetch y enable_remote_fetch del backend, lo pasa al procesamiento ODF y dirige allí las referencias externas. Con base_path=None se rechazan las rutas locales incluso si se habilitó la carga local, porque el cargador no puede establecer un directorio confinado. El cambio también rechaza extensiones de imagen vacías. Actualiza a 2.120.3 o posterior en lugar de copiar solo este extracto.
Fragmento de origen: docling/backend/opendocument_backend.py — extracto concreto del código fuente
# Un recurso que faltaba en el archivo caía en la ruta indicada por el documento.
if image_data is None and image_url:
image_path = Path(image_url)
if image_path.is_file():
image_data = image_path.read_bytes()
# Ruta corregida: usar el cargador compartido con las opciones del 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)
Lista de Verificación de Seguridad para Ingeniería
- ✓Actualiza docling a 2.120.3 o posterior y verifica la versión instalada en ejecución, incluidos los servicios transitivos de procesamiento documental.
- ✓Inventaría los pipelines que aceptan archivos .odt, .ods o .odp no confiables e identifica a qué archivos del sistema puede acceder el proceso de conversión.
- ✓Mantén enable_local_fetch desactivado para documentos no confiables; en versiones vulnerables, esta opción no protege la ruta ODF que omite el cargador compartido.
- ✓Ejecuta la conversión con una identidad sin privilegios, una vista del sistema de archivos mínima y de solo lectura, y sin secretos montados en el proceso.
- ✓Usa ImageResourceLoader en los backends propios en vez de abrir rutas del documento directamente; exige una base confiable antes de permitir recursos locales.
- ✓Añade pruebas de regresión para imágenes del archivo, referencias ausentes o sin extensión, rutas absolutas y configuraciones de carga local desactivada/activada con archivos canario desechables.
- ✓Comprueba que las salidas incluyan solo recursos esperados; que la conversión termine correctamente no demuestra que no se haya abierto otro archivo.
- ✓Si un servicio afectado procesó ODF no confiable, revisa sus registros y artefactos de salida en busca de imágenes inesperadas, limitando el alcance a los archivos legibles por la cuenta del servicio.