Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
supply-chain-monitor — Monitor automatizado de seguridad en la cadena de suministro que consulta los registros PyPI y npm, compara las nuevas versiones con las anteriores y utiliza análisis mediante LLM para detectar cambios de código maliciosos con alertas en Slack. | Kitploit
Herramientas/GitHubGitHub/elastic/supply-chain-monitor
Análisis de VulnerabilidadesAnálisis de CódigoAnálisis de MalwareInteligencia de AmenazasSeguridad de Cadena de SuministroRespuesta a Incidentes
GitHubelastic/supply-chain-monitor

supply-chain-monitor

Monitor automatizado de seguridad en la cadena de suministro que consulta los registros PyPI y npm, compara las nuevas versiones con las anteriores y utiliza análisis mediante LLM para detectar cambios de código maliciosos con alertas en Slack.

Ver Repositorio
5296147hace 5 mesesRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Monitor de Cadena de Suministro

License: MIT

Monitoreo automatizado de los paquetes principales de PyPI y npm para detectar compromisos en la cadena de suministro. Consulta ambos registros en busca de nuevas versiones, compara cada versión con su predecesora y utiliza un LLM (a través de Cursor Agent CLI) para clasificar las diferencias como benignas o maliciosas. Los hallazgos maliciosos activan una alerta en Slack.

Ambos ecosistemas se monitorean de forma predeterminada. Use --no-pypi o --no-npm para desactivar uno.

Cómo Funciona

Cada ecosistema ejecuta su propio hilo de consulta, pero comparte la canalización de análisis y alertas.

root@kitploit:~
         ┌─── PyPI ──────────────────────┐   ┌─── npm ───────────────────────┐
         │                               │   │                               │
         │ changelog_since_serial()      │   │ CouchDB _changes feed         │
         │       │                       │   │       │                       │
         │       ▼                       │   │       ▼                       │
         │  ┌────────────┐               │   │  ┌────────────┐               │
         │  │ All PyPI   │─┐             │   │  │ All npm    │─┐             │
         │  │ events     │ │             │   │  │ changes    │ │             │
         │  └────────────┘ ▼             │   │  └────────────┘ ▼             │
         │ hugovk ──► Watchlist          │   │ download-counts ─► Watchlist  │
         │       │                       │   │       │                       │
         │ "new release" events only     │   │ new versions since last epoch │
         └───────────────┬───────────────┘   └───────────────┬───────────────┘
                         │                                   │
                         ▼                                   ▼
               ┌───────────────────┐               ┌───────────────────┐
               │ Download old + new│               │ Download old + new│
               │ (sdist + wheel)   │               │ (tarball)         │
               └───────────────────┘               └───────────────────┘
                         │                                   │
                         └─────────────────┬─────────────────┘
                                           ▼
                                   ┌───────────────┐
                                   │ Unified diff  │
                                   │ report (.md)  │
                                   └───────┬───────┘
                                           ▼
                                   ┌───────────────┐  ◄── LLM analysis
                                   │ Cursor Agent  │      (read-only)
                                   │ CLI (ask mode)│
                                   └───────┬───────┘
                                           │
                                       verdict?
                                           │
                                 malicious │
                                           ▼
                                   ┌───────────────┐
                                   │ Slack alert   │
                                   └───────────────┘

Objetivos de Detección

Se solicita al análisis del LLM buscar:

  • Código ofuscado (base64, exec, eval, XOR, cadenas codificadas)
  • Llamadas de red a hosts inesperados
  • Escrituras en el sistema de archivos en ubicaciones de inicio/persistencia
  • Creación de procesos y comandos de shell
  • Esteganografía u ocultación de datos en archivos multimedia
  • Exfiltración de credenciales y tokens
  • Indicadores de typosquatting

Prerrequisitos

  • Python 3.9+ — instale las dependencias de ejecución con pip install -r requirements.txt (la stdlib cubre la mayor parte de la herramienta; requests se usa para las subidas a Slack)
  • Cursor Agent CLI — el binario independiente agent, no el IDE

Instalación de Cursor Agent CLI

Windows (PowerShell):

root@kitploit:~
irm 'https://cursor.com/install?win32=true' | iex

macOS / Linux:

root@kitploit:~
curl https://cursor.com/install -fsS | bash

