Un cliente falso me envió un repositorio malicioso de GitHub a mi bandeja de entrada esta semana, y el simple hecho de ejecutar el script de inicio borró dos días de trabajo y expuso cada contraseña que guardo en mi navegador.

El «cliente» publicó una oferta para un puesto de ingeniero senior con un sueldo alto, envió mensajes rápidamente y mandó un repositorio de apariencia profesional. La petición era sencilla: clonar, ejecutar npm run dev y enviar una captura de pantalla para demostrar que la demo funcionaba; sin contrato ni verificación de antecedentes. En el momento en que el servidor de desarrollo se inició, un código oculto en un archivo de configuración se comunicó con un servidor de comando y control (C2), descargó una carga útil (payload) de segunda etapa y comenzó a extraer credenciales de la máquina local.

Cómo se desarrolló el ataque

La carga útil maliciosa se encontraba en postcss.config.js, un archivo que la mayoría de los desarrolladores pasan por alto porque suele contener un puñado de reglas sencillas de procesamiento de CSS. En este caso, el atacante añadió una línea de JavaScript ofuscado muy a la derecha de una sentencia legítima, rellenándola con espacios para que pasara desapercibida. Cuando el comando npm run dev ejecutó el pipeline de PostCSS, la línea oculta se ejecutó sin ser detectada.

El malware realizó tres pasos en rápida sucesión:

  • Contacto con el C2 – abrió una conexión de red a un servidor controlado por el atacante y notificó el host comprometido.
  • Descarga de segunda etapa – descargó código adicional que contenía la lógica real de exfiltración de datos.
  • Robo de credenciales del navegador – en macOS, consultó la clave Chrome Safe Storage almacenada en el llavero (keychain) del sistema. Si el usuario aprobaba la solicitud del llavero, el atacante recolectaba cada contraseña guardada en Chrome.

Más allá del robo inmediato, la carga útil se escribió en varias herramientas de desarrollo comunes —VS Code, npm, Discord— para que cualquier ejecución futura de esas aplicaciones volviera a instanciar el código malicioso. Un simple reinicio no eliminó la infección; el siguiente npm install o la apertura del editor reactivaron la puerta trasera (backdoor).

Señales de alerta que a menudo pasan desapercibidas

  • Peticiones para ejecutar código antes de firmar cualquier contrato. Los procesos de contratación legítimos suelen implicar un acuerdo formal antes de compartir cualquier trabajo de propiedad intelectual.
  • Archivos comprimidos que se hacen pasar por «resúmenes de proyecto». Los archivos Zip o RAR pueden ocultar scripts ejecutables o binarios maliciosos.
  • Solicitudes de direcciones de correo electrónico personales para «evitar los filtros de la plataforma». Esta táctica traslada la conversación fuera de la plataforma protegida, donde se pueden denunciar los abusos.
  • Descripciones de puestos que piden al candidato financiar una billetera cripto o comprar tokens de prueba. Tales exigencias son atípicas en un trabajo de desarrollo genuino.

Pasos prácticos para mantenerse seguro

  1. Nunca ejecutes el código de un extraño sin inspeccionarlo. Abre el repositorio en una vista de solo lectura (por ejemplo, a través de la vista de archivo "raw" en GitHub) y analiza cada script, especialmente los archivos de configuración y las entradas de scripts en package.json.
  2. Trata todos los archivos adjuntos como texto plano. Si se envía un archivo zip, extráelo en un entorno aislado (sandbox) y examina el contenido antes de abrir nada.
  3. Usa un gestor de contraseñas dedicado en lugar del almacenamiento del navegador. Incluso si el llavero del navegador se ve comprometido, la bóveda del gestor permanece aislada.
  4. Ejecuta código no confiable en una máquina virtual o contenedor aislado sin acceso a la red. Esto bloquea la capacidad del atacante para comunicarse con un servidor C2.
  5. Activa la autenticación de dos factores (2FA) en todas tus cuentas. Si roban una contraseña, el segundo factor detendrá los inicios de sesión no autorizados.
  6. Mantén las herramientas de desarrollo actualizadas y activa las comprobaciones automáticas de integridad cuando estén disponibles. Algunos editores ahora advierten cuando los archivos principales se modifican inesperadamente.

Si sospechas que has ejecutado código malicioso, asume que el sistema está comprometido. Haz una copia de seguridad de los datos esenciales, borra el disco y reinstala el sistema operativo. Un simple reinicio no erradicará un mecanismo de persistencia que reescribe archivos en aplicaciones comunes.

En resumen: una sola línea de JavaScript oculto puede convertir una demo rutinaria en una operación de robo de credenciales a gran escala. Trata cada repositorio como no confiable hasta que lo hayas verificado, y haz que el aislamiento sea una parte predeterminada de tu flujo de trabajo. El costo de un momento de precipitación es mucho mayor que el esfuerzo dedicado a verificar un archivo.