Skill: NONE | Type: troubleshooting
Summary: EPISODIO 4 — HANDOFF_PROMPT.md: 🔴 Hallazgo crítico — `mega-hook-ssh.py` no prote
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.