Claude no audita solo: revisa el pack que midió el motor
Este no es “hackeamos Anthropic”. Es el caso de cómo se usa Claude con NP Auditor: el motor mide, exporta un pack sanitizado, Claude (en Cursor / IDE) propone lectura, y un humano confirma. R1: propone, no escribe banco.
Claude aquí es el LLM cliente — el revisor del pack en tu chat. No es el motor SAST, no persiste al brain, no promociona firmas. Candidato / match ≠ vulnerabilidad confirmada. Sin exploits, sin PoCs.
Para mortales: qué es Claude aquí
Imagina que el motor ya pasó el código y te dejó una lista de “oigan, esto huele raro” (archivo, línea, sink, estado). Claude no inventó esa lista: la lee y te dice “esto parece TP / FP / candidato a firma”, con criterio. Tú (o el operador) decides. El banco de firmas no se toca desde el chat.
En la práctica: abres Cursor (o el IDE que sea), tienes NP Auditor / MCP,
pegas o cargas el pack con np_fase_e_pack, corres /np-tracks
(o el prompt de revisión), y Claude trabaja sobre tracks ya medidos —
no sobre vibes del repo entero.
El flujo: motor mide → pack → Claude propone → humano confirma
fase_e_cliente_pack.json / staging firmas. Snippets cortos, estados, sin pedir escribir banco.
detectar=null hasta entonces.
Eso es R1 en criollo: el LLM del cliente es revisor externo, no destilador automático.
La auditoría diaria (/np, /np-code, risks…) no cambia;
este flujo es el puente opcional cuando te entregan un pack de cuarentena o firmas candidatas.
Lo que Claude vería (tracks de packs existentes)
Antes del smoke del SDK, el producto ya tenía packs reales.
Esto es literalmente el JSON que Claude revisa con /np-tracks —
paths, estados y sinks del pack, no un trophy wall.
Fuente: fase_e_cliente_pack.json (v2, ts 2026-08-01T07:32:58Z) —
fixtures + MCP de np-auditor. Propósito del pack: “Revisión externa con LLM del IDE.
Propuesta de lectura; no es fuente de verdad interna.”
proc = subprocess.run(
["bash", str(script), *args],
...
match_objetivo, oráculo null (código real / bridge, no fixture).
Claude propondría: ¿comando controlado vs inyección? CWE sigue en null en cuarentena — correcto (R1).
with urllib.request.urlopen(req, timeout=120) ...
def ejecutar_compile_vulnerable(codigo: str):
ejecutar = exec
ejecutar(compile(codigo, "<string>", "exec"))
detectar=null hasta revisión humana.
Del caso repos reales (lo que ya publicamos)
En el
caso agregado aws-cli / Django / Metaflow,
Claude revisaría tracks como estos (pack / agregados, cwe: null en cuarentena):
- aws-cli
help.py:190·Popen+shell=True→obj_cmd_injection0.9 ·match_objetivo - django
db.py:75·cursor.execute→obj_sqli_concat0.75 · a menudo ruido de familia (parametrizado) - aws-cli
textwriter.py:21·re.compile→obj_rce_eval0.9 · homonimia típica (ruido)
Misma regla: Claude etiqueta la lectura; el operador decide. Detalle por repo en aws-cli · Django · Metaflow.
Smoke Fase E: SDK Python de Anthropic (read-only)
Hilo técnico opcional, acotado: shallow clone de
anthropics/anthropic-sdk-python
(main · f5c30d0), scan solo de src/anthropic/lib/
(≈61 .py), cerebro aislado en /tmp — sin pisar el pack de fixtures.
Runner: run_capa2_fase_e_v2.py · ts 2026-08-02T23:51:28Z · ~1.5 s.
| Métrica | Valor |
|---|---|
| Scan path | src/anthropic/lib/ (sin types/) |
| Oráculo pass/fail | 0 / 0 |
| Top objetivos (match) | mass_assignment 3 · rce_eval 3 · sqli_concat 2 · header_crlf 2 · zip_slip 1 · cors_reflect 1 |
| Capa1 | CWE-1021 ×2 (firma clickjacking en credentials OAuth / workload) |
Superficie que vale la pena mirar con ojos de threat-model: ZipFile en skills (familia path/zip), s.exec en agent toolset (comando remoto / sandbox del agente), y parsers de stream. El resto del pack es, en buena parte, ruido de familia — igual que en Django/aws-cli. Oráculo 0/0 es esperado: no “aprobamos” repos ajenos.
Señal candidata (revisión, no CVE)
if zipfile.is_zipfile(archive_path):
with zipfile.ZipFile(archive_path) as zf:
infos = zf.infolist()
out, code = await s.exec(command, timeout=timeout)
Ruido que Claude debería marcar como FP / dudoso
re.compile→obj_rce_evalenagent_toolset.py(homonimia; mismo pedo que en aws-cli).setattr→obj_mass_assignmenten buffers de mensajes (patrón interno, no mass-assign HTTP).self.execute→obj_sqli_concaten memory tool (nombre de método ≠ SQL).- Capa1 CWE-1021 (clickjacking) sobre HTML en flujo OAuth de credentials — firma que a menudo es ruido de contexto.
El pack del smoke (28 tracks) es exactamente lo que pegarías en el IDE:
Claude vería ZipFile / s.exec / ruido re.compile y propondría lecturas.
El motor ya midió; Claude no reescanea el monorepo a ciegas.
Veredicto: por qué esto es el MVP cliente
El MVP no es “un LLM que audita solo”. Es el circuito corto:
np_fase_e_pack(o el JSON sanitizado) — contrato de entrada medible./np-tracks(y/np-firmaspara staging) — prompt de revisión con reglas R1.- Claude (u otro LLM del IDE) — propone; el humano cierra.
Staging firmas del pack existente: 45 candidatas, 43 listo_revision_humana,
2 pendiente_fixture, todas con detectar=null.
Eso es el producto hablando claro: hay propuesta de firma, no hay write al banco.
Si te llevas una frase: Claude es el revisor del pack Fase E en tu IDE — el motor midió aws-cli, Django, Metaflow y hasta un pedazo del SDK de Anthropic; el chat propone lectura; el banco espera al humano.
Packs existentes: fase_e_cliente_pack.json, fase_e_repos_reales_latest.json,
staging_firmas_cliente_pack.json.
Smoke nuevo (aislado): clone shallow + scan src/anthropic/lib/ →
artefactos en /tmp/np-fase-e-claude-smoke/cerebro/ (no desplegado, no mergeado al cerebro de fixtures).
Serie: caso agregado · Claude · aws-cli · Django · Metaflow · home