
Минимальное воспроизведение CVE-2026-22732 — HTTP-заголовки Spring Security молча отбрасываются
Минимальное воспроизведение CVE-2026-22732 — заголовки HTTP-ответа Spring Security молча отбрасываются, когда код контроллера пишет напрямую в сервлетный ответ.
Spring Security по умолчанию использует «ленивую» запись заголовков. Когда контроллер пишет в response.getOutputStream(), вызывает response.flushBuffer() или устанавливает Content-Length через setIntHeader(), ответ фиксируется до того, как Spring Security сможет внедрить свои заголовки безопасности (X-Frame-Options, X-Content-Type-Options, Cache-Control, Strict-Transport-Security и т. д.).
CVSS 3.1: 9.1 (Критический) — не требуется аутентификация или взаимодействие с пользователем.
src/main/java/com/example/vuln/
├── VulnApplication.java # Точка входа Spring Boot
├── SecurityConfig.java # Настраивает заголовки безопасности (X-Frame-Options, CSP и т. д.)
└── VulnController.java # 1 безопасная + 3 уязвимые конечные точки
src/test/java/com/example/vuln/
└── HeaderVerificationTest.java # Тесты, которые ПРОВАЛИВАЮТСЯ на уязвимых версиях
| Конечная точка | Уязвимая? | Триггер |
|---|---|---|
GET /safe | Нет | Обычный возврат Spring MVC |
GET /vuln/stream | Да | Запись в response.getOutputStream() |
GET /vuln/flush | Да | Вызов response.flushBuffer() |
GET /vuln/content-length | Да | Установка Content-Length через setIntHeader() |
./mvnw spring-boot:run
Затем проверьте с помощью curl:
# Безопасно — заголовки присутствуют
curl -i http://localhost:8080/safe
# Уязвимо — заголовки безопасности ОТСУТСТВУЮТ
curl -i http://localhost:8080/vuln/stream
curl -i http://localhost:8080/vuln/flush
curl -i http://localhost:8080/vuln/content-length
./mvnw test
На уязвимой версии тесты vuln* будут проваливаться (отсутствующие заголовки).
На исправленной версии (6.5.9+ / 7.0.4+) все тесты проходят.
Обновите pom.xml, чтобы использовать исправленную версию Spring Security:
<spring-security.version>6.5.9</spring-security.version>