Un repositorio trampa con 1774 estrellas: dos filtros para detectar malware y alucinaciones

Cada mañana un bot le envía al autor cinco repositorios en tendencia de trendshift.io con un resumen del README. El 26 de septiembre, en el feed apareció el proyecto «Microsoft Activation Scripts» con 1774 estrellas — resultó ser una trampa. La cuenta del propietario se creó 94 segundos antes del repositorio, y el comando de instalación contenía malware disfrazado a través de PowerShell, donde la dirección de descarga estaba escrita al revés. Tras analizar los 321 repositorios enviados por el bot entre el 15 de julio y el 8 de octubre, el autor descubrió que los filtros obvios son inefectivos. Comprobar instalaciones del tipo «descarga y ejecuta de inmediato» habría descartado uno de cada ocho proyectos legítimos. En su lugar, el autor creó dos indicadores independientes, cada uno suficiente por sí solo para bloquear. • **lure-check**: detecta comandos de instalación disfrazados (cadenas invertidas mediante -join, base64, ejecución oculta vía mshta/certutil/bitsadmin) y cuentas de usar y tirar (creadas menos de 30 días antes del repo, con menos de 10 KB de código) • **ground-check**: verifica alucinaciones de DeepSeek, descartando palabras con mayúscula inicial y números que no están en la fuente • Ambas herramientas se distribuyen como repositorios MIT independientes; ground-check incluye pruebas sobre 303 resúmenes reales

Procesado por IA desde Habr AI; editado por Hamidun News
Un repositorio trampa con 1774 estrellas: dos filtros para detectar malware y alucinaciones
Fuente: Habr AI. Collage: Hamidun News.
Escuchar artículo
Ficha técnica y cifras clave
ParámetroDatos
Fuente originalHabr AI ↗
Editor jefe
Ground-checkverifica alucinaciones de DeepSeek, descartando palabras con mayúscula inicial y números que no están en la fuente
Dato clave #2Ambas herramientas se distribuyen como repositorios MIT independientes; ground-check incluye pruebas sobre 303 resúmenes reales
Dato clave #3Cadena invertida mediante `-join"…"[-1..` e `iex(irm(…))` con una dirección calculada

Una trampa con 1774 estrellas

Cada mañana, un bot de Telegram le envía al autor cinco repositorios en tendencia de GitHub tomados de trendshift.io. Debajo de cada uno hay un botón que, al pulsarlo, hace que el bot muestre un resumen del README para un análisis rápido. El autor lee este feed a diario y, de vez en cuando, marca con «me gusta» los proyectos que le interesan.

El 26 de septiembre apareció en el feed un repo llamado «Microsoft Activation Scripts» con 1774 estrellas, una descripción cuidada y etiquetas. El bot lo presentó junto a otros cuatro proyectos — y resultó ser una trampa. El repositorio tiene un solo archivo README, y la cuenta del propietario se creó 94 segundos antes del repo.

El comando de instalación tenía este aspecto: `iex(irm(-join"…"[-1..-99]))` — la dirección de descarga estaba escrita al revés.

PowerShell primero invierte la cadena, luego descarga el script y lo ejecuta de inmediato. A simple vista no se puede leer el dominio, y un escáner que busque enlaces en el texto tampoco lo detecta. La dirección apunta a un dominio muy similar al real.

Los auténticos Microsoft Activation Scripts existen y también usan instalación mediante irm | iex — precisamente en eso se basa el engaño.

Por qué los filtros obvios no funcionaron

El autor aplicó esta regla a los 321 repositorios enviados por el bot entre el 15 de julio y el 8 de octubre (314 siguen activos). La primera idea fue marcar las instalaciones de tipo «descarga y ejecuta de inmediato» desde un sitio que no fuera GitHub. Pero así se instalan 38 de los 314 proyectos legítimos: codex, opencode, además de los instaladores de rustup y uv. El filtro habría ocultado uno de cada ocho repositorios en tendencia, precisamente los más útiles.

La segunda regla fue «la cuenta del propietario tiene menos de 30 días». La trampa habría pasado esta prueba: el día en que se envió, ya tenía 34 días. Una cuenta de usar y tirar no se define por su antigüedad en el momento de la verificación, sino por el intervalo entre la creación de la cuenta y la creación del repositorio.

Los dos filtros que funcionaron

Primer filtro (comando de instalación disfrazado)

Comprueba si hay enmascaramiento en el README:

  • Cadena invertida mediante `-join"…"[-1..` e `iex(irm(…))` con una dirección calculada
  • Código en formato base64 que se decodifica y se ejecuta de inmediato
  • Ejecución oculta vía `mshta`, `certutil`, `bitsadmin` o `-WindowStyle Hidden`

Antes de la verificación, el texto se limpia de caracteres invisibles y de las comillas invertidas de PowerShell (como i`e`x).

Segundo filtro (propietario de usar y tirar y ausencia de código)

Bloquea repositorios si:

  • La cuenta se creó menos de 30 días antes del repo
  • El repositorio pesa menos de 10 KB o solo contiene README y LICENSE

