# Уязвимость CVE-2024-38828 ## Описание Тест проверяет поведение/реакцию в Spring Framework при уязвимости CVE-2024-38828 и без нее. В `ByteArrayHttpMessageConverter` аллоцируется память в `ByteArrayOutputStream` по заголовку запроса `Content-Length` что может не соответсвовать реальности с телом в 0 байт. При резком росте таких запросов (DoS), память используется неоптимально, появляются регулярные чистки GC и приложение начинает лагать. Покажу как это реализовать/исправить и метрики. ![Графики метрик](tests/results/результаты_теста.png) ## Описание уязвимости 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 - **Влияние**: Исчерпание памяти сервера, приводящее к отказу в обслуживании ## Решение ### Реализованный фикс 1. Создан кастомный `HttpMessageConverter` для обработки массивов байтов 2. Реализована проверка размера входящих данных 3. Использован потоковый подход для обработки больших 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) ## Код теста ```python 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 ``` ### Запуск тестов 1. Установите зависимости Python: ```bash pip install -r requirements.txt ``` 2. Запустите тест: ```bash python tests/load_test.py ```