- Caso de ingeniería social en el que una reclutadora se acercó por mensaje de LinkedIn y pidió revisar un repositorio público de GitHub con el pretexto de contratar a un lead engineer
- En el código solicitado para revisión había una puerta trasera disfrazada de suite de pruebas, y la petición de "revisar un problema con módulos de Node obsoletos" era un anzuelo para inducir la ejecución de
npm install - Al sospechar, en lugar de revisarlo en local se inspeccionó el código en un VPS desechable con un agente en modo de solo lectura, y el archivo problemático se detectó en segundos
- Tanto los commits del repositorio como el perfil de la reclutadora suplantaban la identidad de personas reales: un desarrollador real y una periodista del ámbito artístico, respectivamente
- Se presentan lecciones prácticas de defensa: la sospecha, la higiene de seguridad (security hygiene) y el uso de agentes de solo lectura fueron más eficaces que leer el código directamente
Cómo empezó
- La semana pasada recibí un mensaje de LinkedIn de una reclutadora de una pequeña startup cripto
- Intercambiamos varios mensajes durante algunos días y me explicó un proof-of-concept roto para el que necesitaban un lead engineer
- Me compartió un repositorio público de GitHub para revisar y me pidió "revisar un problema con módulos de Node obsoletos"
- Las solicitudes para revisar un codebase existente son comunes, pero esta vez sentí algo extraño y me puse más en guardia
Cómo lo revisé
- En vez de clonar e instalar dependencias, levanté un VPS desechable en Hetzner y cloné el repositorio ahí
- Configuré Pi en modo de solo lectura, activando únicamente herramientas de lectura de archivos
- Comando usado:
pi --tools read,grep,find,ls
- Comando usado:
- Cuando le pedí al agente que revisara el codebase y marcara elementos sospechosos, se detuvo casi de inmediato en
app/test/index.js
Estructura de la puerta trasera
- El repositorio tenía una estructura de frontend en React + backend en Node
- La trampa estaba en
app/test/index.js, de unas 250 líneas, disfrazado de suite de pruebas - Dentro ocultaba una URL armándola a partir de fragmentos
- Combinaba variables como protocol, domain, separator, path, token y subdomain para construir
https://rest-icon-handler.store/icons/77
- Combinaba variables como protocol, domain, separator, path, token y subdomain para construir
- El payload estaba escondido entre pruebas dummy comentadas y hacía que cualquier cosa que enviara el servidor se ejecutara en la máquina del usuario
- El payload estaba en la línea 225
Mecanismo de activación
- El archivo no espera a que se ejecuten pruebas
app/index.jsejecutaconst test = require('./test'), lo que carga y pone en marchaapp/test/index.js
package.jsonconectaapp/index.jscon la fase de inicio- La clave está en el script
prepare, que npm ejecuta automáticamente después denpm install- Por eso, solo instalar las dependencias activa la puerta trasera
- La instrucción de "revisar el problema con módulos de Node obsoletos" era, al final, un anzuelo para provocar la ejecución de
npm install - Era posible ejecutar el payload en un sandbox y observar una carga útil de segunda etapa, pero bastó la evidencia de que se ejecutaba código entregado por el servidor para detenerse ahí
Primera identidad suplantada
- Los commits estaban hechos con el nombre y correo de un desarrollador full stack real
- Tenía un perfil normal de LinkedIn, un sitio web personal y una cuenta de GitHub con años de historial
- Fingiendo que había heredado el codebase, me puse en contacto con ese desarrollador
- Respondió que nunca había trabajado en esa empresa, que ya antes lo habían suplantado en GitHub y que incluso habían tumbado repositorios por eso, y que no tenía ninguna relación con este repositorio
- También dijo que él mismo estaba reportando este tipo de repositorios
- Todo el historial de commits, 39 commits en total, aparecía atribuido a un desarrollador que en realidad nunca había tocado el repositorio
Segunda identidad suplantada
- El perfil de la reclutadora correspondía a una periodista real del ámbito artístico, con experiencia solo en cultura y sin ningún elemento técnico
- Cuando respondí que no se instalaba, esa periodista no técnica se convirtió de inmediato en experta en npm y versiones de Node y empezó a presionar para que ejecutara
npm install
Le puede pasar a cualquiera
- Había oído hablar de este tipo de ataques y también los había leído en HN, pero cuando fui el objetivo me tomó algo por sorpresa
- Sospeché desde el primer mensaje, pero si hubiera estado cansado o apurado, podría haber ejecutado
npm installsin pensarlo mucho
- Sospeché desde el primer mensaje, pero si hubiera estado cansado o apurado, podría haber ejecutado
- Los mensajes de LinkedIn con solicitudes para revisar repositorios requieren algo de cautela e higiene de seguridad
- Revisar el código con un agente de solo lectura fue más efectivo que leerlo directamente
- La puerta trasera estaba disfrazada de código torpe, como de principiante, pero el agente la detectó en segundos
- El repositorio fue reportado en GitHub y la reclutadora en LinkedIn, pero hasta ahora no ha habido cambios y el código sigue publicado
1 comentarios
Opiniones de Hacker News
Un reclutador de una pequeña startup de criptomonedas envió un repositorio público de GitHub diciendo que revisaran una prueba de concepto rota y que comprobaran un “deprecated Node modules issue”, y todo resultó ser phishing para inducir a correr
npm installEl script
preparese ejecutaba automáticamente después denpm instally era una puerta trasera que corría localmente código arbitrario servido por el servidor; parece sorprendentemente grave que este tipo de phishing pueda llegar por LinkedIn$company, y si solo lo ponen en el perfil aparecen en la página oficial de la empresaEn nuestra empresa también tuvimos falsos reclutadores haciendo esta misma estafa, con perfiles bastante creíbles e incluso muchas publicaciones relacionadas con LinkedIn Premium, pero no eran empleados reales
Por más que los reportamos no los bajaron, y al final lo resolvimos invitándole unos tragos a un conocido que trabaja en LinkedIn, pero no todas las startups tienen ese tipo de contacto
Viendo cómo siguen comprometiendo a la gente, no se entiende que no se tapen los agujeros más obvios y más explotados, como ejecutar código arbitrario durante la descarga del código, usando herramientas como PNPM
Las herramientas que ejecutan código arbitrario en cuanto intentas descargar código ya deberían desaparecer
Lo último que recuerdo eran descargas disfrazadas como archivos de protector de pantalla
.scrde Windows, y que ahora haya llegado a LinkedIn es una fase todavía peorProbablemente a la plataforma no le importe mucho porque se verá como “más empleos”, parecido a cómo redes publicitarias como Google o Meta no parecen preocuparse demasiado por los anuncios fraudulentos
bullshitpowershellladendoucument.pdf.docx, pero enviarlo directo por DM de LinkedIn es una estrategia bastante descaradaEsto claramente debería ser un crimen, pero no entiendo por qué no existe una vía conocida tipo 911 para ciberdelitos donde uno pueda reportarlo y recibir ayuda
La sociedad tiene que alcanzar los riesgos reales y construir redes de apoyo rápido; contra el crimen organizado hace falta defensa organizada
Es muy probable que no recibas respuesta, pero para ciudadanos estadounidenses, y quizá para cualquiera, es lo más cercano a un 911 de internet que conozco
El segundo problema es la asimetría: crear este tipo de estafas cuesta casi 0 esfuerzo, pero atraparlos y procesarlos requiere muchísimo trabajo y costos astronómicos
Está más o menos en la misma categoría que las llamadas de estafa a ancianos haciéndose pasar por soporte de Microsoft, y atrapar a los sospechosos es casi imposible
O esconden muy bien sus huellas, o más seguido viven en países donde al gobierno no le importa —o incluso tolera— que se estafe a occidentales
Aunque reportes el crimen, es muy probable que no te ayuden ni se pongan en contacto contigo
Esto ya está incómodamente cerca de una tarea de entrevista totalmente normal
Que alguien te mande un repositorio diciendo que la instalación está rota y te pida que lo revises es algo natural, y muchos desarrolladores, si están cansados o buscando trabajo, pueden correr
npm installantes de pensarlo muchoComo no quieres parecer lento, te saltas el paso de preguntar si siquiera está bien ejecutarlo
“Reporté el repositorio a GitHub y al reclutador a LinkedIn, pero todavía no ha cambiado nada y el código sigue ahí”, ah, Microsoft
Llevaba a un video falso donde el primer ministro canadiense anunciaba un plan de inversión en criptomonedas para todos los canadienses, con enlace de registro incluido; lo reporté y me respondieron que tras investigarlo no encontraron violación de políticas
Los tres tienen problemas de seguridad o estabilidad, y mientras más se mete Microsoft en IA, parece que en vez de mejorar empeora
No sé a dónde se está yendo toda esa productividad interna de IA, esa productividad que según algunos era 10x
Así lo habrían bajado de inmediato
Parece que están usando el mismo dominio con varios objetivos
Hace 3 meses también hubo un hilo similar en Reddit: https://www.reddit.com/r/openclaw/comments/1rlet0h/someone_t...
No entiendo por qué todavía no todos los sistemas operativos del mundo han bloqueado npm
Parece que esta gente nunca va a aprender
Esta estafa se podría haber hecho con muchas otras tecnologías, incluso con un Makefile
Ojalá que por fin llegue a Mac un framework de virtualización decente
Ya cansa bastante seguir descargando scripts aleatorios de internet sin protección como si estuviéramos en 1995
Cuando conoces a un extraño y vas a meter sus cosas hasta el fondo de tu computadora, no hay que olvidar usar equipo de protección
curl | bashdesde GitHub, AUR o NPM es igual de malo, pero muchos desarrolladores aquí todavía tienen supuestos dudosos sobre esta mala prácticaVarios incidentes pequeños tipo Shai-Hulud que circularon en semanas recientes muestran qué tan mala es esta idea
En IntelliJ puedes configurar que los comandos de npm se ejecuten dentro de un contenedor Docker
Todas las propuestas de trabajo que recibí en LinkedIn me parecieron demasiado sospechosas
Cosas como pedirte que postules en una plataforma, que grabes un video de presentación o que resuelvas una prueba de código de filtro detrás de una plataforma de coding
Le pidieron que emitiera un cheque como depósito por la laptop de la empresa; a simple vista no tenía sentido, pero llevaba tanto tiempo buscando trabajo que estaba desesperado y de verdad feliz porque pensó que por fin había conseguido uno
Quienes pasan por desempleo de largo plazo a veces llegan a estar tan desesperados que ignoran señales de alerta gravísimas en las que jamás caería alguien con suficientes ahorros o alguien que ya tiene empleo y solo quiere cambiarse
¿No será que hoy en día la mayoría de los autores de paquetes NPM terminan siendo hackeados así?
Parece que al responsable de axios también lo engancharon con el mismo acercamiento por LinkedIn
Solo uso LinkedIn por las vacantes, pero en los últimos meses se ha llenado de publicaciones inútiles
Aparecen montones de anuncios de empresas parecidas a Ladders, Swooped, y ya parece momento de abandonar LinkedIn por completo