GlassWorm Está en Tus Repos de Python Ahora — Qué Es, Cómo Funciona, Qué Hacer
Esto está activo y moviéndose rápido, así que voy directo al punto.
GlassWorm empezó en octubre 2025 como un ataque de supply chain apuntando a extensiones de VS Code a través del marketplace OpenVSX. Probablemente infectó más de 35.000 descargas antes de ser contenido. Hubo dos oleadas más — noviembre 2025 y enero 2026 — cada una apuntando a extensiones de VS Code con un alcance combinado de decenas de miles de usuarios.
Lo que necesitás entender es para qué fue diseñado GlassWorm: robar credenciales. Específicamente, tokens de GitHub — cosechados del storage de extensiones de VS Code, archivos de credenciales de git, ~/.git-credentials, y la variable de entorno GITHUB_TOKEN.
Ahora esos tokens robados están siendo usados en una nueva campaña llamada ForceMemo. Y el objetivo son tus repositorios de Python.
Cómo Funciona el Ataque
La campaña ForceMemo, activa desde el 8 de marzo de 2026, usa las credenciales robadas por GlassWorm para acceder directamente a cuentas de GitHub de desarrolladores. Una vez adentro, el atacante hace algo inusual:
En vez de abrir un pull request (visible) o crear un nuevo commit (visible), toma el último commit legítimo en tu rama por defecto, lo rebasea — agregando código malicioso ofuscado a archivos Python clave — y luego hace un force-push del resultado.
El mensaje del commit queda igual. El nombre del autor queda igual. La fecha del autor queda igual. En la UI de GitHub, nada parece fuera de lugar. Las únicas huellas: la fecha del committer cambia a la fecha real del ataque, y el email del committer suele estar seteado al string "null".
Los archivos objetivo son setup.py, main.py, y app.py. El payload inyectado está codificado en Base64 y se agrega al final de estos archivos.
¿Qué hace el payload? Consulta una wallet de Solana — la misma infraestructura usada en oleadas anteriores de GlassWorm desde noviembre 2025 — para obtener una URL de comando y control. Desde ahí descarga scripts adicionales diseñados para robar criptomonedas y datos sensibles.
El disparador es simple: cualquiera que ejecute pip install desde un repo comprometido, o que clone y ejecute el código, activa el malware.
Quiénes Están Afectados
El ataque apunta específicamente a:
- Aplicaciones Django
- Código de investigación de ML
- Dashboards de Streamlit
- Paquetes de PyPI
Aproximadamente 150+ repositorios de GitHub fueron comprometidos entre el 3 y el 9 de marzo en la oleada de Unicode de GlassWorm. Cientos más fueron afectados en la oleada de force-push de ForceMemo a partir del 8 de marzo. Ambos ataques trazan a la misma infraestructura de Solana — lo que significa que el mismo actor está corriendo múltiples campañas simultáneas.
Un usuario de Reddit descubrió el compromiso al notar que "null" había hecho commits en la mayoría de sus repos — y rastreó la infección hasta una extensión de Cursor comprometida. Esto importa: si usás extensiones de Cursor o VS Code de fuentes no oficiales, es posible que ya hayas tenido tus credenciales robadas sin saberlo.
Por Qué Es Difícil de Detectar
Tres cosas hacen a ForceMemo particularmente peligroso:
1. Sin rastro de pull request. Porque el ataque usa rebase con force-push en lugar de nuevos commits, el activity feed de GitHub no muestra nada inusual. No hay PR para revisar, no hay nuevo commit que notar.
2. Unicode invisible en la oleada paralela de GlassWorm. La campaña de Unicode relacionada oculta su payload usando caracteres del Área de Uso Privado de Unicode (U+FE00–U+FE0F) — caracteres que se renderizan como espacios de ancho cero en todo editor, terminal, e interfaz de code review. La revisión visual no ofrece ninguna protección.
3. La infección empieza en tus herramientas. GlassWorm infectó extensiones de VS Code y Cursor. Es posible que lo hayas estado ejecutando durante meses antes de que ForceMemo convirtiera esas credenciales robadas en compromisos de repos.
Qué Hacer Ahora Mismo
1. Auditá tus tokens de GitHub inmediatamente.
Andá a GitHub Settings → Developer Settings → Personal Access Tokens. Revocá cualquier token que no reconozcas o que no hayas usado recientemente. Si estás en una organización, revisá todos los tokens de los miembros.
2. Habilitá reglas de protección de ramas que bloqueen force-pushes.
En GitHub: Settings → Branches → Add rule → Habilitá “Require pull request reviews before merging” y “Do not allow bypassing the above settings.” Esto previene force-pushes a tu rama por defecto incluso con credenciales válidas.
3. Revisá tus repos en busca de la firma del ataque.
Buscá commits donde el email del committer sea "null" o donde la fecha del committer no coincida con la fecha del autor en commits recientes. Estas son las señales primarias de un compromiso de ForceMemo.
4. Escaneá archivos Python en busca de Base64 inesperado al final.
Revisá tu setup.py, main.py, y app.py en busca de bloques Base64 sospechosos al final del archivo. El código legítimo normalmente no tiene este aspecto.
5. Auditá tus extensiones de VS Code y Cursor.
Remové cualquier extensión que no uses activamente. Sé especialmente cauteloso con extensiones instaladas desde OpenVSX o fuentes de terceros. Verificá que las extensiones que sí usás no hayan tenido actualizaciones recientes inesperadas.
6. Si mantenés un paquete de PyPI, notificá a tus usuarios.
Si tu paquete estaba en la ventana afectada (desde el 8 de marzo), asumí compromiso hasta probar lo contrario y publicá una nueva release limpia.
El Panorama General
GlassWorm es ahora una campaña multi-vector: extensiones de VS Code, extensiones de Cursor, paquetes de npm, y ahora repos Python en GitHub — todos compartiendo la misma infraestructura de Solana. El ataque está evolucionando de “infectar máquinas de desarrolladores” a “usar a los desarrolladores como vectores hacia el supply chain.”
El ecosistema de desarrollo — repos de ML, paquetes open source, herramientas internas — es un objetivo de alto valor. Y la capa de herramientas AI (extensiones de VS Code, extensiones de Cursor) resulta ser un punto de infección inicial perfecto, porque los desarrolladores las instalan rápido y confían en ellas implícitamente.
Revisá tus repos. Auditá tus tokens. Habilitá la protección contra force-push. La campaña está activa ahora mismo.
¿Ya revisaste tus repos? Si encontraste algo, compartí en los comentarios — ayudás a que otros en la comunidad sepan qué buscar. ![]()
