np_auditor ← volver
Caso de estudio · Claude · Fase E
2 de agosto, 2026 · pack cliente + smoke SDK · R1

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.

Léelo así

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í

En una frase

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

01
Motor (brain) mide Capa1 conocidos + cuarentena AST + cruce a objetivos Capa2. Store primero, analyze después. Sin exec del target.
02
Pack cliente (JSON sanitizado) fase_e_cliente_pack.json / staging firmas. Snippets cortos, estados, sin pedir escribir banco.
03
Claude propone lectura TP / FP / candidato / objetivo sugerido. Instrucción del pack: NO persistir al brain. NO escribir BANCO_FIRMAS.
04
Humano confirma Promoción Factor 1+2 al banco = decisión humana. Staging firmas lleva 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.

45Tracks en pack
43oraculo_pass
2match_objetivo
0CWE inventado

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.”

obj_cmd_injection · 0.9 client.py:37 · subprocess.run · q_cf82d51c3e4a match_objetivo
proc = subprocess.run(
    ["bash", str(script), *args],
    ...
Estado 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).
obj_ssrf · 0.8 client.py:65 · urllib.request.urlopen · q_629f135c66e8 match_objetivo
with urllib.request.urlopen(req, timeout=120) ...
Mismo archivo del bridge MCP. Match heurístico a SSRF; Claude debería preguntar quién controla la URL — no declarar “vuln confirmada”.
obj_rce_eval · 0.9 compile_exec.py:3 · compile · q_e33b4156353e oraculo_pass
def ejecutar_compile_vulnerable(codigo: str):
    ejecutar = exec
    ejecutar(compile(codigo, "<string>", "exec"))
Fixture propia: oráculo pasó (efecto + safe del objetivo). Aquí Claude ve un track “listo” hacia staging firmas — aún con 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):

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.

2Capa1 conocidos
28Cuarentena
12Match objetivo
16Candidatos nuevos
anthropic-sdk-python · lib/ · Fase E v2
MétricaValor
Scan pathsrc/anthropic/lib/ (sin types/)
Oráculo pass/fail0 / 0
Top objetivos (match)mass_assignment 3 · rce_eval 3 · sqli_concat 2 · header_crlf 2 · zip_slip 1 · cors_reflect 1
Capa1CWE-1021 ×2 (firma clickjacking en credentials OAuth / workload)
Impacto abstracto (sin PoC)

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)

obj_zip_slip · 0.8 _skills.py:121 · zipfile.ZipFile match_objetivo
if zipfile.is_zipfile(archive_path):
    with zipfile.ZipFile(archive_path) as zf:
        infos = zf.infolist()
Pregunta para Claude/humano: ¿hay contención de paths al extraer? Candidato estático, no exploit.
obj_rce_eval · 0.9 agent_toolset.py:514 · s.exec match_objetivo
out, code = await s.exec(command, timeout=timeout)
Superficie de ejecución en toolset de agente. El match dice “mira el trust boundary del comando”; no afirma RCE explotable en el SDK público.

Ruido que Claude debería marcar como FP / dudoso

Por qué este smoke encaja con el caso Claude

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:

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.

Datos usados en este artículo

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