La cadena de evidencia

Cada salida de codafort sigue un contrato público y versionado. Mira qué lleva cada uno, del finding a la declaración contrafirmada.

Los schemas, con $id que resuelve, están en codafort.dev/schemas.

Los contratos

ContratoQué esQuién emite
coda-finding/1El Finding canónico: id, moment (src/run), rule, severity, exploitability, confidence, tier, cwe, owasp, location, dataflow_path, evidence, fix, provenancetodas las herramientas
coda-fort/1Envelope del análisis de código (SAST, SCA, calidad, secretos/IaC, riesgo)codafort engine analyze
coda-vet/1Veredicto sobre un cambio: blocking, advisory, axes.ran/axes.skipped, contract_breaks, scopecodafort vet
coda-iast/1Informe IAST: qué findings estáticos se confirmaron en ejecución y cuáles no se midieroncodatrace collect
coda-dast/1Informe DAST: findings moment: run confirmados, con el ancla del audit logcodaprobe scan
coda-crash/1 · coda-profile/1Forense de crash (kind: analysis, triage, heap, hserr) y de rendimientocodacrash
coda-evidence/1El resumen que cada herramienta aporta a la declaración contrafirmadacada herramienta
coda-attestation/1El payload contrafirmado: resultado, evidence[] y artifacts[]codafort attest

En la etiqueta coda-<modalidad>/1, la modalidad es el tipo de análisis; la herramienta que lo emitió va en el campo tool.

Evidencia de otras herramientas: coda-evidence/1

Cada herramienta resume su propio informe en un archivo coda-evidence/1, que pasas a codafort attest con --evidence (flujo completo en Declaración contrafirmada). Los campos comunes son schema, modality (iast, vet, dast, run) y granularity (file-line, cwe); el resto depende de la modalidad. Un resumen 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 } } }

Ejemplos de las cuatro modalidades en /schemas/fixtures/coda-evidence*.json.

Lo que no se midió no cuenta como seguro

La evidencia solo suma confianza. La falta de observación nunca se vuelve "seguro":

  • unreached significa no medido: la ruta no se ejercitó, el sink se llamó con dato interno o la categoría no genera evento en ejecución.
  • axes_skipped lista los ejes que vet no corrió. Un eje omitido no es un eje limpio.
  • granularity impide sumar resultados de precisión distinta, como el file-line del IAST y el cwe del DAST.
  • En el veredicto de la declaración, la evidencia solo endurece: confirmed-at-runtime puede pasar de pass a fail, y unreached y sanitized-at-runtime no cambian el veredicto.

Más evidencia sobre el mismo scan

Para sumar evidencia a un scan ya declarado (mismo commit y mismo resultado), crea otra declaración con --supersedes. La anterior no se edita; la nueva apunta a ella en el campo supersedes. Un scan distinto pide una declaración nueva, sin --supersedes.

Verlo en la práctica