GitHub Security Audit — Evaluación de Riesgo para Repos
Auditoría sistemática de repositorios GitHub antes de integrarlos en un stack de producción
o recomendarlos a clientes. Inspirada en los frameworks de Trail of Bits
(supply-chain-risk-auditor, insecure-defaults, sharp-edges) pero adaptada a un flujo
agéntico MCP-first.
Filosofía
NO evalúes repos con intuición. Evalúa con datos.
NO busques razones para adoptarlo. Busca razones para NO adoptarlo.
Si no encuentras razones para rechazarlo, entonces puede entrar.
Regla de oro: Un repo que resuelve un problema que tu stack ya cubre
NO aporta valor, independientemente de su calidad. Evaluamos primero
si hay necesidad real antes de gastar tiempo en el análisis completo.
Dos modos de ejecución
| Modo |
Comando |
Bloques |
Tool calls |
Uso |
| Completo |
audit repo <url> |
7 fases |
10-20 |
Evaluación integral pre-integración |
| Quick |
audit repo quick <url> |
Fases 0+1+2 |
5-8 |
Descarte rápido o primera impresión |
PASO 0 — Gate de Necesidad (OBLIGATORIO, antes de CUALQUIER análisis)
Antes de analizar seguridad, responder:
- ¿Qué problema resuelve este repo? (definir en una frase)
- ¿Está ese problema ya cubierto en el stack actual? (MCPs, skills, herramientas)
- ¿Aporta capacidad genuinamente nueva?
Si la respuesta a (2) es SÍ y a (3) es NO → VEREDICTO: SKIP — no continuar.
Informar al usuario con la justificación y sugerir la herramienta existente.
Si hay duda razonable o el usuario insiste → continuar con Fase 1.
FASE 1 — Salud del Proyecto
Fuentes: web_fetch del repo GitHub, GitHub API vía web_fetch.
Recopilar:
| Métrica |
Cómo obtenerla |
Umbral VERDE |
Umbral ROJO |
| Stars |
Página del repo |
>500 |
<50 |
| Forks |
Página del repo |
>50 |
<5 |
| Issues abiertos vs cerrados |
Tabs del repo |
Ratio cierre >60% |
<30% |
| Último commit |
Página de commits |
<30 días |
>180 días |
| Contributors |
Tab contributors |
>5 |
1 (bus factor) |
| Releases |
Tab releases |
Versionado semántico |
Sin releases |
| README calidad |
Contenido |
Docs completas, ejemplos |
Sin README o stub |
| CI/CD |
GitHub Actions / badges |
Tests automáticos |
Sin CI |
Scoring: Cada métrica 0-10, peso total = 20% del scoring final.
Consultar references/health-scoring.md para tabla de puntuación detallada.
FASE 2 — Seguridad del Código
Fuentes: web_fetch de archivos clave del repo.
2.1 Análisis estático (sin ejecutar código)
Revisar vía web_fetch:
- Secrets hardcodeados: buscar en código fuente patrones de API keys, tokens, passwords
(
password =, api_key =, secret, token, .env committeados)
- Dependencias conocidas vulnerables: revisar
package.json, requirements.txt,
Cargo.toml, go.mod — cruzar versiones con CVEs conocidos vía web_search
- Permisos excesivos: en GitHub Actions workflows (
.github/workflows/*.yml),
buscar permissions: write-all, pull_request_target, secrets en PRs de forks
- Ejecución dinámica peligrosa:
eval(), exec(), subprocess.call(shell=True),
dangerouslySetInnerHTML, innerHTML, deserialization no segura
- Configuración insegura por defecto: siguiendo el patrón de Trail of Bits
insecure-defaults — ¿el repo funciona de forma insegura si no configuras nada?
2.2 Dependencias transitivas
- ¿Cuántas dependencias directas tiene?
- ¿Hay dependencias con un solo maintainer?
- ¿Hay dependencias que hayan sido comprometidas anteriormente?
Scoring: 0-10, peso = 25% del scoring final.
Consultar references/security-patterns.md para checklist completo.
FASE 3 — Supply Chain
Fuentes: web_search perfil del maintainer, historial del repo.
| Señal |
VERDE |
ROJO |
| Maintainer(s) identificables |
Persona/org real, historial público |
Cuenta nueva, sin historial |
| Organización respaldada |
Empresa conocida, funding |
Anónimo, sin contexto |
| Historial de seguridad |
Vulnerabilidades parcheadas rápido |
CVEs abiertos, sin respuesta |
| Publicación en registros oficiales |
npm/PyPI con 2FA, verified publisher |
Sin publicación oficial |
| Code review en PRs |
PRs revisados antes de merge |
Push directo a main |
| SECURITY.md |
Existe con disclosure policy |
No existe |
| Firmado de commits/releases |
GPG signatures |
Sin firmar |
Scoring: 0-10, peso = 20% del scoring final.
Consultar references/supply-chain-signals.md para análisis detallado.
FASE 4 — Calidad de Código
Fuentes: web_fetch de archivos representativos.
- Test coverage: ¿Mencionado en README/CI? ¿Qué porcentaje?
- Type hints / tipos estáticos: ¿Usa tipado?
- Documentación de API: ¿Docstrings/JSDoc/rustdoc?
- Arquitectura: ¿Modular o monolítico? ¿Separación de concerns?
- Error handling: ¿Try/catch genéricos o manejo específico?
- Logging: ¿Tiene logging estructurado?
Scoring: 0-10, peso = 10% del scoring final.
FASE 5 — Licencia y Compatibilidad Legal
Fuentes: web_fetch del archivo LICENSE.
| Licencia |
Compatibilidad general |
Notas |
| MIT, BSD-2, BSD-3 |
✅ Total |
Sin restricciones |
| Apache-2.0 |
✅ Total |
Cláusula de patentes favorable |
| CC-BY-4.0, CC-BY-SA-4.0 |
⚠️ Parcial |
OK para skills/docs, no para código |
| GPL-2.0, GPL-3.0 |
⚠️ Condicional |
Copyleft — evaluar si es dependencia o integración |
| AGPL-3.0 |
❌ Alto riesgo |
Copyleft de red — afecta SaaS |
| SSPL, BSL, propietaria |
❌ No usar |
Restricciones comerciales |
| Sin licencia |
❌ No usar |
Copyright por defecto, sin permisos |
Scoring: 0-10, peso = 10% del scoring final.
FASE 6 — Superficie de Ataque MCP/Plugin/Skill
Aplica cuando: el repo es un MCP server, plugin de Claude Code, skill, herramienta
de integración, o cualquier software que se ejecute con acceso a datos de clientes.
Inspirado en Trail of Bits agentic-actions-auditor y sharp-edges.
Checklist MCP/Plugin
Racionalizaciones a Rechazar
(Inspirado en Trail of Bits "Rationalizations to Reject")
- "Es open source, así que es seguro" → NO. Open source ≠ auditado.
- "Tiene muchas stars" → NO. Stars miden popularidad, no seguridad.
- "Lo usa empresa X" → NO. A menos que empresa X haya hecho auditoría pública.
- "Es solo lectura" → VERIFICAR. ¿Realmente? ¿No escribe logs, caché, temp files?
- "Solo lo usaré internamente" → NO reduce el riesgo si toca datos de clientes.
- "El maintainer parece confiable" → VERIFICAR con datos, no con sensación.
Scoring: 0-10, peso = 15% del scoring final (0% si no aplica, redistribuido).
FASE 7 — Señales de Confianza Externas
Fuentes: web_search.
- ¿Ha sido mencionado en publicaciones de seguridad? (positiva o negativamente)
- ¿Tiene auditorías de terceros?
- ¿Aparece en listas curadas de calidad? (awesome-X, Trail of Bits skills-curated)
- ¿Ha sido reportado como malicioso en algún momento?
- ¿Tiene programa de bug bounty o SECURITY.md?
Scoring: 0-10, peso = bonus (no resta, solo suma hasta +5 puntos al total).
Cálculo de Scoring Final
SCORE = (F1 × 0.20) + (F2 × 0.25) + (F3 × 0.20) + (F4 × 0.10) + (F5 × 0.10) + (F6 × 0.15) + bonus_F7
Si F6 no aplica:
SCORE = (F1 × 0.24) + (F2 × 0.29) + (F3 × 0.23) + (F4 × 0.12) + (F5 × 0.12) + bonus_F7
Veredicto
| Score |
Veredicto |
Acción |
| ≥7.5 |
ADOPT 🟢 |
Integrar con confianza. Monitorizar actualizaciones. |
| 5.0–7.4 |
EVALUATE 🟡 |
Integrar con precauciones. Documentar riesgos aceptados. Revisar en 90 días. |
| 3.0–4.9 |
CAUTION 🟠 |
Solo si no hay alternativa. Aislar. Auditoría profunda antes de producción. |
| <3.0 |
AVOID 🔴 |
No integrar. Buscar alternativa. |
Override rules (anulan el scoring numérico)
- Sin licencia → AVOID automático
- AGPL/SSPL → AVOID automático (salvo uso interno sin SaaS)
- Secrets hardcodeados en el repo → AVOID automático
- Único maintainer + último commit >1 año → CAUTION máximo
- Ejecución dinámica no sanitizada en MCP → AVOID automático
Entregable
Generar un informe HTML interactivo con:
- Header: Nombre del repo, URL, fecha, veredicto con badge de color
- Resumen ejecutivo: 3-5 frases con hallazgos clave
- Radar chart: Las 7 dimensiones en gráfico radial (o 6 si F6 no aplica)
- Detalle por fase: Tabla con métricas, valores encontrados, scoring
- Hallazgos críticos: Lista de issues que requieren atención (si los hay)
- Racionalizaciones rechazadas: Si durante el análisis se detectaron
- Veredicto final: Score + veredicto + acción recomendada
- Comparativa stack: ¿Qué herramienta actual cubre funcionalidad similar?
Guardar en el directorio de trabajo/output.
Limitaciones
Declarar estas limitaciones al entregar el informe:
- No ejecuta código ni descubre vulnerabilidades desconocidas. No es análisis
estático ni pentest. Analiza lo publicado: código, manifiestos, workflows, licencia,
historial. Una puerta trasera escrita para parecer código normal no se detecta así.
- No sustituye revisión humana cuando el repo va a tocar datos sensibles. El score
prioriza dónde mirar; no autoriza a no mirar.
- El score refleja el repo el día en que se midió. Recomendar re-ejecución antes
de decisiones importantes.
Cuándo usar
- Antes de integrar cualquier repo/librería/MCP/plugin/skill al stack
- Cuando un cliente pregunte sobre la seguridad de una herramienta
- Cuando evalúes una dependencia nueva para un proyecto
- Cuando el usuario comparta un enlace a GitHub preguntando si usarlo
- Para auditar MCPs o skills de terceros antes de instalarlos
Cuándo NO usar
- Para auditorías SEO de sitios web
- Para análisis de código propio (usar tu workflow de dev/test)
- Para crear skills nuevos
- Para evaluar herramientas que no son open source / no tienen repo público
Referencias
Consultar bajo demanda:
references/health-scoring.md — Tabla detallada de scoring por métrica de salud
references/security-patterns.md — Checklist completo de patrones de seguridad
references/supply-chain-signals.md — Framework de evaluación de supply chain
1---2name: github-security-audit-23description: Auditoría de seguridad para repositorios GitHub antes de integrarlos en tu stack. 7 dimensiones: salud del proyecto, seguridad del código, supply chain, calidad, licencia, superficie MCP/plugin y señales de confianza externas. Scoring ponderado con veredicto ADOPT/EVALUATE/CAUTION/AVOID e informe HTML. Inspirado en los frameworks de Trail of Bits (supply-chain-risk-auditor, insecure-defaults). Actívalo con: auditoría repo, audit repo, seguridad repo, analizar repo, evaluar repo, evaluar librería, evaluar herramienta, review repo, supply chain, repo seguro, debería usar este repo, evaluar dependencia, es seguro este repo, security audit github, repo risk, evaluar MCP server, evaluar plugin, evaluar skill, evaluar integración. También cuando el usuario comparta un enlace a GitHub y pregunte si integrarlo. NO activar para análisis de código propio ni auditorías SEO.4---56# GitHub Security Audit — Evaluación de Riesgo para Repos78Auditoría sistemática de repositorios GitHub antes de integrarlos en un stack de producción9o recomendarlos a clientes. Inspirada en los frameworks de Trail of Bits10(supply-chain-risk-auditor, insecure-defaults, sharp-edges) pero adaptada a un flujo11agéntico MCP-first.1213## Filosofía1415```16NO evalúes repos con intuición. Evalúa con datos.17NO busques razones para adoptarlo. Busca razones para NO adoptarlo.18Si no encuentras razones para rechazarlo, entonces puede entrar.19```2021**Regla de oro**: Un repo que resuelve un problema que tu stack ya cubre22NO aporta valor, independientemente de su calidad. Evaluamos primero23si hay necesidad real antes de gastar tiempo en el análisis completo.2425---2627## Dos modos de ejecución2829| Modo | Comando | Bloques | Tool calls | Uso |30|------|---------|---------|------------|-----|31| **Completo** | `audit repo <url>` | 7 fases | 10-20 | Evaluación integral pre-integración |32| **Quick** | `audit repo quick <url>` | Fases 0+1+2 | 5-8 | Descarte rápido o primera impresión |3334---3536## PASO 0 — Gate de Necesidad (OBLIGATORIO, antes de CUALQUIER análisis)3738Antes de analizar seguridad, responder:39401. **¿Qué problema resuelve este repo?** (definir en una frase)412. **¿Está ese problema ya cubierto en el stack actual?** (MCPs, skills, herramientas)423. **¿Aporta capacidad genuinamente nueva?**4344Si la respuesta a (2) es SÍ y a (3) es NO → **VEREDICTO: SKIP** — no continuar.45Informar al usuario con la justificación y sugerir la herramienta existente.4647Si hay duda razonable o el usuario insiste → continuar con Fase 1.4849---5051## FASE 1 — Salud del Proyecto5253**Fuentes**: web_fetch del repo GitHub, GitHub API vía web_fetch.5455Recopilar:5657| Métrica | Cómo obtenerla | Umbral VERDE | Umbral ROJO |58|---------|---------------|--------------|-------------|59| Stars | Página del repo | >500 | <50 |60| Forks | Página del repo | >50 | <5 |61| Issues abiertos vs cerrados | Tabs del repo | Ratio cierre >60% | <30% |62| Último commit | Página de commits | <30 días | >180 días |63| Contributors | Tab contributors | >5 | 1 (bus factor) |64| Releases | Tab releases | Versionado semántico | Sin releases |65| README calidad | Contenido | Docs completas, ejemplos | Sin README o stub |66| CI/CD | GitHub Actions / badges | Tests automáticos | Sin CI |6768**Scoring**: Cada métrica 0-10, peso total = 20% del scoring final.6970Consultar `references/health-scoring.md` para tabla de puntuación detallada.7172---7374## FASE 2 — Seguridad del Código7576**Fuentes**: web_fetch de archivos clave del repo.7778### 2.1 Análisis estático (sin ejecutar código)7980Revisar vía web_fetch:8182- **Secrets hardcodeados**: buscar en código fuente patrones de API keys, tokens, passwords83 (`password =`, `api_key =`, `secret`, `token`, `.env` committeados)84- **Dependencias conocidas vulnerables**: revisar `package.json`, `requirements.txt`,85 `Cargo.toml`, `go.mod` — cruzar versiones con CVEs conocidos vía web_search86- **Permisos excesivos**: en GitHub Actions workflows (`.github/workflows/*.yml`),87 buscar `permissions: write-all`, `pull_request_target`, secrets en PRs de forks88- **Ejecución dinámica peligrosa**: `eval()`, `exec()`, `subprocess.call(shell=True)`,89 `dangerouslySetInnerHTML`, `innerHTML`, deserialization no segura90- **Configuración insegura por defecto**: siguiendo el patrón de Trail of Bits91 insecure-defaults — ¿el repo funciona de forma insegura si no configuras nada?9293### 2.2 Dependencias transitivas9495- ¿Cuántas dependencias directas tiene?96- ¿Hay dependencias con un solo maintainer?97- ¿Hay dependencias que hayan sido comprometidas anteriormente?9899**Scoring**: 0-10, peso = 25% del scoring final.100101Consultar `references/security-patterns.md` para checklist completo.102103---104105## FASE 3 — Supply Chain106107**Fuentes**: web_search perfil del maintainer, historial del repo.108109| Señal | VERDE | ROJO |110|-------|-------|------|111| Maintainer(s) identificables | Persona/org real, historial público | Cuenta nueva, sin historial |112| Organización respaldada | Empresa conocida, funding | Anónimo, sin contexto |113| Historial de seguridad | Vulnerabilidades parcheadas rápido | CVEs abiertos, sin respuesta |114| Publicación en registros oficiales | npm/PyPI con 2FA, verified publisher | Sin publicación oficial |115| Code review en PRs | PRs revisados antes de merge | Push directo a main |116| SECURITY.md | Existe con disclosure policy | No existe |117| Firmado de commits/releases | GPG signatures | Sin firmar |118119**Scoring**: 0-10, peso = 20% del scoring final.120121Consultar `references/supply-chain-signals.md` para análisis detallado.122123---124125## FASE 4 — Calidad de Código126127**Fuentes**: web_fetch de archivos representativos.128129- **Test coverage**: ¿Mencionado en README/CI? ¿Qué porcentaje?130- **Type hints / tipos estáticos**: ¿Usa tipado?131- **Documentación de API**: ¿Docstrings/JSDoc/rustdoc?132- **Arquitectura**: ¿Modular o monolítico? ¿Separación de concerns?133- **Error handling**: ¿Try/catch genéricos o manejo específico?134- **Logging**: ¿Tiene logging estructurado?135136**Scoring**: 0-10, peso = 10% del scoring final.137138---139140## FASE 5 — Licencia y Compatibilidad Legal141142**Fuentes**: web_fetch del archivo LICENSE.143144| Licencia | Compatibilidad general | Notas |145|----------|---------------------|-------|146| MIT, BSD-2, BSD-3 | ✅ Total | Sin restricciones |147| Apache-2.0 | ✅ Total | Cláusula de patentes favorable |148| CC-BY-4.0, CC-BY-SA-4.0 | ⚠️ Parcial | OK para skills/docs, no para código |149| GPL-2.0, GPL-3.0 | ⚠️ Condicional | Copyleft — evaluar si es dependencia o integración |150| AGPL-3.0 | ❌ Alto riesgo | Copyleft de red — afecta SaaS |151| SSPL, BSL, propietaria | ❌ No usar | Restricciones comerciales |152| Sin licencia | ❌ No usar | Copyright por defecto, sin permisos |153154**Scoring**: 0-10, peso = 10% del scoring final.155156---157158## FASE 6 — Superficie de Ataque MCP/Plugin/Skill159160**Aplica cuando**: el repo es un MCP server, plugin de Claude Code, skill, herramienta161de integración, o cualquier software que se ejecute con acceso a datos de clientes.162163Inspirado en Trail of Bits agentic-actions-auditor y sharp-edges.164165### Checklist MCP/Plugin166167- [ ] ¿Qué permisos pide? (filesystem, red, env vars, secrets)168- [ ] ¿Envía datos a terceros? (telemetría, analytics, APIs externas)169- [ ] ¿Almacena datos localmente? ¿Dónde? ¿Cifrado?170- [ ] ¿Tiene hooks que se ejecuten automáticamente? (pre/post tool use)171- [ ] ¿El código del MCP server es auditable? ¿O es un binario/servicio remoto?172- [ ] ¿Usa `eval()`, `exec()` o ejecución dinámica de código proporcionado por el usuario?173- [ ] ¿Valida inputs del LLM antes de ejecutar? (prompt injection surface)174- [ ] ¿Tiene rate limiting?175- [ ] ¿Qué pasa si falla? (fail-open vs fail-secure)176177### Racionalizaciones a Rechazar178179(Inspirado en Trail of Bits "Rationalizations to Reject")180181- "Es open source, así que es seguro" → NO. Open source ≠ auditado.182- "Tiene muchas stars" → NO. Stars miden popularidad, no seguridad.183- "Lo usa empresa X" → NO. A menos que empresa X haya hecho auditoría pública.184- "Es solo lectura" → VERIFICAR. ¿Realmente? ¿No escribe logs, caché, temp files?185- "Solo lo usaré internamente" → NO reduce el riesgo si toca datos de clientes.186- "El maintainer parece confiable" → VERIFICAR con datos, no con sensación.187188**Scoring**: 0-10, peso = 15% del scoring final (0% si no aplica, redistribuido).189190---191192## FASE 7 — Señales de Confianza Externas193194**Fuentes**: web_search.195196- ¿Ha sido mencionado en publicaciones de seguridad? (positiva o negativamente)197- ¿Tiene auditorías de terceros?198- ¿Aparece en listas curadas de calidad? (awesome-X, Trail of Bits skills-curated)199- ¿Ha sido reportado como malicioso en algún momento?200- ¿Tiene programa de bug bounty o SECURITY.md?201202**Scoring**: 0-10, peso = bonus (no resta, solo suma hasta +5 puntos al total).203204---205206## Cálculo de Scoring Final207208```209SCORE = (F1 × 0.20) + (F2 × 0.25) + (F3 × 0.20) + (F4 × 0.10) + (F5 × 0.10) + (F6 × 0.15) + bonus_F7210211Si F6 no aplica:212SCORE = (F1 × 0.24) + (F2 × 0.29) + (F3 × 0.23) + (F4 × 0.12) + (F5 × 0.12) + bonus_F7213```214215### Veredicto216217| Score | Veredicto | Acción |218|-------|-----------|--------|219| ≥7.5 | **ADOPT** 🟢 | Integrar con confianza. Monitorizar actualizaciones. |220| 5.0–7.4 | **EVALUATE** 🟡 | Integrar con precauciones. Documentar riesgos aceptados. Revisar en 90 días. |221| 3.0–4.9 | **CAUTION** 🟠 | Solo si no hay alternativa. Aislar. Auditoría profunda antes de producción. |222| <3.0 | **AVOID** 🔴 | No integrar. Buscar alternativa. |223224### Override rules (anulan el scoring numérico)225226- Sin licencia → **AVOID** automático227- AGPL/SSPL → **AVOID** automático (salvo uso interno sin SaaS)228- Secrets hardcodeados en el repo → **AVOID** automático229- Único maintainer + último commit >1 año → **CAUTION** máximo230- Ejecución dinámica no sanitizada en MCP → **AVOID** automático231232---233234## Entregable235236Generar un informe HTML interactivo con:2372381. **Header**: Nombre del repo, URL, fecha, veredicto con badge de color2392. **Resumen ejecutivo**: 3-5 frases con hallazgos clave2403. **Radar chart**: Las 7 dimensiones en gráfico radial (o 6 si F6 no aplica)2414. **Detalle por fase**: Tabla con métricas, valores encontrados, scoring2425. **Hallazgos críticos**: Lista de issues que requieren atención (si los hay)2436. **Racionalizaciones rechazadas**: Si durante el análisis se detectaron2447. **Veredicto final**: Score + veredicto + acción recomendada2458. **Comparativa stack**: ¿Qué herramienta actual cubre funcionalidad similar?246247Guardar en el directorio de trabajo/output.248249---250251## Limitaciones252253Declarar estas limitaciones al entregar el informe:254255- **No ejecuta código ni descubre vulnerabilidades desconocidas.** No es análisis256 estático ni pentest. Analiza lo publicado: código, manifiestos, workflows, licencia,257 historial. Una puerta trasera escrita para parecer código normal no se detecta así.258- **No sustituye revisión humana** cuando el repo va a tocar datos sensibles. El score259 prioriza dónde mirar; no autoriza a no mirar.260- **El score refleja el repo el día en que se midió.** Recomendar re-ejecución antes261 de decisiones importantes.262263---264265## Cuándo usar266267- Antes de integrar cualquier repo/librería/MCP/plugin/skill al stack268- Cuando un cliente pregunte sobre la seguridad de una herramienta269- Cuando evalúes una dependencia nueva para un proyecto270- Cuando el usuario comparta un enlace a GitHub preguntando si usarlo271- Para auditar MCPs o skills de terceros antes de instalarlos272273## Cuándo NO usar274275- Para auditorías SEO de sitios web276- Para análisis de código propio (usar tu workflow de dev/test)277- Para crear skills nuevos278- Para evaluar herramientas que no son open source / no tienen repo público279280---281282## Referencias283284Consultar bajo demanda:285286- `references/health-scoring.md` — Tabla detallada de scoring por métrica de salud287- `references/security-patterns.md` — Checklist completo de patrones de seguridad288- `references/supply-chain-signals.md` — Framework de evaluación de supply chain