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 decodatracerequiere licencia Pro, Verified o Platform (Vibe no incluye runtime; sin ella, se niega y dice cómo activar). Soloschemaes 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
| Veredicto | Significa | Qué hacer |
|---|---|---|
confirmed-at-runtime | un evento sin sanitizador correlacionó con el finding: el flujo ocurrió, sin defensa | prioridad máxima; es lo que la declaración contrafirmada puede afirmar |
sanitized-at-runtime | el sink fue alcanzado con un sanitizador de la política, de la categoría correcta, en el camino | hay defensa ahí |
unreached | ningún flujo con dato de request fue observado en ese punto | nunca 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 coveragelista 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_requesten tu middleware. - Python: un driver de base de datos cuyo
connectno 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 enevents_over_cap.
Como codatrace solo reporta flujos observados, un falso positivo es un bug.