😈 Ержан, вставай!
Давно не было разбора атак на моих проектах. Время исправляться, есть интересная находка. Впервые на проекте нашёл вектора для DoS-атаки, так еще и первая на практике критическая уязвимость.
Конечные точки API для осуществления денежного перевода на вход в JSON-запросе принимают экспоненциальное значение (1e-1) и обрабатывают её, выдавая в ответе рассчитанную сумму с учётом комиссии. При увеличении количества нулей в экспоненте (1e-100...) возрастает время ответа от сервера. На обычные запросы это ~100 мс, после 300, 1000, 8000 и так далее. Наткнулся на такое значение экспоненты, при котором ответ с сервера я получаю через 60000 мс (стандартное ограничение в некоторых браузерах) с 504 HTTP ошибкой.
Решили с Заказчиком провести более глубокое исследование потенциального DoS под наблюдением за сервером. Выяснилось, что экспонента 1e-100000000 и подобные нагружают сервер до 30% при отправке очередью (при ожидании ответа на каждый запрос), когда в обычном состоянии нагрузка не выше 5%. Физически такое число практически равно нулю, но математически нет. Если код пытается его обрабатывать "честно" (например, переводя в дробь или делая арифметику с высокой точностью), это может создать огромную вычислительную нагрузку. Всё говорит о серьёзной проблеме, учитывая то, что это было проделано лишь с помощью одного устройства. А если это сделать в кооперации с другими устройствами? Нагрузка выйдет куда выше.
▎ Риски:
➡️Отказ в обслуживании: один запрос нагружает сервер до 30%, а координированная атака способна нанести более серьёзный урон;
➡️Финансовые потери: запросы связаны с платёжным API, в случае его отказа возможны сбои в транзакциях пользователей;
➡️Репутационный ущерб: нестабильность сервиса подрывает доверие пользователей.
▎ Рекомендации по устранению уязвимости:
✅Валидация входных данных: запрет экспоненциальной записи;
✅Лимиты на обработку чисел: установка максимальной точности (например, округление до 5 знаков после запятой). Timeout на обработку запроса (например, 1 сек), при которой сервер автоматически будет откидывать запросы, которые обрабатывает более установленного времени;
✅Защита от DoS/DDoS: пропускать не более, например, 100 запросов/мин с одного IP, иметь детекты на атаку с различных IP-адресов и отражать вредоносные запросы на сервер;
✅Мониторинг и логирование: алерты при резком росте нагрузки на CPU, логирование подозрительных запросов.
Снова тот случай, когда недостаточная валидация входных данных может привести к катастрофическим последствиям. Нельзя доверять пользовательскому вводу.
"1e-100000000" — это не число, а таймер до перезагрузки сервера.
#кейс
Post #82
1.21K

- 🔥 6