FlawOpen

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

● CVE-2026-105751 · CVSS v4 6.9 · Media
Investigación · FlawOpen

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 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
💡 Explicación en Lenguaje Sencillo (ELI5)

Una 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

Paso 1

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.

Paso 2

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.

Paso 3

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.

Paso 4

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.

Paso 5

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

IMPLEMENTACIÓN VULNERABLE
# 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()
PARCHE SEGURO Y ROBUSTO
# 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

Fuentes