Verifique con:

root@kitploit:~
agent --version

Debe estar autenticado con Cursor (agent login o establecer CURSOR_API_KEY).

Configuración de Slack

Coloque su token de bot de Slack en etc/slack.json:

root@kitploit:~
{
    "url": "https://hooks.slack.com/services/...",
    "bot_token": "xoxb-...",
    "channel": "C01XXXXXXXX"
}

El bot necesita el ámbito chat:write en el canal de destino. El campo channel es el ID del canal de Slack donde se publican las alertas.

Inicio Rápido

root@kitploit:~
# Una sola ejecución: analizar versiones de los últimos ~10 minutos
python monitor.py --once

# Continuo: monitorear los 1000 paquetes principales (ambos ecosistemas), consultar cada 5 min
python monitor.py --top 1000 --interval 300

# Producción: monitorear los 15000 principales, alertar a Slack
python monitor.py --top 15000 --interval 300 --slack

# Solo npm, top 5000
python monitor.py --no-pypi --npm-top 5000

# Solo PyPI
python monitor.py --no-npm

Resumen de Archivos

ArchivoPropósito
monitor.pyOrquestador principal — consulta PyPI + npm, diff, analiza, alerta (hilos paralelos)
pypi_monitor.pyConsultor independiente de changelog de PyPI (usado para exploración)
package_diff.pyDescargar y comparar dos versiones de cualquier paquete de PyPI o npm
analyze_diff.pyEnviar un diff a Cursor Agent CLI, analizar el veredicto
top_pypi_packages.pyObtener y listar los N paquetes principales de PyPI por descargas
slack.pyCliente de API de Slack (SendMessage, PostFile)
etc/slack.jsonCredenciales del bot de Slack
last_serial.yamlEstado de consulta persistido (serial de PyPI + secuencia/época de npm)
logs/Archivos de registro diarios (monitor_YYYYMMDD.log)

Detalles de Uso

monitor.py — Orquestador Principal

root@kitploit:~
python monitor.py [OPCIONES]

Opciones:
  --top N          Número de paquetes principales a monitorear por ecosistema (predeterminado: 15000)
  --interval SECS  Intervalo de consulta en segundos (predeterminado: 300)
  --once           Una sola pasada sobre eventos recientes, luego salir
  --slack          Habilitar alertas de Slack para hallazgos maliciosos
  --model MODEL    Sobrescribir el modelo LLM (predeterminado: composer-2-fast)
  --debug          Habilitar registro DEBUG (incluye salida raw del agente)

Opciones de PyPI:
  --no-pypi        Deshabilitar monitoreo de PyPI
  --serial N       Serial del changelog de PyPI desde el que comenzar

Opciones de npm:
  --no-npm         Deshabilitar monitoreo de npm
  --npm-top N      N principales paquetes npm a monitorear (predeterminado: igual que --top)
  --npm-seq N      Secuencia de replicación npm desde la que comenzar

PyPI y npm se ejecutan cada uno en su propio hilo de consulta. El estado de consulta (serial de PyPI, secuencia + época de npm) se persiste en last_serial.yaml para que el monitor se reanude donde lo dejó después de un reinicio.

Canalización de PyPI:

  1. Carga los N paquetes principales del conjunto de datos hugovk/top-pypi-packages como lista de seguimiento
  2. Se conecta a la API XML-RPC de PyPI y obtiene el número de serial actual
  3. Cada --interval segundos, llama a changelog_since_serial() — una única llamada API que devuelve todos los eventos desde la última comprobación
  4. Filtra los eventos de "new release" que coinciden con la lista de seguimiento
  5. Para cada nueva versión: descarga las versiones antigua + nueva (sdist y wheel cuando ambas existen), diff, analiza a través del LLM y alerta a Slack si es malicioso

Canalización de npm:

  1. Carga los N paquetes principales del conjunto de datos download-counts (fallback a la API de búsqueda de npm)
  2. Lee la secuencia actual de replicación de CouchDB de replicate.npmjs.com
  3. Cada --interval segundos, obtiene el feed _changes de todos los cambios en el registro desde la última secuencia
  4. Filtra los paquetes cambiados contra la lista de seguimiento y verifica las versiones publicadas después de la última época de consulta
  5. Para cada nueva versión: descarga los tarballs antiguo + nuevo del registro npm, diff, analiza a través del LLM y alerta a Slack si es malicioso