Si GitHub no responde, esto se considera «desconocido», no «sin código» — un fallo de red no debe ocultar un proyecto legítimo.

En los 314 repositorios, cada indicador se activó exactamente una vez — en el activador falso. Desde el 9 de octubre, la verificación está integrada en el bot. Si un repositorio se parece a una trampa, el bot lo retira de la selección, pone en su lugar el siguiente mejor valorado y escribe una línea explicando qué se ocultó y por qué.

El segundo problema: las alucinaciones de la red neuronal

El bot le pide a DeepSeek que resuma cada repositorio en una frase en ruso. Un proyecto cuya descripción solo mencionaba meat.dev fue descrito por el modelo como un «framework web para Ruby». Una herramienta de pruebas fue comparada con Cypress, que no aparece en la fuente. Todo suena creíble y a simple vista no se detecta.

El autor reunió 303 resúmenes reales y los comparó con sus fuentes. La regla es simple: toda palabra en caracteres latinos con mayúscula inicial o con un dígito (Ruby, GPT-5) y todo número de tres o más cifras, con punto o porcentaje, debe aparecer en la fuente. Si no aparece, el bot muestra la descripción original de GitHub.

La primera versión rechazó 9 de 303 resúmenes. Cuatro resultaron ser distintas formas de escribir lo mismo: Open-source y «open source», Wi-Fi y «WiFi», 2234 y «2,234». El autor añadió una comparación sin guiones ni espacios y eliminó los separadores de miles. Quedaron 5 rechazos: tres invenciones reales (Ruby, Cypress, Scratch) y dos casos donde la fuente no los confirma (NVIDIA y siglo XIX). En cuatro días: 20 resúmenes y ningún rechazo.

Dónde conseguir las herramientas

lure-check: `python3 lure_check.py owner/repo` — código de salida 1 para una trampa, útil en CI

ground-check: `python3 ground_check.py --source source.txt --text summary.txt`

Ambas herramientas son un único archivo en Python, usan solo la biblioteca estándar, tienen licencia MIT y cuentan con pruebas basadas en casos reales. La trampa en las pruebas está neutralizada, con todas las direcciones reemplazadas.

Historia

Preguntas frecuentes sobre la noticia

¿Qué se sabe sobre Una trampa con 1774 estrellas?

Cada mañana, un bot de Telegram le envía al autor cinco repositorios en tendencia de GitHub tomados de trendshift.io. Debajo de cada uno hay un botón que, al pulsarlo, hace que el bot muestre un resumen del README para un análisis rápido. El autor lee este feed a diario y, de vez en cuando, marca con «me gusta» los proyectos que le interesan. El 26 de septiembre apareció en el feed un repo llamado «Microsoft Activation Scripts» con 1774 estrellas, una descripción cuidada y etiquetas. El bot lo presentó junto a otros cuatro proyectos — y resultó ser una trampa. El repositori

¿Qué se sabe sobre Por qué los filtros obvios no funcionaron?

El autor aplicó esta regla a los 321 repositorios enviados por el bot entre el 15 de julio y el 8 de octubre (314 siguen activos). La primera idea fue marcar las instalaciones de tipo «descarga y ejecuta de inmediato» desde un sitio que no fuera GitHub. Pero así se instalan 38 de los 314 proyectos legítimos: codex, opencode, además de los instaladores de rustup y uv. El filtro habría ocultado uno de cada ocho repositorios en tendencia, precisamente los más útiles. La segunda regla fue «la cuenta del propietario tiene menos de 30 días». La trampa habría pasado esta prueba: e

¿Qué se sabe sobre Los dos filtros que funcionaron?

Primer filtro (comando de instalación disfrazado) Comprueba si hay enmascaramiento en el README: Cadena invertida mediante `-join"…"[-1..` e `iex(irm(…))` con una dirección calculada Código en formato base64 que se decodifica y se ejecuta de inmediato Ejecución oculta vía `mshta`, `certutil`, `bitsadmin` o `-WindowStyle Hidden` Antes de la verificación, el texto se limpia de caracteres invisibles y de las comillas invertidas de PowerShell (como i`e`x). Segundo filtro (propietario de usar y tirar y ausencia de código) Bloquea repositorios si: La cuenta se creó menos de 30 dí

ZK
Zhemal Khamidun — CPO de Alpina Digital, product manager de AlpinaGPT. Crea productos de IA desde 2019. Hamidun News es un proyecto personal que creció hasta ser un agregador en producción con más de 6.000 lectores.
✦ Unified AI Workspace · Nomad

Test Frontier LLMs & Autonomous Agents in One Workspace

Run Claude Opus 5.5, GPT-6, Gemini 3.1, and DeepSeek side-by-side in Nomad AI (nomadnet.ai) — unified model routing, deep research, and multimodal workflows under one subscription.

Try Nomad AI →Launch Nomad Agent
¿Qué te parece?
Cargando comentarios…