sistema: OPERATIVO
← volver a todos los hacks
INFRASTRUCTURE MEDIUM NEW

Path traversal en LangChain Core: load_prompt lee archivos arbitrarios

CVE-2026-34070 permite que una configuración de prompt manipulada recorra el sistema de archivos vía load_prompt y exponga secretos .txt/.json/.yaml. Divulgada el 27 de marzo de 2026, corregida en langchain-core 1.2.22.

2026-06-19 // 6 min affects: langchain-core, langchain, llm-orchestration-frameworks

¿Qué es esto?

CVE-2026-34070 es una vulnerabilidad de path traversal (recorrido de directorios) en langchain-core, el paquete base del extendido framework de orquestación de LLM LangChain. Fue divulgada el 27 de marzo de 2026 por investigadores de Cyera dentro de su análisis «LangDrained», y se le asignó el aviso GHSA-qh6h-p6c9-ff54. La falla reside en un conjunto de API heredadas y no documentadas para cargar prompts: load_prompt(), load_prompt_from_config() y el método .save() de las clases de prompt, todas en langchain_core.prompts.loading.

La clasificación es de lo más común — CWE-22, «Limitación incorrecta de una ruta a un directorio restringido» — y ahí está justamente el punto. No es un ataque de IA exótico, sino una vulnerabilidad web clásica, de hace décadas, que reaparece dentro de la fontanería de un framework de IA, donde se alcanza mediante datos de configuración de prompt en lugar de una URL. El NVD la califica con CVSS 3.1 de 7.5 (alta); la evaluación CVSS 4.0 de Snyk la sitúa en 8.7.

Cómo funciona

Las funciones vulnerables leen archivos a partir de rutas incrustadas en diccionarios de configuración deserializados. Cuando una aplicación carga un prompt desde un objeto de configuración, esas funciones resuelven una ruta de archivo y leen su contenido — sin validar la ruta frente a secuencias de recorrido ni inyección de rutas absolutas.

Si una aplicación pasa a load_prompt() o load_prompt_from_config() una configuración de prompt influida por el usuario, un atacante que controle esa configuración puede suministrar una ruta con secuencias ../ (o una ruta absoluta) y leer archivos arbitrarios del sistema anfitrión. La única restricción es una comprobación de extensión: las plantillas se leen como .txt, y los archivos de ejemplo como .json o .yaml. Dentro de esas extensiones, nada impide que una petición salga del directorio de prompts previsto hacia archivos de configuración, exportaciones de entorno o almacenes de secretos que usen una extensión permitida.

# Forma ilustrativa del patrón peligroso — NUNCA cargar configuraciones de prompt no confiables
from langchain_core.prompts import load_prompt

# 'config' está influida por el atacante (subida, recuperada o plantillada)
config = {
    "_type": "prompt",
    "template_path": "../../../../[RUTA_SENSIBLE_REDACTADA].yaml",
}
prompt = load_prompt(config)   # lee el archivo recorrido, limitado solo por la extensión

La precondición de explotación es el matiz esencial: el peligro solo se materializa cuando una aplicación alimenta estos cargadores heredados con configuración no confiable. El impacto es divulgación de información (confidencialidad), no acceso de escritura ni ejecución de código — el vector CVSS registra un impacto alto en confidencialidad y nulo en integridad y disponibilidad.

Por qué importa

Es el tercer elemento de un patrón que Cyera destacó en LangChain y LangGraph: fallos de validación de entrada en la «fontanería fundacional e invisible» que conecta los modelos con los flujos de negocio. Cyera analizó CVE-2026-34070 junto a una falla anterior de deserialización insegura en langchain-core (CVE-2025-68664, calificada 9.3, diciembre de 2025) y una inyección SQL en el checkpointer de LangGraph (CVE-2025-67644, 7.3). Cada una corresponde a una capa distinta y a una clase de datos distinta — archivos locales, secretos en ejecución, estado persistente del agente.

La lección más amplia: los frameworks de orquestación de IA heredan toda la superficie de ataque del software ordinario, más nuevos puntos de entrada. Un path traversal que antes requería un parámetro HTTP malicioso ahora puede llegar a través de una plantilla de prompt recuperada de un repositorio, una configuración de agente provista por el usuario, o un objeto serializado extraído de una base de datos. El mismo tema recorre la SQLi preautenticación de LiteLLM, el path traversal de LangFlow y la falla LLM-API de pgAdmin: errores tradicionales alojados inusualmente cerca de las credenciales y del tráfico de los modelos, en código que no existía hace tres años.

Defensas

La primera medida concreta es actualizar: langchain-core 1.2.22 corrige el problema, con un backport en la rama 0.3.x en 0.3.86. Todas las versiones anteriores están afectadas.

Más allá del parche, la remediación de los mantenedores marca el camino. La familia heredada load_prompt está ahora formalmente obsoleta y prevista para su eliminación; se sustituye por las API de serialización dumpd / dumps / load / loads de langchain_core.load, que no realizan ninguna lectura de archivos y usan un modelo de seguridad basado en lista de permitidos. Migrar fuera de los cargadores heredados elimina por completo la primitiva peligrosa, en lugar de intentar sanearla.

Para los equipos que no puedan migrar de inmediato, traten la configuración de prompt como entrada no confiable. Nunca pasen a load_prompt() o load_prompt_from_config() un diccionario de configuración de origen usuario, red o repositorio sin validación. Impongan una lista de permitidos de directorios de prompts autorizados, resuelvan y canonicalicen toda ruta antes de usarla, y rechacen rutas absolutas y componentes ... Como señala Cyera, la guía aquí es simplemente buenas prácticas de codificación segura aplicadas a las canalizaciones de IA: validar rutas, restringir los límites de directorios, evitar la deserialización insegura, y preferir interfaces parametrizadas y guiadas por lista de permitidos frente a las que interpretan cadenas en bruto influibles por el atacante.

Estado

ElementoValor
CVECVE-2026-34070 (GHSA-qh6h-p6c9-ff54)
Afectadolangchain-core, todas las versiones anteriores a 1.2.22 (0.3.x antes de 0.3.86)
Corregido enlangchain-core 1.2.22 (backport 0.3.86)
DebilidadCWE-22 Path Traversal
SeveridadCVSS 3.1 7.5 (NVD) / CVSS 4.0 8.7 (Snyk)
ImpactoLectura de archivos arbitrarios (.txt/.json/.yaml), solo confidencialidad
Divulgación27 de marzo de 2026 (Cyera «LangDrained»)
EstadoCorregido; API heredadas obsoletas para eliminación

El parche está publicado y las API afectadas eran interfaces heredadas no documentadas, por lo que la exposición práctica se limita a las aplicaciones que aún las invocan sobre configuración no confiable. Auditen su código en busca de llamadas a load_prompt, load_prompt_from_config y .save() de prompt, confirmen su versión de langchain-core, y planifiquen la migración a langchain_core.load.

Sources