
Reproduction minimale de CVE-2026-22732 — en-têtes HTTP Spring Security silencieusement supprimés
Reproduction minimale de CVE-2026-22732 — les en-têtes de réponse HTTP de Spring Security sont silencieusement supprimés lorsque le code du contrôleur écrit directement dans la réponse du servlet.
Spring Security utilise l'écriture « paresseuse » des en-têtes par défaut. Lorsqu'un contrôleur écrit dans response.getOutputStream(), appelle response.flushBuffer(), ou définit Content-Length via setIntHeader(), la réponse est validée avant que Spring Security puisse injecter ses en-têtes de sécurité (X-Frame-Options, X-Content-Type-Options, Cache-Control, Strict-Transport-Security, etc.).
CVSS 3.1 : 9,1 (Critique) — aucune authentification ni interaction utilisateur requise.
src/main/java/com/example/vuln/
├── VulnApplication.java # Point d'entrée Spring Boot
├── SecurityConfig.java # Configure les en-têtes de sécurité (X-Frame-Options, CSP, etc.)
└── VulnController.java # 1 point de terminaison sûr + 3 vulnérables
src/test/java/com/example/vuln/
└── HeaderVerificationTest.java # Tests qui ÉCHOUENT sur les versions vulnérables
| Point de terminaison | Vulnérable ? | Déclencheur |
|---|---|---|
GET /safe | Non | Retour Spring MVC normal |
GET /vuln/stream | Oui | Écrit dans response.getOutputStream() |
GET /vuln/flush | Oui | Appelle response.flushBuffer() |
GET /vuln/content-length | Oui | Définit Content-Length via setIntHeader() |
./mvnw spring-boot:run
Puis vérifiez avec curl :
# Sûr — en-têtes présents
curl -i http://localhost:8080/safe
# Vulnérable — en-têtes de sécurité MANQUANTS
curl -i http://localhost:8080/vuln/stream
curl -i http://localhost:8080/vuln/flush
curl -i http://localhost:8080/vuln/content-length
./mvnw test
Sur une version vulnérable, les tests vuln* échoueront (en-têtes manquants).
Sur une version corrigée (6.5.9+ / 7.0.4+), tous les tests réussissent.
Mettez à jour pom.xml pour utiliser une version corrigée de Spring Security :
<spring-security.version>6.5.9</spring-security.version>