Resumen
El componente JsonPlusSerializer de LangGraph puede reconstruir objetos Python a partir de payloads JSON almacenados en el repositorio de checkpoints. Bajo condiciones en las que alguien pudiera modificar los bytes del checkpoint en reposo dentro del almacén de respaldo, la ruta de deserialización podría reconstruir objetos más allá de lo que la aplicación espera, lo que a su vez podría resultar en ejecución de código en el momento de carga del checkpoint.
Esta es una cuestión de defensa en profundidad. El comportamiento afectado solo es alcanzable cuando los bytes del checkpoint en reposo en el almacén de respaldo pueden ser modificados por una parte no autorizada. En la mayoría de los despliegues, ese prerrequisito ya implica un incidente grave por sí mismo. La preocupación adicional es la escalada de "acceso de escritura al almacén de checkpoints" a ejecución de código en el runtime de la aplicación.
No existe evidencia de que este comportamiento haya sido activado en entornos reales, y el equipo no tiene conocimiento de una ruta práctica hacia él en los despliegues actuales. Este cambio tiene como objetivo reducir la superficie de ataque disponible tras un incidente en el almacén de checkpoints.
Usuarios y sistemas afectados
Los usuarios pueden verse afectados si cumplen todas las siguientes condiciones:
- Utilizan un checkpointer persistente (base de datos, almacén remoto, sistema de archivos compartido, etc.) con el
JsonPlusSerializerpor defecto. - Cargan o reanudan desde checkpoints.
- Operan en un entorno donde el acceso de escritura al almacén de checkpoints podría ser obtenido por una parte no autorizada.
El serializador de checkpoints por defecto en todos los backends de checkpointer incluidos en la distribución (PostgresSaver, SqliteSaver y sus contrapartes asíncronas) es JsonPlusSerializer, por lo que las aplicaciones generalmente no necesitan configuración adicional para estar dentro del alcance de esta vulnerabilidad.
Impacto
- Potencial ejecución de código arbitrario u otros efectos secundarios no seguros durante la deserialización de checkpoints.
- Escalada desde "acceso de escritura al almacén de checkpoints" hasta "ejecución de código en el proceso worker de LangGraph", lo que puede exponer secretos de runtime o proporcionar acceso a otros sistemas alcanzables desde el runtime.
Parches y mitigación
La ruta de deserialización JSON ha sido restringida de modo que la reconstrucción queda limitada a la reconstrucción mediante constructor por defecto, utilizando los args y kwargs contenidos en el payload. El codificador propio del framework no ha dependido del comportamiento eliminado para los checkpoints producidos desde la migración a msgpack, por lo que este cambio no afecta a los checkpoints escritos recientemente. Los payloads heredados que ya utilizaban el constructor por defecto como primera opción continúan reconstruyéndose correctamente a través de esa misma ruta.
Compatibilidad
Existe una regresión de compatibilidad limitada en la reanudación de checkpoints anteriores a octubre de 2025 de modelos pydantic, en los que el payload original dependía de una fábrica de recuperación sin validación para recuperarse de una evolución de esquema incompatible. Tras este cambio, dichos payloads devuelven None desde la ruta de reconstrucción y pasan al revisor de langchain-core, que expone el diccionario raw en lugar de reconstruir el modelo.
Guía operacional
- Tratar los almacenes de checkpoints como sensibles a la integridad. Restringir el acceso de escritura y rotar las credenciales si se sospecha acceso no autorizado.
- Evitar proporcionar hooks de reconstrucción JSON personalizados que reconstruyan tipos arbitrarios, a menos que los datos del checkpoint sean completamente confiables.
Nota sobre LangSmith y despliegues hospedados
El equipo no tiene conocimiento de que este problema represente una preocupación para los despliegues hospedados en LangSmith. Las condiciones descritas requieren la modificación de la capa de persistencia de checkpoints utilizada por el despliegue. Las configuraciones hospedadas típicas están diseñadas para prevenir dicho acceso.
Reportado inicialmente por: pucagit (CyStack).
