Descripción general
LMDeploy presenta una vulnerabilidad crítica de ejecución remota de código (RCE) en su plano de control PyTorch DistServe/PD-disaggregation. El componente afectado utiliza recv_pyobj() para deserializar mensajes recibidos a través de un socket ZeroMQ de tipo PULL. La implementación PyZMQ de recv_pyobj() emplea deserialización Python Pickle, mecanismo que puede ejecutar código arbitrario durante la reconstrucción de objetos, antes de que cualquier validación de tipo o campo pueda tener lugar.
Flujo de datos vulnerable
La dirección del par remoto utilizada por el receptor se suministra a través del endpoint HTTP POST /distserve/p2p_connect. Un atacante con acceso al servidor API de DistServe afectado puede provocar que el servidor se conecte a un endpoint ZeroMQ bajo su control y deserialice un payload Pickle especialmente construido.
El flujo de explotación es el siguiente:
- El atacante envía una solicitud de conexión P2P a DistServe que contiene una dirección ZeroMQ arbitraria.
- El motor LMDeploy conecta su socket ZeroMQ PULL a esa dirección controlada por el atacante.
- La función
handle_zmq_recv()recibe mensajes medianterecv_pyobj(). - El par malicioso envía un objeto Pickle manipulado.
- El código Python embebido en el payload se ejecuta durante la deserialización, antes de que LMDeploy pueda realizar ninguna validación de tipo o campo.
Es importante destacar que cualquier verificación de tipo realizada después de recv_pyobj() no mitiga el problema, ya que la ejecución del payload Pickle ocurre durante la propia deserialización, no después.
Componentes afectados
Los componentes directamente implicados en esta vulnerabilidad son:
- Punto de entrada HTTP:
lmdeploy/serve/openai/endpoints/distserve.py, endpointPOST /distserve/p2p_connect. - Dirección del par controlada por el atacante:
DistServeConnectionRequest.remote_engine_endpoint_info.zmq_address. - Receptor vulnerable:
lmdeploy/pytorch/disagg/conn/engine_conn.py, métodoEngineP2PConnection.handle_zmq_recv(). - Operación insegura:
recv_pyobj(), que realiza deserialización Pickle.
Condiciones de explotación
La autenticación mediante API key no está habilitada por defecto en LMDeploy: el operador debe configurarla explícitamente. Como consecuencia, los despliegues de DistServe que no hayan configurado autenticación permiten RCE no autenticado con los privilegios del proceso de servicio de LMDeploy.
Esta vulnerabilidad afecta exclusivamente al backend PyTorch cuando PD-disaggregation/DistServe está habilitado. Los despliegues ordinarios que no utilizan la ruta de servicio disaggregado afectada no exponen este flujo de datos y no son vulnerables.
Impacto
La explotación exitosa permite la ejecución de código arbitrario con los privilegios del proceso de servicio de LMDeploy. Las consecuencias potenciales incluyen:
- Exposición de pesos del modelo, prompts e historial de inferencia.
- Robo de credenciales y secretos accesibles desde el proceso.
- Acceso al almacenamiento adjunto y a los servicios de red del clúster.
- Compromiso de recursos del host y de GPU.
- Modificación o terminación del proceso de servicio, causando interrupción del servicio.
Versiones afectadas
La vulnerabilidad afecta a las siguientes versiones:
lmdeploy >= 0.9.2, < 0.16.0
El receptor P2P vulnerable fue introducido en el commit b0b705f7.
Remediación
El problema fue corregido sustituyendo el protocolo ZeroMQ basado en Pickle por serialización JSON. Los cambios aplicados en la corrección son:
send_pyobj()fue reemplazado porsend_json().recv_pyobj()fue reemplazado porrecv_json().- Los objetos recibidos son validados mediante el esquema Pydantic
DistServeCacheFreeRequestantes de su uso. - Los mensajes inválidos o que no se ajustan al esquema son rechazados sin terminar el bucle de recepción.
El commit de corrección está disponible en:
https://github.com/InternLM/lmdeploy/commit/f05b4ad8bf2e2d84101a1d63b3c44fadd99223b2
La corrección fue publicada en LMDeploy 0.16.0. Se recomienda actualizar a esta versión o posterior.
Mitigaciones temporales
Para los usuarios que no puedan actualizar de forma inmediata, se recomiendan las siguientes medidas de mitigación. Estas medidas reducen la exposición pero no hacen que la deserialización Pickle sea segura, por lo que la actualización a LMDeploy 0.16.0 o posterior sigue siendo la acción recomendada:
- Impedir que clientes no confiables accedan a los endpoints
/distserve/*. - Restringir los planos de control HTTP y ZeroMQ de DistServe a redes de clúster de confianza.
- Configurar autenticación mediante API key.
- Bloquear conexiones ZeroMQ salientes arbitrarias desde los nodos de servicio.
