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

ContratoO que éQuem emite
coda-finding/1O Finding canônico: id, moment (src/run), rule, severity, exploitability, confidence, tier, cwe, owasp, location, dataflow_path, evidence, fix, provenancetodas as ferramentas
coda-fort/1Envelope da análise de código (SAST, SCA, qualidade, segredos/IaC, risco)codafort engine analyze
coda-vet/1Veredito sobre uma mudança: blocking, advisory, axes.ran/axes.skipped, contract_breaks, scopecodafort vet
coda-iast/1Laudo IAST: quais findings estáticos foram confirmados em execução e quais não foram medidoscodatrace collect
coda-dast/1Laudo DAST: findings moment: run confirmados, com a âncora do audit logcodaprobe scan
coda-crash/1 · coda-profile/1Forense de crash (kind: analysis, triage, heap, hserr) e de performancecodacrash
coda-evidence/1O resumo que cada ferramenta contribui para a declaração contra-assinadacada ferramenta
coda-attestation/1O 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":

  • unreached significa 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_skipped lista os eixos que o vet não rodou. Eixo pulado não é eixo limpo.
  • granularity impede somar resultados de precisões diferentes, como o file-line do IAST e o cwe do DAST.
  • No veredito da declaração, evidência só aperta: confirmed-at-runtime pode levar de pass a fail, e unreached e sanitized-at-runtime nã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