A cadeia de evidência
Cada saída da codafort segue um contrato público e versionado. Veja o que cada um carrega, do finding à declaração contra-assinada.
Os schemas, com $id que resolve, estão em codafort.dev/schemas.
Os contratos
| Contrato | O que é | Quem emite |
|---|---|---|
coda-finding/1 | O Finding canônico: id, moment (src/run), rule, severity, exploitability, confidence, tier, cwe, owasp, location, dataflow_path, evidence, fix, provenance | todas as ferramentas |
coda-fort/1 | Envelope da análise de código (SAST, SCA, qualidade, segredos/IaC, risco) | codafort engine analyze |
coda-vet/1 | Veredito sobre uma mudança: blocking, advisory, axes.ran/axes.skipped, contract_breaks, scope | codafort vet |
coda-iast/1 | Laudo IAST: quais findings estáticos foram confirmados em execução e quais não foram medidos | codatrace collect |
coda-dast/1 | Laudo DAST: findings moment: run confirmados, com a âncora do audit log | codaprobe scan |
coda-crash/1 · coda-profile/1 | Forense de crash (kind: analysis, triage, heap, hserr) e de performance | codacrash |
coda-evidence/1 | O resumo que cada ferramenta contribui para a declaração contra-assinada | cada ferramenta |
coda-attestation/1 | O payload contra-assinado: resultado, evidence[] e artifacts[] | codafort attest |
Na tag coda-<modalidade>/1, a modalidade é o tipo de análise; a ferramenta que emitiu vem no campo tool.
Evidência de outras ferramentas: coda-evidence/1
Cada ferramenta resume o próprio laudo num arquivo coda-evidence/1, que você passa ao codafort attest com --evidence (fluxo completo em Declaração contra-assinada). Os campos comuns são schema, modality (iast, vet, dast, run) e granularity (file-line, cwe); o resto depende da modalidade. Um resumo IAST:
{ "schema": "coda-evidence/1", "modality": "iast", "granularity": "file-line",
"static_findings": 2, "confirmed_at_runtime": 1, "sanitized_at_runtime": 0, "unreached": 1,
"confirmation_rate": "0.500", "instrumentation": { "sinks_covered": 3, "by_runtime": { "python": 2, "node": 1, "jvm": 0 } } }
Exemplos das quatro modalidades em /schemas/fixtures/coda-evidence*.json.
O que não foi medido não conta como seguro
Evidência só acrescenta confiança. A falta de observação nunca vira "seguro":
unreachedsignifica não medido: a rota não foi exercitada, o sink foi chamado com dado interno ou a categoria não gera evento em execução.axes_skippedlista os eixos que ovetnão rodou. Eixo pulado não é eixo limpo.granularityimpede somar resultados de precisões diferentes, como ofile-linedo IAST e ocwedo DAST.- No veredito da declaração, evidência só aperta:
confirmed-at-runtimepode levar depassafail, eunreachedesanitized-at-runtimenão mudam o veredito.
Mais evidência sobre o mesmo scan
Para acrescentar evidência a um scan já declarado (mesmo commit e mesmo resultado), crie outra declaração com --supersedes. A anterior não é editada; a nova aponta para ela no campo supersedes. Scan diferente pede declaração nova, sem --supersedes.
Ver na prática
- Declaração contra-assinada: criar, verificar, empacotar
- O que a declaração prova e não prova, para quem a recebe, em codafort.com/attestation
- Verificador offline em codafort.com/verify