Scanner DAST educacional em Python com crawler determinístico, controle de escopo, verificações passivas, sondagens ativas não destrutivas e relatórios JSON, HTML e SARIF.
O projeto demonstra arquitetura e validação de detectores. Scanners black-box não substituem revisão manual, modelagem de ameaças ou ferramentas DAST maduras.
Estado: v1.0.0 com funcionalidades congeladas. O foco atual é estabilidade, documentação e correções.
- nove testes aprovados e 92% de cobertura total;
- Ruff, Mypy estrito e validação de dependências aprovados;
- scans passivo e ativo exportados em JSON, HTML e SARIF 2.1.0;
- precisão e recall de 100% nas cinco regras avaliadas no fixture sintético;
- escape de escopo bloqueado e zero ocorrências do segredo sentinela nos relatórios.
- mesma origem por padrão e revalidação de cada redirecionamento;
- pinagem observacional de endereços DNS durante o scan;
- limites de páginas, profundidade, requisições, corpo, duração e taxa;
- execução passiva por padrão;
- detectores ativos com canary, contexto e baseline repetida;
- severidade separada de confiança;
- redação de cookies, autorização e parâmetros sensíveis;
- JSON versionado, HTML autocontido e SARIF 2.1.0;
- laboratório com pares vulnerável/corrigido e gabarito.
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -e ".[dev]"
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -e ".[dev]"
Terminal 1:
python lab/app.py --port 8000
Terminal 2, scan passivo:
python -m web_vuln_scanner scan http://127.0.0.1:8000 \
--config scanner.example.yml \
--json reports/passive.json \
--html reports/passive.html \
--sarif reports/passive.sarif
Scan com sondagens do laboratório:
python -m web_vuln_scanner scan http://127.0.0.1:8000 \
--config scanner.example.yml --active \
--json reports/active.json \
--html reports/active.html \
--sarif reports/active.sarif
O modo ativo implementa candidatos a XSS refletido, SQL injection e redirecionamento aberto. Ele não classifica qualquer reflexão ou mudança de página como vulnerabilidade.
| ID | Tipo | Finalidade |
|---|---|---|
| HDR-001 | Passiva | HSTS ausente em HTTPS |
| HDR-002 | Passiva | CSP/proteção de framing ausente |
| HDR-003 | Passiva | nosniff ausente |
| SES-001 | Passiva | atributos de cookie incompletos |
| INF-001 | Passiva | divulgação de tecnologia |
| TLS-001 | Passiva | conteúdo misto/formulário inseguro |
| INJ-001 | Ativa | candidato contextual a XSS refletido |
| INJ-002 | Ativa | candidato diferencial a SQL injection |
| RED-001 | Ativa | redirecionamento aberto confirmado por Location |
0: scan concluído sem atingir o limiar;2: erro de configuração ou execução;10: achado no limiar configurado por--fail-on.
python -m ruff check src tests lab
python -m mypy src
python -m coverage run -m pytest -q
python -m coverage report --fail-under=90
YAML -> ScopePolicy/SafetyBudget -> AsyncFetcher -> Crawler
| |
v v
passivo ativo
\ /
Findings
|
JSON/HTML/SARIF
Detalhes: docs/architecture.md, docs/threat-model.md e docs/rule-authoring.md.
- não executa JavaScript e não cobre completamente SPAs;
- não automatiza fluxos autenticados de várias etapas;
- não testa stored XSS, upload, RCE, desserialização ou brute force;
- pinagem DNS observacional reduz mudanças detectáveis, mas não substitui resolução/conexão totalmente acopladas no sistema operacional;
- métricas publicadas valem apenas para o laboratório sintético.
Consulte REFERENCIAS.md. Identificadores WSTG e CWE são incluídos nos achados para rastreabilidade.
A versão 1.0.0 está congelada. Consulte CHANGELOG.md, SECURITY.md e docs/verification.md.
MIT.