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
| Contrato | Qué es | Quién emite |
|---|---|---|
coda-finding/1 | El Finding canónico: id, moment (src/run), rule, severity, exploitability, confidence, tier, cwe, owasp, location, dataflow_path, evidence, fix, provenance | todas las herramientas |
coda-fort/1 | Envelope del análisis de código (SAST, SCA, calidad, secretos/IaC, riesgo) | codafort engine analyze |
coda-vet/1 | Veredicto sobre un cambio: blocking, advisory, axes.ran/axes.skipped, contract_breaks, scope | codafort vet |
coda-iast/1 | Informe IAST: qué findings estáticos se confirmaron en ejecución y cuáles no se midieron | codatrace collect |
coda-dast/1 | Informe DAST: findings moment: run confirmados, con el ancla del audit log | codaprobe scan |
coda-crash/1 · coda-profile/1 | Forense de crash (kind: analysis, triage, heap, hserr) y de rendimiento | codacrash |
coda-evidence/1 | El resumen que cada herramienta aporta a la declaración contrafirmada | cada herramienta |
coda-attestation/1 | El 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":
unreachedsignifica 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_skippedlista los ejes quevetno corrió. Un eje omitido no es un eje limpio.granularityimpide sumar resultados de precisión distinta, como elfile-linedel IAST y elcwedel DAST.- En el veredicto de la declaración, la evidencia solo endurece:
confirmed-at-runtimepuede pasar depassafail, yunreachedysanitized-at-runtimeno 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
- Declaración contrafirmada: crear, verificar, empaquetar
- Lo que la declaración prueba y no prueba, para quien la recibe, en codafort.com/attestation
- Verificador offline en codafort.com/verify