Resumen

vLLM presenta una vulnerabilidad de integridad en la cadena de suministro que afecta a los controles de fijación de revisión. Los despliegues que especifican --revision o --code-revision pueden seguir cargando código dinámico, archivos GGUF, procesadores de imagen, pesos de recuperación lateral o pesos/configuración de subcarpetas del mismo repositorio desde una revisión no fijada o por defecto.

Esta es una vulnerabilidad de integridad de la cadena de suministro para despliegues vLLM con revisión fijada. Los operadores pueden creer que están sirviendo una revisión de modelo revisada mientras vLLM resuelve artefactos anidados o hermanos que afectan el comportamiento fuera de esa revisión revisada.

Detalles Técnicos

La invariante esperada es que cuando un operador vLLM proporciona una fijación de modelo o revisión de código, cada archivo de código, configuración, procesador, peso, peso lateral y artefacto de subcarpeta del mismo repositorio cargado como parte de ese modelo debe resolverse bajo esa fijación, a menos que vLLM exponga y haga cumplir una fijación explícita separada para ese artefacto.

La rama main actual fue verificada como afectada en el commit 3795d7acf431980e62e738493f437ae2a51549da.

Límites de Código Afectados

Los puntos vulnerables identificados incluyen:

  • vllm/model_executor/models/registry.py:1045-1051 y :1058-1064: _try_resolve_transformers() pasa revision=model_config.revision y trust_remote_code=model_config.trust_remote_code, pero omite code_revision=model_config.code_revision para importaciones de módulos dinámicos auto_map externos.

  • vllm/model_executor/model_loader/gguf_loader.py:58-60: La forma GGUF de archivo directo repo/file.gguf llama a hf_hub_download(repo_id=repo_id, filename=filename) sin pasar revision.

  • vllm/model_executor/models/roberta.py:203-209: Los pesos laterales secundarios sparse y ColBERT de BGE-M3 se declaran con revision=None.

  • vllm/model_executor/models/kimi_k25.py:111-114: Kimi-K2.5 llama a cached_get_image_processor() sin pasar model_config.revision.

  • vllm/model_executor/models/kimi_audio.py:92-95 y :425-430: Kimi-Audio carga configuración de Whisper desde la subcarpeta whisper-large-v3 sin argumento revision y declara pesos secundarios del mismo repositorio con revision=None.

El ejemplo más claro es Kimi-Audio: los pesos primarios de moonshotai/Kimi-Audio-7B-Instruct preservan la revisión del modelo configurada, pero la configuración/pesos de la torre de audio whisper-large-v3 del mismo repositorio no lo hacen.

Impacto

Los usuarios afectados son operadores que fijan despliegues de modelos vLLM a una revisión revisada de Hugging Face para revisión de seguridad, procedencia, rollback o reproducibilidad. El impacto es que la fijación no describe de manera confiable el conjunto completo de artefactos que vLLM sirve.

Incluso cuando el operador selecciona una revisión auditada, vLLM puede resolver artefactos secundarios que afectan el comportamiento desde la rama por defecto del repositorio u otra referencia mutable. Dependiendo de la ruta del modelo, el artefacto no fijado puede ser código de modelo dinámico, un archivo GGUF, un procesador de imagen, pesos laterales de recuperación o los pesos/configuración de la subcarpeta Whisper de Kimi-Audio del mismo repositorio.

Esto rompe la garantía operacional de un despliegue fijado: "servir el conjunto exacto de artefactos que revisé". Un cambio posterior a un artefacto secundario no fijado puede alterar el comportamiento del modelo sin cambiar la revisión configurada del operador, haciendo que la revisión, rollback, respuesta a incidentes y registros de auditoría sean poco confiables.

Casos de Ocurrencia

Las instancias específicas incluyen:

  • Kimi-K2.5 carga su procesador de imagen sin pasar la revisión del modelo
  • Kimi-Audio declara pesos secundarios Whisper con revision=None
  • La carga de configuración Whisper sin pasar la revisión del modelo de nivel superior
  • Resolución de clase de modelo dinámico que omite code_revision
  • Forma GGUF directa que no pasa model_config.revision
  • Creación de fuentes de pesos laterales con revision=None en BgeM3EmbeddingModel

Corrección

Esta vulnerabilidad fue corregida en: https://github.com/vllm-project/vllm/pull/42616

El reporte fue originalmente presentado vía huntr y redirigido al canal privado GHSA por el mantenedor de vLLM. Un paquete de prueba offline está disponible bajo solicitud para verificación.