Aidez nous a financer le site: Joignez l'utile à l'agréable et profitez d'FR-Minecraft sans publicités en
devenant VIP ! Ou ajoutez FR-Minecraft dans vos exceptions, nous n'abusons pas des pubs
C'est un crie de désespoir qu'a lancé ammar2, un des développeurs de Bukkit et de Spigot depuis plusieurs années.
Lorsqu'il travaillait sur Bukkit et Spigot, il a pris commencer a regarder en détail le fonctionnement interne de Minecraft, et plus particulièrement la gestion du réseau. C'est ainsi qu'il y a 2 an il découvrit un faille important dans Minecraft: n'importe qui peux faire cracher n'importe quel serveur Minecraft très simplement en exploitant cette faille !
Ayant conscience de la gravité de cette découverte, il a pris soins de la garder secrète, et de suivre la procédure pour ce genre de faille, espérant une résolution rapide. Il envoya l'information à Mojang dès le 10 juillet 2013, alors que la version stable de Minecraft était la version 1.6.2. Faute de réponses satisfesante, il insita:
-
28 juillet 2013: Premier contact direct avec un employé de Mojang à propos de cette faille, il présente sa découverte et envois un script qui exploite cette faille comme preuve
-
19 aout 2013: Deuxième contact pour demander de corriger la faille, Mojang répond qu'ils y travaillent
-
24 septembre 2013: 3 contact avec Mojang, on lui répond que la résolution du problème a transmise à une autre personne. Ça sera la dernière réponse qu'il obtiendra.
-
25 octobre 2013: 4ème tentative, sans réponse
-
27 octobre 2013: une nouvelle tentative, toujours sans réponse. A partir de ce moment la, il décida de prendre son mal en patience, et d'attendre que Mojang le recontacte.
2 an aprés, 2 versions majeures de Minecraft sont sorties (la version 1.7 et 1.8), et la faille est toujours présente.
Las d'attendre une résolution qui n'arrive pas, il a décider de faire bouger Mojang en annonce publiquement la faille concerné.
Description technique de la faille:
Cette faille permet de saturer un serveur Minecraft en utilisant le CPU et la RAM au maximum, jusqu'à faire planter le serveur. Pour cela il exploite le fait que Minecraft est capable d'échanger sur le réseau des informations à propos de l'inventaires des joueurs. Par exemple, lors de votre connection le serveur vous envois votre inventaire.
D'autre part, les objets dans Minecraft gèrent ce qu'on appelle les metadata. Concretemetn cela permet d'affecter des données personnalisés à un objet: dans Minecraft ces données sont stoqué dans le format NBT (les fameux Tags).
Le format NBT est un format binaire qui permet de représenter des structures de données complexes, d'une manière similère au format JSON mieux connu.
Voici un exemple de données NBT pour un (avec une syntaxe JSON):
tag: {
author: "ammar2",
title: "Chats",
pages: ["Les chats sont mignons", "J'aime les chats"]
}
La faille exploite le fait que le client (le logiciel Minecraft installé par les joueurs chez eux) à la possibilité d'envoyer au serveur des informations à propos de certains slots, associé au fait qu'il est possible de créer des données NBT très simple a généré, mais qui seront très complexe à déchiffrer par le serveur.
Dans son cas, ammar2 à choisit de créer une arborescence de liste, avec 5 sous-niveaux:
rekt: {
list: [
list: [
list: [
list: [
list: [
list: [
]
list: [
]
list: [
]
list: [
]
...
]
...
]
...
]
...
]
...
]
...
}
Il y a 300 listes, contenant chacune 10 sous-liste, et ainsi de suite pour chaque sous-liste. Au total cela fait 30 millions de balise "list", toute vide. Ce n'est même pas le maximum permis par Minecraft, mais c'est suffisant pour cette attaque. Cela represente un volume de donnnée de 26.6Mo, mais grâce à la compression des données transitant entre le client et le serveur cela ne fait que 39 ko à envoyer (ce genre de données répétitives se compresse très bien).
Quand le serveur reçoit les données, il va les décompresser, cela va donc prendre a nouveau 27Mo d'espace mémoire, mais ce n'est pas ça qui va le tuer. Le problème c'est qu'il va lire ces données textuelles pour les convertir en une reprentation objet en mémoire. Cela va créer des millions d'objet en mémoire, des objets complexes (des listes), ce qui va finir par saturer ses ressources: processeur et mémoire, jusqu'à créer un crash du serveur.
Cette faille existe dans toutes les versions de Minecraft, incluant la 1.8.3 et toutes les versions précédentes.
ammar2 propose des solutions pour corriger cette faille:
-
Il ne faudra pas permettre au client d'envoyer des structures complexes (NBT) sans limitation
-
Il faudrait définir des limitations sur la taille et la profondeur de recursion sur ces structures
Le script d'exploitation:
Afin de prouver ses dires, ammar2 à créer un script qui exploite cette faille, il l'a partagé en open source sur
github. C'est un script créer dans le langage Python, il est capable de se connecter à un serveur avec un login et mot de passe d'un joueur, puis il lance l'exploitation de la faille.
Pourquoi cette annonce ?
ammar2 a beaucoup réfléchit avant d'annoncer publiquement cette faille, d'un coté il ne souhaite pas exposé des milliers de serveurs, et des centaines de milliers de joueurs. Mais d'un autre coté Mojang a eut sa chance, mais ils n'ont pas répondu à ses alertes. Selon lui Mojang n'est plus une petite start-up independante, aujourd'hui Mojang vaut des milliards d'euros, et est l'auteur d'un des jeux les plus populaires de l'histoire du jeux vidéo. Il est de leur responsabilité de corriger les failles de leurs jeux. Enfin il rappel que de ne pas respecter les personnes qui aime Minecraft et qui travaillent bénévolement pour améliorer le jeu, en ignonrant les alertes et sans apporter de réponse, est la meilleure méthode pour être sur que la prochaine fois ces mêmes personnes ne les aideront plus.
La réponse de Mojang:
Bien entendu, Mojang a immédiatement réagit.
Dinnerbone explique ainsi que la faille avait bien été corrigé, mais selon lui elle serait revenu lors de la réécriture de certaines parties de Minecraft.
Il semblerai que la communication se soit perdu dans les emails de Grum, Dinnerbone le défent en expliquant que ammar2 n'a pas utilisé la procédure normal et que c'est donc de sa faute.
Mojang prend en tout cas cette menace très au sérieux. Dans les minutes qui ont suivit cette publication une réunion d'urgence a été organisé pour définir comment corriger la faille. Ils travaillent désormais activement sur la création de la version 1.8.4 qui corrigera cette faille, et espèrent une sortie très rapide.
Autant c'est paronnable pour un petit logiciel fait sur le coin de la table par un indepant qui fait ca le soir en rentrant du boulot. Autant pour une société multinationnal qui génère des millards de chiffres d'affaire c'est incomprehensible.
Quand je vois la procédure de test automatisé effectué par le petit jeu Factorio (dont j'ai déjà parlé): Un serveur de test automatique vérifie chaque version. Le serveur de compilation (qui créer les package a téléchargé) lance autoamtiquement la procedure de test a chaque version. Si un test échoué, il ne peuvent pas sortir la version.
Quand un bug est reporte, un nouveau test est créer pour tester le bug. ainsi une fois que le bug est corriger, il ne pourra jamais revenir, sinon le test échouerait. C'est ce qu'on appelle les test de non regréssion.
Chez Minecraft on a l'impression que rien n'est tester, c'est fait à l'arrache sur un coin de table, et on balance le truc à la communauté en se disant qu'il y a tellement de monde que les bugs seront bien découvert un jour.
Dinnerbone a rassurer que reddit en disant qu'il y avait bien des test de Minecraft, mais que ça ne couvrait pas le jeu en entier. Il ne dit pas de quel type de test, ni la couverture du code testé, dommage.
Enfin, dernière remarque, je trouve ça vraiment horrible de lire "ammar2 n'a pas utilisé la procédure normal et que c'est donc de sa faute". C'est une blague ? un bénévole a la gentillesse de leur reporté un problème majeure dans leur logiciel, et c'est de sa faute ??? Comment peut-on traiter des personnes qui ont donnée autant de leur énergie pour les aider avec autant de mépris ???
Maintenant que Mojang a été racheté par Microsoft, il serait bien que Microsoft applique sa propre politique de gestion des failles: Sur Windows, lorsqu'une faille est découverte, Microsoft demande a la personne qui a découvert la faille un délai de 3mois avant de pouvoir l'annoncer publiquement. C'est un delais fixe, c'est ensuite à Microsoft de garantir que la faille sera corriger dans ce delais, c'est une énorme pression sur leur épaule. Chez Mojang c'est inscrit sur un bug tracker et en attente de résolution... un jour peut être.
Bien que j'ai peur pour tous les serveurs Minecraft, je suis comptant de voir que Mojang se bouge enfin :) Et j'espère que cette incident leur servira de leçon, et que cela aura pour conséquence une amélioration de leur service/gestion d'incident/procédure de test.