ember-memory-test/episodes/TRAZA_hallazgo-crtico-mega-hook-sshpy-no-pro_S20260518.R4_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD.md
Ember b91215ec63 feat(episode): TRAZA_hallazgo-crtico-mega-hook-sshpy-no-pro_S20260518.R4_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD
Skill: NONE | Type: troubleshooting
Summary: EPISODIO 4 — HANDOFF_PROMPT.md: 🔴 Hallazgo crítico — `mega-hook-ssh.py` no prote
2026-05-19 14:07:48 +00:00

2.8 KiB

episode_id puente_flat session_code acto_dialogico actor_flujo criticidad_aegis skill_dominante fase_proyecto tipo_semantico summary_one_line source_type trust_boundary created_at relectura_tagged forgejo_commit_sha
527c3ba0-a892-4a6a-908f-15edcbfd7838 TRAZA_hallazgo-crtico-mega-hook-sshpy-no-pro_S20260518.R4_XX.ops.2.hot_inf.in.cc.es.000.MGQ_J.PMCFK_E.SGNFD S20260518.PIPELINE_FIXES informar multi_actor low NONE operations troubleshooting EPISODIO 4 — HANDOFF_PROMPT.md: 🔴 Hallazgo crítico — `mega-hook-ssh.py` no protege el servid claude_code internal 2026-05-19T14:07:22.307728+00:00 false pending

El sondeo confirma la hipótesis — y el hallazgo es más grave de lo previsto.

🔴 Hallazgo crítico — mega-hook-ssh.py no protege el servidor

El guardián que protege el servidor MEMORIA de comandos destructivos NO los bloquea en la forma ssh HOST "..." — la forma idiomática y casi universal de ejecutar comandos remotos. Verificado empíricamente hoy ejecutando el hook real como subproceso (casbin-poc/probe_hook_behavior.py):

Comando (veredicto del hook real, hard_fact) Hook real Debería
ssh cx43 "rm -rf /tmp/cache" allow deny
ssh cx43 "git push --force origin main" allow deny
ssh cx43 "psql -c 'DROP TABLE users'" allow deny
ssh cx43 rm -rf /tmp/cache (sin comillas) deny ✓ deny
ssh cx43 "ls -la /home" (control seguro) allow ✓ allow

El hook solo funciona cuando el payload va sin comillas — forma que casi nadie usa. La forma estándar entre comillas lo elude por completo.

Causa raíz: el audit S20260510 (caso #4) añadió _is_inside_quotes() para frenar un over-trigger real (el hook bloqueaba sed/grep legítimos que mencionaban comandos destructivos dentro de literales de texto). La heurística — "si el patrón cae dentro de comillas, omítelo" — cuenta las comillas del string completo. Como todo comando SSH se escribe ssh HOST "payload", el payload entero queda tras la comilla de apertura → la heurística lo declara "dentro de comillas" → omite los 10 patrones destructivos. El parche curó los falsos positivos creando falsos negativos masivos. (Verificado con comillas dobles; el código cuenta también las simples → mismo efecto en ssh HOST 'payload' — inferido del código, no probado.)

Qué cambia para la Fase 5

Esto reencuadra la Fase 5 de raíz. El POC dio "216/216 verde" porque comparó Casbin contra hook_reference — los 10 patrones crudos, que es lo que el hook debería hacer. Es decir: el modelo Casbin del POC implementa el comportamiento correcto; el hook real es el que está roto. "Migración cero-regresión" ya no aplica — migrar fielmente el hook actual sería enshrinar el bug.