NIKKE : une attaque de la chaîne d'approvisionnement du lanceur PC installe une porte dérobée
Des attaquants ont modifié quatre scripts officiels du lanceur PC de NIKKE sur le CDN de Level Infinite pour installer l'agent K2F ; corrigé le 4 novembre.
En bref
- Des attaquants ont modifié quatre fichiers JavaScript officiels sur le réseau de diffusion de contenu de Level Infinite. Le lanceur PC de NIKKE les a chargés et a pu installer un agent de contrôle à distance nommé K2F.
- Toute personne ayant ouvert le lanceur PC entre le 27 septembre et le correctif du 4 novembre est à risque, sur Windows, Linux et Steam Deck via Proton, ou avec la version Google Play Games. Le premier démarrage d'agent signalé date du 23 octobre.
- Level Infinite a confirmé la falsification le 4 novembre et a remplacé les fichiers. Le jeu compte plus de 45 millions de téléchargements. Aucune CVE n'est attribuée, et l'incident n'est pas au catalogue KEV de la CISA au 5 novembre 2026.
- Videz le cache du lanceur, exécutez les vérifications publiées, supprimez la persistance Chrome si elle est présente et renouvelez chaque identifiant depuis un appareil sain. Voir « Comment corriger ? ».
Suis-je concerné ?
Toutes ces conditions doivent être réunies pour qu'une machine soit exposée :
- Le lanceur PC de NIKKE a été ouvert entre le 2026-09-27, date d'apparition des fichiers modifiés sur le CDN, et le correctif du 2026-11-04.
- Le lanceur a exécuté les fichiers modifiés depuis le réseau ou depuis son cache. Le chargeur n'a récupéré le paquet de second niveau que lors de certains lancements.
- La machine est sous Windows, sous Linux ou sur Steam Deck avec le lanceur exécuté via Proton, ou utilise la version Google Play Games. Le client mobile est une autre application et ne fait pas partie de cet incident.
Le premier démarrage d'agent signalé date du 2026-10-23 à 16:40 GMT. Le chargeur était en place depuis le 2026-09-27, et le rapport indique que la charge utile ne s'exécutait que lors de certains lancements. Une machine l'a vue sur 3 lancements environ sur 19. La version Google Play Games s'installe dans C:\NIKKE_GOOGLE, exécute Launcher\nikke_launcher_google.exe et conserve ses données dans %APPDATA%\nikke_launcher_google.
| Version | Lanceur | Dossier de données | Exposition |
|---|---|---|---|
| Windows | Launcher\nikke_launcher.exe |
%APPDATA%\nikke_launcher |
Concernée jusqu'au correctif du 4 novembre |
| Windows HMT | Lanceur HMT | %APPDATA%\nikke_launcher_hmt |
Concernée jusqu'au correctif du 4 novembre |
| Google Play Games | Launcher\nikke_launcher_google.exe |
%APPDATA%\nikke_launcher_google |
Signalée comme concernée |
| Linux et Steam Deck | Lanceur dans le préfixe Proton | Mêmes chemins dans le préfixe | Concernée jusqu'au correctif du 4 novembre |
Cherchez le marqueur de l'agent dans le journal du lanceur :
# Windows PowerShell
Select-String -Path "$env:APPDATA\nikke_launcher\intl_service\debug.log" -Pattern "k2f_chan"
# Linux or Steam Deck, inside the Proton prefix
grep -i "k2f_chan" "$WINEPREFIX/drive_c/users/$USER/AppData/Roaming/nikke_launcher/intl_service/debug.log"
k2f_chan registered signifie que l'agent a été téléchargé et exécuté. Un lancement peut aussi journaliser startup failed: EIO: invalid UTF-8 in string juste après, sans ligne adopted ni agent started as, et cela signifie toujours que l'agent s'est exécuté.
Comment corriger ?
- Avant de rouvrir le lanceur, exécutez les vérifications de « Comment vérifier si j'ai été compromis ? ». Le cache du lanceur contient une partie des preuves.
- Copiez ou supprimez le dossier de cache du lanceur. Il peut encore contenir les fichiers modifiés et le lanceur les chargerait de nouveau. Le dossier est
%APPDATA%\nikke_launcher\tbs_cache, ou%APPDATA%\nikke_launcher_hmt\tbs_cacheet%APPDATA%\nikke_launcher_google\tbs_cachepour les autres versions. Dans un préfixe Proton, il se trouve au même chemin dans le préfixe. - Bloquez les domaines et adresses actuels de l'attaquant dans votre fichier hosts, votre routeur ou votre pare-feu :
text
insightjs.com
analytics.insightjs.com
insightjs.org
89.127.233.127
89.126.250.172
Cela arrête le serveur connu aujourd'hui. Le rapport indique que la façon dont l'attaquant a obtenu l'accès en écriture au CDN de Level Infinite reste inconnue, donc un nouveau domaine reste possible.
4. Si la vérification trouve k2f_chan, suivez « Que faire si je l'ai installé ? ».
5. Gardez le lanceur à jour. Level Infinite a reconstruit l'interface le 4 novembre et remplacé les quatre fichiers. Confirmez que votre lanceur charge les noms de scripts reconstruits listés dans le rapport.
La mesure du fournisseur est la mise à jour du client et la suppression du cache. Le rapport ne fournit pas de correctif pour le code du lanceur, car la faille n'est pas dans le binaire du lanceur : les scripts officiels du CDN ont été modifiés.
Que fait le code malveillant ?
Le code malveillant est un chargeur inséré dans quatre scripts légitimes du lanceur. Il s'exécute lorsque le lanceur charge le script, résout une URL de commande et de contrôle, télécharge une charge utile LuaJIT et démarre un agent de contrôle à distance dans le processus du lanceur.
Les quatre fichiers modifiés sont :
| Fichier officiel | Chargeur récupéré |
|---|---|
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 |
Le code injecté cache l'URL dans un tableau d'entiers avec new TextDecoder().decode(new Uint8Array(new Uint32Array([...]).buffer)). Il ajoute une balise <script> et la retire après le chargement. Si insightjs.com échoue, il réessaie avec insightjs.org. Dans FeedList.feb647c9.js, les 708 octets ajoutés se trouvent juste avant l'instruction finale export{...}, donc une vérification qui ne compare que la fin du fichier les manque.
Le chargeur appelle le pont de téléchargement du lanceur, Srv_DownloadFile, pour récupérer https://analytics.insightjs.com/comm/assets/insight.bundle. La copie analysée fait 205 135 octets avec l'empreinte SHA-256 cc0ad05bfe85940a6067b3a72c182d3953339129206634141926d5d0b35973ec. Le lanceur l'enregistre sous un nom .log trompeur dans Launcher\log\tinyget\, l'exécute, puis le supprime. Une version antérieure l'enregistrait sous k2f.lua et le laissait sur place. Tout fichier de ce dossier qui commence par les octets 1B 4C 4A 01 est l'agent.
Le paquet est du bytecode LuaJIT 2.0 pour un agent nommé en interne K2F_LUA_BUILD. Il enregistre k2f_chan auprès du comm_center du lanceur, puis répond aux commandes du serveur. L'agent ne fait rien de lui-même : chaque action vient de l'opérateur via l.js.
Comment la faille est-elle exploitée ?
- Un joueur ouvre le lanceur PC de NIKKE.
- Le lanceur demande l'un de ses fichiers de script habituels au CDN de Level Infinite. Le CDN sert la copie modifiée.
- Le chargeur inséré construit l'URL
insightjs.comet ajoute une balise script. Si le premier domaine échoue, il essaieinsightjs.org. l.jsprofile le lanceur et appelle le pontSrv_DownloadFiledu lanceur pour récupérerinsight.bundledepuisanalytics.insightjs.com.- Le lanceur écrit le paquet dans
Launcher\log\tinyget\et l'exécute via son moteur LuaJIT. - L'agent enregistre
k2f_chanet contacte le serveur de commande et de contrôle. L'opérateur peut alors envoyer des commandes tant que le lanceur est ouvert. - Sous Windows, l'opérateur peut installer une DLL Chrome qui continue de s'exécuter après la fermeture du lanceur.
Aucune interaction de l'utilisateur au-delà de l'ouverture du lanceur n'est nécessaire. Le chargeur s'exécute au lancement, et le rapport relève des démarrages d'agent depuis le 23 octobre.
Comment se déroule l'attaque ?
Les quatre fichiers CDN modifiés ajoutent un chargeur. Le chargeur récupère un agent LuaJIT via le pont de téléchargement du lanceur. L'agent donne à l'opérateur un accès distant dans le processus du lanceur.
le lanceur PC de NIKKE"] --> B["Le CDN sert quatre fichiers
JavaScript officiels modifiés"] B --> C["Le chargeur demande
insightjs.com/l.js"] C --> D["l.js appelle Srv_DownloadFile
pour insight.bundle"] D --> E["Le lanceur exécute le paquet
avec LuaJIT"] E --> F["L'agent K2F enregistre k2f_chan
et contacte le serveur de commande"] F --> G["L'opérateur envoie des commandes
tant que le lanceur est ouvert"]
Que peut faire un attaquant ?
L'opérateur dispose d'un agent d'accès distant dans le processus du lanceur. L'agent peut exécuter toute commande que le compte du joueur peut exécuter, lire et télécharger des fichiers, prendre des captures d'écran et collecter les identifiants enregistrés.
La liste de commandes publiée comprend :
exec, qui exécute n'importe quel programme ou commande shell et renvoie la sortie.ls,cd,cat,downloadetfile_chunk, qui parcourent les dossiers et copient n'importe quel fichier.screens, qui capture chaque écran.creds, qui déchiffre le compte et le mot de passe NIKKE enregistrés par le lanceur.browserscan, qui lit les mots de passe enregistrés dans Chrome, Edge, Brave, Vivaldi, Opera et Firefox, et les cookies des navigateurs Chromium.keyscan, qui lit 264 chemins d'identifiants et de configuration et les entrées du Gestionnaire d'identifiants Windows des outils de développement.wallet_files, qui lit les données de 28 extensions de portefeuille de cryptomonnaies dans les profils Chrome.chrome_install, qui installe la persistance par DLL Chrome.
exec seul permet à l'opérateur de faire tout ce que l'utilisateur peut faire, y compris installer d'autres logiciels malveillants. L'agent s'exécute avec des privilèges élevés dans le lanceur Windows standard, dont le manifeste demande les droits d'administrateur, donc les chemins de chiffrement liés à l'application de Chrome et Edge peuvent fonctionner. L'agent reste actif tant que le lanceur est ouvert, et le lanceur reste souvent dans la zone de notification pendant que le jeu tourne.
L'impact exige que le joueur ouvre le lanceur pendant la fenêtre d'exposition. Le rapport n'a trouvé aucun code pour les tâches planifiées, les clés Run, les services ou le dossier Démarrage, donc la persistance vient de la DLL Chrome ou des commandes envoyées par l'opérateur.
Que faire si je l'ai installé ?
- Fermez le lanceur ou déconnectez la machine d'internet, afin que l'opérateur perde l'accès.
- Supprimez la persistance Windows. Supprimez
HKCU\Software\Classes\CLSID\{E77CC89B-7401-4C04-8CED-149DB35ADD04}s'il existe. Laissez la copie HKLM tranquille : elle appartient à Windows. Redémarrez Windows, car la DLL reste verrouillée tant qu'elle est chargée. - Supprimez tout sous-dossier de
%LOCALAPPDATA%\Google\Chrome\User Data\PlatformExperienceHelper\dont le nom est une chaîne hexadécimale de 64 caractères et qui contientplatform_experience_helper.dll. Ne supprimez pas tout le dossier ; Chrome le crée pour son propre assistant. - Depuis un appareil sain, changez d'abord le mot de passe NIKKE et Level Infinite, puis ceux de la messagerie, de Discord, de la banque et tous les mots de passe enregistrés dans un navigateur. Activez l'authentification à deux facteurs.
- Déconnectez toutes les sessions de Discord, Google, Steam, GitHub et des autres services utilisés. Les cookies de navigateur fonctionnent sans le mot de passe.
- Renouvelez les jetons d'API, les clés SSH et les identifiants de développement, notamment GitHub, npm, AWS, OpenAI et Anthropic.
- Déplacez les fonds des portefeuilles de cryptomonnaies vers un nouveau portefeuille avec une nouvelle phrase de récupération.
- Réinstallez Windows si l'agent s'est exécuté. L'opérateur pouvait exécuter n'importe quelle commande, et Microsoft Defender Offline n'a pas détecté la DLL sur une machine.
Le rapport publie un vérificateur en lecture seule, NIKKE Launcher Check, pour Windows, Linux et macOS. Il cherche le chargeur, l'agent et la DLL, et écrit un rapport que vous enregistrez vous-même.
Comment vérifier si j'ai été compromis ?
Le fournisseur n'a publié aucun indicateur. Le rapport indépendant publie les suivants, propres à cet incident :
- Cherchez
k2f_chandansLauncher\intl_service\debug.log. Les ligneslua downloaded to log\tinyget\,k2f_chan registered,adoptedetagent started asmontrent que l'agent s'est exécuté. Copiez le journal avant de supprimer le cache. - Listez
Launcher\log\tinyget\. Les fichiers nomméstinyget.<time>.logouk2f.luaqui commencent par1B 4C 4A 01sont l'agent. - Vérifiez le cache de code V8 du lanceur dans
%APPDATA%\nikke_launcher\tbs_cache\Code Cache\js\. Les clés de chargeurdd65fa4d61079e7e_0,ce2fd3f1007a9fe9_0,1416c638b3830103_0etfd520c7c0f65c2d7_0correspondent àaegis,images,feedlistetvue. - Cherchez
k2f.agent.statedans le leveldb de Local Storage soustbs_cache\Local Storage\leveldb\. L'état survit à la suppression du dossier NIKKE. - Cherchez
%LOCALAPPDATA%\Google\Chrome\User Data\PlatformExperienceHelper\<64-hex>\platform_experience_helper.dllet la clé CLSID deHKCUcitée à l'étape 2 de « Que faire si je l'ai installé ? ». - Comparez les journaux réseau avec les domaines et adresses de « Comment corriger ? ». Une résolution de
insightjs.comaprès une requêteplayerinfinite.comest une piste.
Le debug.log du lanceur est complété, pas écrasé, donc une ancienne entrée peut rester après un lancement propre. Le cache HTTP stocke les scripts modifiés compressés en gzip, donc une recherche en texte clair ne trouve rien ; décompressez chaque flux gzip et cherchez String.fromCharCode(111,114,103). Une machine sans trace peut quand même avoir exécuté une version ancienne qui nettoyait après elle.
Chronologie
- 2026-09-27 06:41 à 06:42 GMT : quatre fichiers JavaScript officiels du CDN de Level Infinite sont modifiés.
- 2026-10-23 16:40 GMT : premier démarrage d'agent signalé par une victime.
- 2026-10-28 15:46 GMT :
FeedList.feb647c9.jsest remplacé par une copie saine à l'origine, mais certains serveurs CDN gardent la copie modifiée. - 2026-11-03 17:04 à 17:23 GMT : les trois autres fichiers sont remplacés sur le CDN.
- 2026-11-04 03:12 à 03:21 GMT : les derniers serveurs CDN vérifiés prennent la copie saine de
FeedList.feb647c9.js. - 2026-11-04 03:13 GMT : Level Infinite confirme la falsification dans une déclaration sur X.
- 2026-11-04 11:20 GMT : les quatre fichiers sont sains sur les quatre serveurs CDN vérifiés.
FAQ
L'application mobile NIKKE est-elle concernée ?
Rien n'indique que l'application mobile soit concernée. Les fichiers falsifiés sont les scripts du lanceur PC, et le rapport couvre Windows, Linux et Steam Deck via Proton ainsi que la version Google Play Games. La version Google Play Games tourne sous Windows, pas sous Android.
J'ai ouvert le lanceur sans voir d'avertissement. Ai-je été infecté ?
Pas nécessairement. La charge utile ne s'exécutait que lors de certains lancements, et une machine l'a vue sur 3 lancements environ sur 19. Vérifiez k2f_chan dans le journal et l'en-tête LuaJIT dans le dossier tinyget. Un journal propre réduit la probabilité mais ne prouve pas que la machine n'a jamais été infectée.
Le lanceur est-il sûr à ouvrir maintenant ?
Level Infinite a remplacé les quatre fichiers, et les quatre étaient sains sur les serveurs vérifiés à 11:20 GMT le 4 novembre. Videz d'abord tbs_cache, car le cache peut encore contenir la copie modifiée. Le rapport indique que la façon dont l'attaquant a obtenu l'accès en écriture au CDN reste inconnue.
S'agissait-il d'une attaque par rançongiciel ?
Aucun rançongiciel n'est signalé. L'agent est un outil d'accès distant qui peut voler des identifiants, des cookies, des données de portefeuille et des fichiers. Le rapport ne relève ni note de rançon ni chiffrement.
Existe-t-il une CVE ?
Aucune CVE n'est attribuée au 5 novembre 2026. L'incident est une compromission de la chaîne d'approvisionnement de scripts officiels, pas une vulnérabilité dans un paquet versionné, et la déclaration du fournisseur ne donne aucun identifiant.
Références
- MotherSphere, « NIKKE PC launcher compromise (November 2026) », rapport technique et indicateurs. https://gist.github.com/MotherSphere/d6c049a09ba8ac3085c51ee9df24a4e5 (vérifié le 5 novembre 2026)
- MotherSphere, « NIKKE Launcher Check », vérificateur en lecture seule. https://github.com/MotherSphere/NIKKE-Launcher-Check (vérifié le 5 novembre 2026)
- Level Infinite, déclaration sur X, 4 novembre 2026. https://x.com/NIKKE_en/status/2117817602659770434 (vérifié le 5 novembre 2026)
- BleepingComputer, « NIKKE PC game launcher hacked to spread remote access, data-stealing malware », 4 novembre 2026. https://www.bleepingcomputer.com/news/security/nikke-pc-game-launcher-hacked-to-spread-remote-access-data-stealing-malware/ (vérifié le 5 novembre 2026)