- app/rate_limit.py: bloqueia por IP após 5 tentativas de senha erradas em 5 minutos em POST /login (rota pré-autenticação, hoje sem nenhuma proteção contra força bruta). - Cookie de sessão (routers/auth.py) e cookie CSRF (main.py) passam a sair com Secure quando a requisição chega em HTTPS (request.url.scheme) — hoje é sempre False porque produção ainda serve HTTP puro, mas o cookie passa a ficar protegido automaticamente assim que um TLS for colocado na frente, sem precisar editar isso de novo. - main.py: novo middleware de security headers (X-Content-Type-Options, X-Frame-Options: DENY, Referrer-Policy, Content-Security-Policy, Strict-Transport-Security condicional a HTTPS). - requirements.txt: fastapi 0.115.0 -> 0.115.6 (starlette >=0.40.0, corrige DoS por memória não limitada ao parsear multipart/form-data — GHSA-f96h-pmfr-66vw), python-multipart 0.0.9 -> 0.0.20 (várias vulnerabilidades de DoS corrigidas), jinja2 3.1.4 -> 3.1.6 (escapes de sandbox). httpx/uvicorn/PyMySQL já estavam em versões sem CVE conhecida — conferido via osv.dev. - Dockerfile: container não roda mais como root. Suíte completa (181 testes) passando, incluindo testes novos para o rate limiter (unitários + integração via POST /login) e smoke test manual confirmando headers, fluxo de login com CSRF e o bloqueio por força bruta. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
20 lines
953 B
Plaintext
20 lines
953 B
Plaintext
# Versões mínimas fixadas por segurança (ver auditoria de 2026-08-15):
|
|
# - fastapi 0.115.6 traz starlette >=0.40.0, que corrige um DoS por
|
|
# consumo de memória não limitado ao parsear multipart/form-data
|
|
# (GHSA-f96h-pmfr-66vw / equivalente ao CVE-2024-47874) — POST /login
|
|
# é uma rota pré-autenticação, então esse endpoint é alcançável por
|
|
# qualquer visitante, autenticado ou não.
|
|
# - python-multipart 0.0.9 tinha várias vulnerabilidades de DoS (boundary
|
|
# malformado, headers de parte sem limite, preambulo/epílogo sem
|
|
# limite) corrigidas em versões posteriores — pinado na última estável.
|
|
# - jinja2 3.1.6 corrige escapes do sandbox (baixo risco aqui, já que o
|
|
# painel não renderiza template vindo de entrada do usuário, mas sem
|
|
# custo de compatibilidade manter em dia).
|
|
fastapi==0.115.6
|
|
uvicorn[standard]==0.30.6
|
|
jinja2==3.1.6
|
|
python-multipart==0.0.20
|
|
PyMySQL==1.1.1
|
|
python-dotenv==1.0.1
|
|
httpx==0.27.2
|