
Reprodução mínima do CVE-2026-22732 — cabeçalhos HTTP do Spring Security silenciosamente descartados
Reprodução mínima do CVE-2026-22732 — cabeçalhos de resposta HTTP do Spring Security silenciosamente descartados quando o código do controlador escreve diretamente na resposta do servlet.
O Spring Security usa escrita "preguiçosa" de cabeçalhos por padrão. Quando um controlador escreve em response.getOutputStream(), chama response.flushBuffer(), ou define Content-Length via setIntHeader(), a resposta é confirmada antes que o Spring Security possa injetar seus cabeçalhos de segurança (X-Frame-Options, X-Content-Type-Options, Cache-Control, Strict-Transport-Security, etc.).
CVSS 3.1: 9.1 (Crítico) — não requer autenticação ou interação do usuário.
src/main/java/com/example/vuln/
├── VulnApplication.java # Ponto de entrada do Spring Boot
├── SecurityConfig.java # Configura cabeçalhos de segurança (X-Frame-Options, CSP, etc.)
└── VulnController.java # 1 endpoint seguro + 3 vulneráveis
src/test/java/com/example/vuln/
└── HeaderVerificationTest.java # Testes que FALHAM em versões vulneráveis
| Endpoint | Vulnerável? | Gatilho |
|---|---|---|
GET /safe | Não | Retorno normal do Spring MVC |
GET /vuln/stream | Sim | Escreve em response.getOutputStream() |
GET /vuln/flush | Sim | Chama response.flushBuffer() |
GET /vuln/content-length | Sim | Define Content-Length via setIntHeader() |
./mvnw spring-boot:run
Em seguida, verifique com curl:
# Seguro — cabeçalhos presentes
curl -i http://localhost:8080/safe
# Vulnerável — cabeçalhos de segurança AUSENTES
curl -i http://localhost:8080/vuln/stream
curl -i http://localhost:8080/vuln/flush
curl -i http://localhost:8080/vuln/content-length
./mvnw test
Em uma versão vulnerável, os testes vuln* falharão (cabeçalhos ausentes).
Em uma versão corrigida (6.5.9+ / 7.0.4+), todos os testes passam.
Atualize o pom.xml para usar uma versão corrigida do Spring Security:
<spring-security.version>6.5.9</spring-security.version>