Toda la salida se registra tanto en la consola como en logs/monitor_YYYYMMDD.log.

package_diff.py — Comparador de Paquetes

root@kitploit:~
# Comparar dos versiones de PyPI
python package_diff.py requests 2.31.0 2.32.0

# Comparar dos versiones de npm
python package_diff.py --npm express 4.18.2 4.19.0

# Guardar en archivo
python package_diff.py telnyx 2.0.0 2.1.0 -o telnyx_diff.md

# Comparar archivos locales
python package_diff.py --local old.tar.gz new.tar.gz -n mypackage

Las descargas se realizan directamente a través de las API del registro (API JSON de PyPI / registro npm), no con pip o npm. Esto significa:

  • Sin dependencia de pip/npm para las descargas
  • Independiente de la plataforma — puede descargar y comparar paquetes solo para Linux desde Windows
  • PyPI: prefiere wheel (Python puro cuando está disponible), fallback a sdist
  • npm: descarga tarballs directamente del registro

analyze_diff.py — Veredicto del LLM

root@kitploit:~
# Analizar un archivo diff
python analyze_diff.py telnyx_diff.md

# Salida JSON
python analyze_diff.py telnyx_diff.md --json

# Usar un modelo específico
python analyze_diff.py telnyx_diff.md --model claude-4-opus

Ejecuta Cursor Agent CLI en modo --mode ask (solo lectura) con --trust. El agente lee el archivo diff y devuelve un veredicto estructurado.

Códigos de salida: 0 = benigno, 1 = malicioso, 2 = desconocido/error.

pypi_monitor.py — Consultor Independiente

root@kitploit:~
# Ver qué se está publicando ahora mismo (últimos ~10 min)
python pypi_monitor.py --once --top 15000

# Monitoreo continuo (solo salida en consola, sin análisis)
python pypi_monitor.py --top 1000 --interval 120

Útil para explorar la velocidad de publicación de PyPI o depurar la API de changelog sin ejecutar la canalización completa de análisis.

top_pypi_packages.py — Rankings de Paquetes

root@kitploit:~
# Imprimir los 1000 paquetes principales
python top_pypi_packages.py
root@kitploit:~
# Usar como biblioteca
from top_pypi_packages import fetch_top_packages
packages = fetch_top_packages(top_n=500)
# [{"project": "boto3", "download_count": 1577565199}, ...]

Fuentes de Datos

FuenteQuéLímites de Tasa
hugovk/top-pypi-packages15,000 paquetes PyPI principales por descargas en 30 días (JSON mensual)Ninguno (archivo estático)
PyPI XML-RPC changelog_since_serial()Flujo de eventos en tiempo real de PyPIObsoleto pero funcional; 1 llamada por consulta es suficiente
PyPI JSON APIMetadatos del paquete, historial de versiones, URLs de descargaGeneroso; utilizado con moderación (1 llamada por versión)
download-counts (nice-registry)Recuentos de descargas mensuales para cada paquete npm (counts.json)Ninguno (tarball npm)
npm CouchDB replication _changes feedFlujo de cambios del registro npm en tiempo realPúblico; lecturas paginadas
npm registry APIPackuments de paquetes, descargas de tarballsGeneroso; utilizado con moderación

El monitor realiza 1 llamada API por intervalo de consulta por ecosistema (changelog de PyPI / _changes de npm), más 2-3 llamadas por nueva versión (historial de versiones + descargas). Esto es muy ligero.

Ejemplos de Alertas

Cuando el monitor detecta una versión maliciosa, publica en Slack:

PyPI:

root@kitploit:~
🚨 Alerta de Cadena de Suministro: telnyx 4.87.2

Rank: #5,481 de paquetes PyPI principales
Veredicto: MALICIOUS
PyPI: https://pypi.org/project/telnyx/4.87.2/

Resumen del análisis (truncado):
Los cambios en src/telnyx/_client.py implementan un comportamiento
de descarga-descifrado-ejecución ofuscado y efectos secundarios de
importación de módulos. Una función _d() decodifica cadenas base64,
un blob masivo _p contiene un script de exfiltración que descarga
un archivo .wav de http://83.142.209.203:8080/ringtone.wav y extrae
una carga útil oculta mediante esteganografía...

