codatrace: confirmación en ejecución

codatrace corre dentro de la aplicación y muestra qué findings de codafort fueron alcanzados por dato no confiable durante la ejecución.

No busca vulnerabilidades nuevas: confirma o deja de confirmar lo que señaló el análisis del código. Esa confirmación puede entrar en la declaración contrafirmada (el artefacto coda-attestation/1 que emite attest create).

Frontera ética. El agente observa y no altera: no inyecta payload, no cambia el resultado de una llamada, no bloquea requests, no termina el proceso. No es WAF ni sandbox. Cuando el agente falla, deja de observar: al arrancar, se apaga y dice por qué en una línea de stderr; durante la ejecución, deja de enviar eventos.
Licencia. En el binario público, el colector de codatrace requiere licencia Pro, Verified o Platform (Vibe no incluye runtime; sin ella, se niega y dice cómo activar). Solo schema es libre. El agente cargado en la aplicación nunca se bloquea: la falta de licencia no tumba la aplicación. Ver planes.

Los tres veredictos

VeredictoSignificaQué hacer
confirmed-at-runtimeun evento sin sanitizador correlacionó con el finding: el flujo ocurrió, sin defensaprioridad máxima; es lo que la declaración contrafirmada puede afirmar
sanitized-at-runtimeel sink fue alcanzado con un sanitizador de la política, de la categoría correcta, en el caminohay defensa ahí
unreachedningún flujo con dato de request fue observado en ese puntonunca lo leas como "seguro": es "no medido"

unreached tiene tres causas que el colector no distingue: ruta no ejercitada, sink llamado con dato interno o categoría que el agente no observa. Por eso la evidencia dice literalmente no medido, nunca seguro.

Instalar

El binario viene con los agentes de Python, Node y JVM en el mismo paquete. No hay paquete PyPI ni npm: agente y colector deben ser de la misma versión. Descarga en Descargar o instala la fórmula codatrace.rb publicada como asset del release.

codatrace install python     # materializa el agente e imprime cómo cargarlo
codatrace install node
codatrace install jvm        # fuera de la matriz (linux-arm64/Windows): imprime la línea de cc para recompilar

El flujo

# 1. La política dice qué observa el agente; viene de la taxonomía de codafort.
#    El paquete del release trae la política generada del mismo commit:
codatrace policy --output policy.json

# 2. Levanta la aplicación con el agente (`codatrace install <runtime>` imprime las líneas exactas).
export CODATRACE_POLICY=policy.json CODATRACE_EVENTS=events.jsonl
node --import .codatrace/agents/node/codatrace_agent.mjs app.js    # Node: el --import garantiza el orden en ESM
#    Python: al inicio del proceso `import codatrace_agent; codatrace_agent.install()` y
#    `app = codatrace_agent.wsgi(app)` (Django; en Flask, `app.wsgi_app`) o `codatrace_agent.asgi(app)`.
#    JVM: java -agentpath:.codatrace/agents/jvm/libcodatrace.so=events.jsonl …

# 3. Ejercita la aplicación (pruebas de integración, staging, tráfico real de homologación).

# 4. El análisis de código, para cruzar:
codafort engine analyze --source . --output static.json

# 5. Recolecta y correlaciona por archivo, línea y categoría:
codatrace collect --events events.jsonl --static static.json --policy-file policy.json --output informe.json
SOCK="$(mktemp -d)/codatrace.sock"   # multi-worker: directorio privado, CODATRACE_EVENTS="$SOCK" en los workers
codatrace collect --socket "$SOCK" --timeout 600 --static static.json --policy-file policy.json --output informe.json

# 6. La contribución de evidencia para la declaración contrafirmada (coda-evidence/1, modality: iast):
codatrace coverage > coverage.json
codatrace evidence --report informe.json --coverage coverage.json > iast-ev.json
codafort attest create --evidence iast-ev.json

Con --socket, los agentes solo se conectan a un socket del mismo usuario. --timeout es la ventana de recolección (por defecto 30 s); el informe dice cuántas conexiones cortó el plazo (socket_connections_cut_by_deadline). Sin --socket, el colector lee de --events o de stdin, que es el camino para CI sin aplicación viva. Quien puede escribir en el canal de eventos puede alterar lo que será firmado.

codatrace evidence --verdicts publica los pares (finding, veredicto) resumidos en el verdict_digest, solo con id opaco y verdict, nunca archivo ni línea. Sin --coverage, la cobertura del agente queda ausente en la evidencia: "no medido", nunca cero.

Lo que no ve

  • El agente verifica si algún valor del request aparece dentro del argumento del sink. Un valor transformado antes del sink (hash, compresión, codificación) queda sin confirmar: eso puede ocultar un flujo, pero no genera falso positivo. Los valores de menos de 3 caracteres se ignoran, y la concatenación parcial escapa.
  • La cobertura de sinks es parcial. codatrace coverage lista lo que observa cada agente.
  • Parte de la taxonomía no tiene evento que observar en ejecución: reglas numéricas y estructurales (índice, división, límite de bucle, asignación, overflow, ReDoS) y, por ahora, categorías como log, CORS, NoSQL, XPath, template y header splitting. Esas quedan unreached.
  • Python y Node: la fuente automática lee solo la query string; para el cuerpo, llama a begin_request en tu middleware.
  • Python: un driver de base de datos cuyo connect no es atributo escribible queda sin cobertura.
  • Node: una función exportada suelta de un paquete ESM no se observa; un método de prototipo sí.
  • JVM: sin cobertura de SQL ni de XSS. Los frames de framework (Spring, Tomcat, Jackson…) no cuentan como código de la aplicación. El sanitizador se observa en la entrada del método.
  • Techo de emisión: CODATRACE_MAX_EVENTS (por defecto 10 000). El descarte aparece en el informe en events_over_cap.

Como codatrace solo reporta flujos observados, un falso positivo es un bug.