Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
Ferramentas/GitHubGitHub/s1ko/cve-2026-47630
Análise de VulnerabilidadesExploraçãoSegurança de IA
GitHubs1ko/cve-2026-47630

CVE-2026-47630

Análise técnica de vulnerabilidade e prova de conceito para CVE-2026-47630, um dlopen arbitrário via TRITON_BATCH_STRATEGY_PATH no NVIDIA Triton Inference Server que permite execução nativa de código, com orientações de detecção e mitigação.

Ver Repositório
há 1 diaAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-47630 — NVIDIA Triton Inference Server: dlopen arbitrário via TRITON_BATCH_STRATEGY_PATH

Traversal de caminho absoluto no carregador de estratégia de batching personalizado de triton-inference-server/core. Um parâmetro de configuração de modelo é passado sem validação para dlopen(RTLD_NOW | RTLD_LOCAL), portanto qualquer pessoa capaz de influenciar o config.pbtxt de um modelo obtém execução de código nativo dentro do processo do servidor Triton no momento do carregamento do modelo.

O reconhecimento da NVIDIA no boletim 5865 diz textualmente: CVE-2026-47630: s1ko.

Resumo

O Triton aceita um parâmetro TRITON_BATCH_STRATEGY_PATH por modelo do config.pbtxt do modelo. Até 26.05, o valor era tratado como um caminho de sistema de arquivos arbitrário e passado sem modificação para dlopen. Não havia verificação de contenção, lista de permissões nem verificação de assinatura ou hash. Caminhos absolutos, sequências de traversal e symlinks eram todos aceitos.

RTLD_NOW resolve cada símbolo imediatamente e executa as rotinas __attribute__((constructor)) / .init_array do objeto antes que dlopen retorne. Portanto, a execução não depende de um carregamento bem-sucedido — nenhum dos pontos de entrada TRITONBACKEND_ModelBatch* precisa existir para que o payload seja executado, e ele é executado com os privilégios do processo Triton (frequentemente root em contêineres NGC).

Execução

Caminho de código (na versão 26.05)

src/backend_model.cc — a entrada do atacante chega a batch_libpath, validada apenas quanto à existência:

root@kitploit:~
if (model_config.parameters().contains("TRITON_BATCH_STRATEGY_PATH")) {
  batch_libpath = model_config.parameters()
                      .at("TRITON_BATCH_STRATEGY_PATH")
                      .string_value();
  bool exists = false;
  RETURN_IF_ERROR(FileExists(batch_libpath, &exists));
  if (!exists) {
    return Status(
        triton::common::Error::Code::NOT_FOUND,
        ("Batching library path not found: " + batch_libpath).c_str());
  }
}

Notavelmente, não há nenhuma chamada a IsChildPathEscapingParentPath, que o Triton já aplicava a caminhos de labels e a caminhos de bibliotecas de backend em outras partes do mesmo arquivo.

src/backend_model.cc — SetBatchingStrategy o encaminha:

root@kitploit:~
Status TritonModel::SetBatchingStrategy(const std::string& batch_libpath)
{
  std::unique_ptr<SharedLibrary> slib;
  RETURN_IF_ERROR(SharedLibrary::Acquire(&slib));
  RETURN_IF_ERROR(slib->OpenLibraryHandle(batch_libpath, &batch_dlhandle_));

src/shared_library.cc — o sink:

root@kitploit:~
*handle = dlopen(path.c_str(), RTLD_NOW | RTLD_LOCAL);

Alcance

Três rotas práticas para controlar model_config.parameters():

  1. Repositório de modelos multi-inquilino. Um inquilino que possui o config.pbtxt do seu modelo coloca um .so no seu próprio diretório e aponta o parâmetro para ele. O payload é executado com os privilégios do servidor, dando acesso aos pesos, segredos e GPU de todos os outros inquilinos.
  2. API de substituição de arquivo (file-override). TRITONSERVER_ServerLoadModelWithParameters combinado com o prefixo de parâmetro documentado file:<rel-path> permite que um chamador com direitos de carregamento de modelo envie config.pbtxt e o .so em uma única solicitação e acione o carregamento imediatamente. Nenhum acesso ao sistema de arquivos fora da API é necessário.
  3. Espelho de armazenamento de modelos comprometido. Espelhos S3, GCS, Azure Blob ou NGC tratados como autoritativos para artefatos de modelo. Quem controla o espelho entrega ambos os arquivos; o Triton busca e executa dlopen sob demanda.

Prova de conceito

poc/ contém a primitiva, reduzida ao que OpenLibraryHandle faz. Apenas fontes — compile-as você mesmo:

root@kitploit:~
$ cd poc && ./build.sh
$ gcc -O0 -o test_dlopen test_dlopen.c -ldl
$ ./test_dlopen ./evil.so
dlopen OK, handle=0x55d1779652c0
$ cat /tmp/triton_dlopen_rce_proof.log
[triton-dlopen-rce] constructor fired @ Fri May  1 09:56:56 2026
  pid=240157  uid=1000  euid=1000  cwd=/opt/poc

O payload é inerte: ele acrescenta uma linha registrando pid, uid, euid e cwd. Verificado no Debian 13, GCC 14.2, x86_64.

Para o acionamento pelo lado do Triton, coloque o evil.so compilado ao lado de poc/config.pbtxt no repositório de modelos e carregue o modelo — auto-load, --load-model ou POST /v2/repository/models/evil_model/load. Em uma versão afetada, o construtor é disparado durante SetBatchingStrategy, antes de qualquer busca de símbolo de backend.

Detecção

O carregamento é registrado pelo próprio Triton em nível INFO:

root@kitploit:~
Loading custom batching strategy library <path> for model <name>

Em uma versão corrigida, uma tentativa rejeitada aparece como Batching library path escapes model repository.

Qualquer valor TRITON_BATCH_STRATEGY_PATH que seja absoluto, contenha .. ou resolva fora do diretório do modelo merece alerta independentemente da versão. Uma regra Sigma cobrindo tanto a linha de log quanto o parâmetro de configuração está em detection/.

Sinais complementares:

  • Arquivos config.pbtxt que contenham sequer um parâmetro TRITON_BATCH_STRATEGY_PATH — o recurso é raro na prática, portanto a mera presença já é um filtro útil.
  • Objetos compartilhados que aparecem dentro de um repositório de modelos e que não são artefatos de backend.
  • openat/mmap de um .so fora da raiz do modelo pelo processo tritonserver (auditd, eBPF ou Falco).

Mitigação

Atualize para o Triton Inference Server 26.06 ou posterior. A correção adiciona a verificação de contenção que faltava ao carregador:

root@kitploit:~
bool escapes{true};
RETURN_IF_ERROR(IsChildPathEscapingParentPath(
    batch_libpath, localized_model_dir->Path(), &escapes));
if (escapes) {
  return Status(
      Status::Code::INVALID_ARG,
      "Batching library path escapes model repository.");
}

Quando a atualização não for imediatamente possível, controles compensatórios:

  • Rejeite ou remova TRITON_BATCH_STRATEGY_PATH de todos os config.pbtxt antes que cheguem ao repositório de modelos.
  • Trate o repositório de modelos como uma fronteira de confiança: nenhuma parte não confiável escreve nele, e espelhos remotos são verificados quanto à integridade antes da sincronização.
  • Desative o caminho de carregamento por substituição de arquivo (--model-control-mode diferente de explicit, ou autorização nos endpoints do repositório) a menos que seja necessário.
  • Execute tritonserver como um usuário sem privilégios com um mount de repositório de modelos somente leitura, para que um carregamento bem-sucedido tenha o menor raio de explosão possível.
  • Verifique um hash ou assinatura sobre os artefatos do modelo antes do carregamento.

Mapeamento: MITRE ATT&CK T1574.006 Hijack Execution Flow: Dynamic Linker Hijacking e T1129 Shared Modules; NIST SP 800-53r5 SI-7, CM-5, SC-18; CIS Controls v8 §2, §4.

Linha do tempo

Referências

  • Boletim de segurança NVIDIA 5865 — https://github.com/NVIDIA/product-security/blob/main/2026/5865/5865.md
  • Registro CVE — https://github.com/NVIDIA/product-security/blob/main/2026/5865/CVE-2026-47630.json
  • triton-inference-server/core — https://github.com/triton-inference-server/core
  • Segurança de Produtos NVIDIA — https://www.nvidia.com/security/

Licença

MIT — veja LICENSE.

Baixar ferramenta
CVECVE-2026-47630
Boletim NVIDIA5865 (2026-08-18)
CWECWE-36 (Absolute Path Traversal); relatado como CWE-114 / CWE-829
CVSS v3.1 (NVIDIA)5.5 MEDIUM — AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
AfetadosTriton Inference Server 0.0 – 26.05 (Linux)
Corrigido em26.06
Relatado pors1ko (github.com/s1ko, [email protected])
Rastreamento do fornecedorNVIDIA PSIRT ticket 6139742
DataEvento
2026-04-25Descoberta primária de manipulação de caminhos no Triton reportada; NVIDIA PSIRT abre o ticket 6128799
2026-05-01Esta descoberta secundária confirmada e reportada; PSIRT abre o ticket 6139742
2026-05-28Cronograma de divulgação coordenada acordado com o PSIRT
2026-06Correção lançada no Triton Inference Server 26.06
2026-08-18NVIDIA publica o boletim 5865, atribuindo CVE-2026-47630 e creditando s1ko
2026-08-22Este relatório foi publicado