Vulnerabilidad SSRF en SitemapLoader de langchain_community

El método SitemapLoader.parse_sitemap, ubicado en langchain_community/document_loaders/sitemap.py, implementa de forma incompleta el control de seguridad restrict_to_same_domain documentado por el proyecto. Dicho control se aplica únicamente a las entradas de URL hoja del sitemap, pero no a los elementos de sitemaps anidados.

Descripción técnica del fallo

El bucle que itera sobre los elementos <url> del sitemap filtra correctamente las ubicaciones que pertenecen a dominios distintos al de origen. Sin embargo, el bucle que procesa los elementos de sitemaps anidados extrae el valor del nodo <loc> hijo y lo pasa directamente a self.scrape_all([loc.text], "xml"), sin realizar ninguna comparación de dominio ni ninguna verificación sobre si la dirección de destino corresponde a rangos privados, de loopback o de enlace local.

Esta llamada alcanza internamente a WebBaseLoader.scrape_all, que ejecuta una petición HTTP GET asíncrona mediante aiohttp. En consecuencia, aunque la aplicación desplegada haya configurado restrict_to_same_domain=True con la intención explícita de confinar las peticiones salientes al dominio de origen, un atacante que controle o pueda influir en el contenido de un sitemap ingerido puede insertar una entrada de sitemap anidado apuntando a una dirección interna de la infraestructura.

Impacto

El servidor realizará la petición a la dirección interna indicada por el atacante. El contenido obtenido en la respuesta es parseado por el loader y queda expuesto en los objetos Document devueltos al llamante. Esto implica que las respuestas internas no solo son solicitadas, sino que son divulgadas activamente al actor que controla el sitemap malicioso.

Los escenarios de impacto incluyen:

  • Acceso a servicios internos no expuestos públicamente, como APIs de metadatos de instancias en entornos cloud (por ejemplo, el endpoint 169.254.169.254 de AWS IMDSv1).
  • Lectura de servicios en loopback (127.0.0.1) que el servidor ejecuta localmente.
  • Enumeración y exfiltración de información de la red interna a través del contenido devuelto en los documentos.
  • Elusión completa del control de seguridad restrict_to_same_domain, que el desarrollador configuró precisamente para evitar este tipo de peticiones no autorizadas.

A quién afecta

Esta vulnerabilidad afecta a cualquier aplicación o pipeline de IA que utilice SitemapLoader del paquete langchain_community para ingerir sitemaps externos o no confiables, especialmente aquellas que hayan activado restrict_to_same_domain=True confiando en que dicho parámetro protege contra peticiones salientes no autorizadas. El riesgo es mayor en despliegues sobre infraestructura cloud donde los servicios de metadatos internos son accesibles desde la instancia.

Por qué importa

La peligrosidad de este fallo reside en que el control de seguridad existe, está documentado y el desarrollador lo activa de forma explícita creyendo estar protegido. La aplicación parcial del control genera una falsa sensación de seguridad. Un atacante con capacidad de influir en el contenido de un sitemap, ya sea comprometiendo la fuente original o mediante un ataque de intermediario, puede explotar esta omisión para pivotar hacia la red interna del servidor que ejecuta el pipeline de IA.