24474dfdc65a110182546f48dee1c6c887ec75e2
Уязвимость CVE-2024-38828
Описание
Тест проверяет поведение/реакцию в Spring Framework при уязвимости CVE-2024-38828 и без нее.
В ByteArrayHttpMessageConverter аллоцируется память в ByteArrayOutputStream по заголовку запроса Content-Length
что может не соответсвовать реальности с телом в 0 байт. При резком росте таких запросов (DoS), память используется
неоптимально, появляются регулярные чистки GC и приложение начинает лагать. Покажу как это реализовать/исправить и метрики.
Описание уязвимости
CVE-2024-38828 - это уязвимость типа Denial of Service (DoS) в Spring Framework, которая позволяет атакующему вызвать исчерпание памяти на сервере через контроллер Spring MVC с параметром типа byte[].
Технические детали
- Уязвимые версии: Spring Framework 5.3.x (все версии)
- Тип уязвимости: Denial of Service (DoS)
- Вектор атаки: HTTP POST запросы с Content-Length = 2 ^ 31 - 1
- Влияние: Исчерпание памяти сервера, приводящее к отказу в обслуживании
Решение
Реализованный фикс
- Создан кастомный
HttpMessageConverterдля обработки массивов байтов - Реализована проверка размера входящих данных
- Использован потоковый подход для обработки больших payload'ов
Тестирование
Структура проекта
.
├── src/
│ └── main/
│ └── java/
│ └── me/
│ └── func/
│ └── demo/
│ ├── config/
│ │ └── WebConfig.java
│ ├── converter/
│ │ └── SafeByteArrayHttpMessageConverter.java
│ ├── controller/
│ │ └── DemoController.java
│ └── DemoApplication.java
├── tests/
│ ├── load_test.py
│ └── results/
│ ├── результаты_теста.png
│ └── метрики.json
└── README.md
Параметры теста
- Количество запросов: 6000
- Максимальное количество одновременных запросов: 5
- Задержка между группами запросов: 0.1 секунды
- Размер запроса: 1 байт
- Заголовок Content-Length: 2^31 - 1 (максимальное значение для int)
Код теста
def send_request(url):
try:
response = requests.post(
url,
data=b'0', # Минимальный payload
headers={
'Content-Type': 'application/octet-stream',
'Content-Length': str(2**31 - 1) # Максимальный размер
}
)
return response.status_code, response.text
except Exception as e:
return f"Ошибка: {str(e)}", None
Запуск тестов
- Установите зависимости Python:
pip install -r requirements.txt
- Запустите тест:
python tests/load_test.py
Description
Languages
Python
84.7%
Java
15.3%