npm:

root@kitploit:~
🚨 Alerta de Cadena de Suministro: axios 0.30.4

Rank: #42 de paquetes npm principales
Veredicto: MALICIOUS
npm: https://www.npmjs.com/package/axios/v/0.30.4

Resumen del análisis (truncado):
1. **Dependencia no estándar** — El bloque `dependencies` incluye `plain-crypto-js`. axios publicado solo depende de `follow-redirects`, `form-data` y `proxy-from-env`. Un cuarto paquete cuyo nombre parece un **typosquat al estilo de `crypto-js`** es un signo clásico de un paquete manipulado o falso, no de una versión normal de axios.

Limitaciones

  • Las versiones se analizan secuencialmente dentro del hilo de cada ecosistema. Durante un alto volumen de publicaciones, habrá un retraso en el procesamiento.
  • Cursor Agent CLI requerido — el análisis depende de una suscripción activa de Cursor y de que el CLI agent esté autenticado.
  • Modo sandbox (aislamiento del sistema de archivos) solo está disponible en macOS/Linux. En Windows, el agente se ejecuta en modo ask de solo lectura pero sin aislamiento a nivel de sistema operativo.
  • Las listas de seguimiento son estáticas — se cargan una vez al inicio desde los conjuntos de datos hugovk (PyPI) y download-counts (npm). Reinicie para actualizar.
  • Protección contra brechas en _changes de npm — si la secuencia npm guardada se queda más de 10,000 cambios por detrás de la cabeza del registro, el monitor se reinicia desde la cabeza para evitar una larga puesta al día. Las versiones durante la brecha se pierden.

Registro

Los registros se escriben tanto en stdout como en logs/monitor_YYYYMMDD.log. Se crea un nuevo archivo cada día. Ambos ecosistemas registran en el mismo archivo, con las líneas npm prefijadas [npm]. Ejemplo:

root@kitploit:~
2026-03-27 12:01:15 [INFO] Fetching top 15,000 packages from hugovk dataset...
2026-03-27 12:01:16 [INFO] Watchlist loaded: 15,000 packages (dataset updated 2026-03-01 07:34:08)
2026-03-27 12:01:16 [INFO] Fetching top 15,000 npm packages from download-counts dataset...
2026-03-27 12:01:18 [INFO] npm watchlist loaded: 15,000 packages (download-counts 1.0.52)
2026-03-27 12:01:19 [INFO] [pypi] Starting serial: 35,542,068 (from last_serial.yaml) — polling every 300s
2026-03-27 12:01:19 [INFO] [npm] Starting seq: 42,817,503 (from last_serial.yaml) — polling every 300s
2026-03-27 12:06:18 [INFO] [pypi] 2 new watchlist releases detected (serial 35,542,068 -> 35,542,190)
2026-03-27 12:06:18 [INFO] [pypi] Processing fast-array-utils 1.4 (rank #8,231)...
2026-03-27 12:06:18 [INFO] [pypi] Diffing fast-array-utils 1.3 -> 1.4
2026-03-27 12:06:50 [INFO] [pypi] Analyzing diff for fast-array-utils...
2026-03-27 12:07:35 [INFO] [pypi] Verdict for fast-array-utils 1.4: BENIGN
2026-03-27 12:06:20 [INFO] [npm] 1 new watchlist releases detected (seq -> 42,817,612)
2026-03-27 12:06:20 [INFO] [npm] Processing axios 0.30.4 (rank #42)...
2026-03-27 12:06:21 [INFO] [npm] Diffing axios 0.30.3 -> 0.30.4
2026-03-27 12:07:01 [INFO] [npm] Analyzing diff for axios...
2026-03-27 12:07:45 [INFO] [npm] Verdict for axios 0.30.4: MALICIOUS

Contribuciones, comunidad y licencia

Este proyecto está bajo la Licencia MIT. Las fuentes de datos y avisos de terceros se resumen en NOTICE.txt.

Las contribuciones son bienvenidas — consulte CONTRIBUTING.md. Este repositorio sigue el Contributor Covenant. Reporte problemas de seguridad a través de SECURITY.md, no en issues públicos.

Preguntas y discusión: Comunidad Elastic en Slack.

Descargar herramienta