
مستنسخ مصغّر لثغرة CVE-2026-22732 — تجاهل ترويسات HTTP في Spring Security بصمت
نسخة مصغّرة لإعادة إنتاج CVE-2026-22732 — حيث يتم إسقاط ترويسات استجابة HTTP الأمنية في Spring Security بصمت عندما يكتب كود الـ Controller مباشرةً إلى استجابة الـ servlet.
يستخدم Spring Security كتابة الترويسات "الكسلانة" (lazy) افتراضيًا. عندما يكتب الـ Controller إلى response.getOutputStream()، أو يستدعي response.flushBuffer()، أو يضبط Content-Length عبر setIntHeader()، يتم الالتزام بالاستجابة قبل أن يتمكن Spring Security من حقن ترويساته الأمنية (X-Frame-Options، X-Content-Type-Options، Cache-Control، Strict-Transport-Security، إلخ).
— لا يتطلب مصادقة أو تفاعلًا من المستخدم.
src/main/java/com/example/vuln/
├── VulnApplication.java # نقطة دخول Spring Boot
├── SecurityConfig.java # يضبط الترويسات الأمنية (X-Frame-Options، CSP، إلخ)
└── VulnController.java # نقطة نهاية آمنة + 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>