When Random Isn't
- Il s’agit d’une anecdote vieille d’environ 10 ans, merci de faire preuve d’indulgence pour les passages dont je ne me souviens pas exactement, ayant perdu le vrai code.
- Certains détails ont été simplifiés afin que toute personne intéressée par la sécurité informatique puisse apprécier le récit.
- À 14 ans, j’ai découvert World of Warcraft et j’en suis devenu accro.
- J’ai découvert les add-ons permettant de modifier l’interface utilisateur du jeu, puis j’ai commencé à en créer moi-même.
- Les add-ons, écrits dans le langage de programmation Lua, se composaient de quelques fichiers source
.lua.
- J’étais fasciné par le fait que le jeu charge et exécute du code source que j’avais moi-même écrit.
Sécurité des add-ons
- Le fait de permettre aux utilisateurs d’avoir des add-ons programmables peut sembler être une mauvaise idée, car cela peut entraîner des bots.
- Le système conçu par Blizzard était toutefois assez ingénieux pour empêcher les comportements programmatiques arbitraires.
- La plupart des éléments de l’interface étaient purement décoratifs ou informatifs et n’étaient soumis à aucune restriction.
- Les API de collecte d’informations, comme un appel renvoyant les points de vie du personnage, n’étaient pas limitées.
- En revanche, certains appels d’API étaient protégés afin de ne pouvoir être invoqués que par le code officiel de Blizzard.
- La plupart des API liées à l’exécution d’actions réelles dans le jeu étaient protégées.
- Les API permettant d’obtenir la position dans le monde et l’orientation de la caméra ont elles aussi été protégées à un moment donné.
- Si l’on voulait créer un bouton lançant un sort précis, on pouvait créer un bouton spécial qui exécute du code dans un environnement sécurisé au clic.
- Ces boutons ne pouvaient pas être créés, détruits ou déplacés pendant un combat, afin d’empêcher l’automatisation en plein affrontement.
- L’environnement sécurisé permettait de définir par programmation quel sort lancer, mais n’autorisait pas la collecte d’informations nécessaire à une automatisation arbitraire.
Un canal dérobé
- Quelques années plus tard, en m’intéressant à une programmation plus « sérieuse », j’ai presque cessé de jouer à World of Warcraft.
- Je continuais pourtant à penser à la possibilité de neutraliser l’environnement sécurisé.
- Au lieu d’utiliser un logiciel tiers, je voulais relever le défi en n’employant que des outils techniquement autorisés.
- J’ai découvert que la fonction
random figurait dans la liste des fonctions autorisées dans l’environnement sécurisé, et j’ai imaginé un moyen de m’en servir pour faire passer des informations en contrebande.
Les déboires du générateur de nombres aléatoires
- Il s’est avéré que
random n’était qu’un simple wrapper autour de la fonction rand du C.
- L’implémentation de
rand était un générateur congruentiel linéaire simple et faible.
- J’ai développé une méthode pour rétroconcevoir l’état interne du RNG et transmettre des informations de cette manière.
Assemblage final
- Une fois capable de rétroconcevoir l’état interne du RNG, j’ai pu prendre des décisions d’automatisation arbitraires dans l’environnement sécurisé.
- J’accédais aux informations dans l’environnement non sécurisé pour prendre une décision, puis j’exécutais dans l’environnement sécurisé l’action « aléatoirement » choisie.
Conclusion
- J’ignore quand Blizzard a corrigé le problème lié à l’état du RNG, à la fois faible et partagé, ni même s’ils avaient conscience du problème.
- Lorsque j’ai réessayé le code quelques années plus tard, il ne fonctionnait plus.
- Il s’agissait d’exploiter une faille de niche dans un jeu vidéo que je ne voulais en réalité pas utiliser ainsi, mais il y avait quelque chose de presque magique dans le fait de manipuler ce qui semblait être du hasard.
L’avis de GN⁺
- Cet article offre un exemple intéressant autour de la sécurité informatique et de la programmation.
- L’exploration d’une méthode créative pour contourner la sécurité dans un jeu met en lumière l’importance des compétences en programmation et la prise de conscience des vulnérabilités potentielles.
- Ce récit sur l’exploitation des faiblesses d’un RNG constitue un exemple instructif qui rappelle aux développeurs l’importance de la sécurité et des algorithmes.
1 commentaires
Commentaires Hacker News
Un utilisateur mentionne avoir répondu il y a quelques mois sur StackOverflow à une question sur l’« inversion de RNG (générateur de nombres aléatoires) ». Il avait attaqué le RNG de Java, qui utilise une conception LCG (générateur congruentiel linéaire) similaire à celle du RNG de MSVC, en produisant une troncature de l’état interne, si bien que la méthode d’attaque est très similaire.
Un autre utilisateur suppose que si le serveur utilise le même RNG, alors avec un serveur peu chargé, un ping faible, la capacité d’obtenir une fenêtre précise sur l’état actuel du RNG, et la capacité de générer rapidement d’autres événements à forte volatilité économique, il serait théoriquement possible d’en tirer parti.
Un autre utilisateur souligne que le RNG congruentiel linéaire donné ne produit que 12 445 nombres distincts avant de se répéter, et mentionne qu’il serait raisonnable d’utiliser de meilleurs paramètres pour cet algorithme.
Un utilisateur explique que World of Warcraft (WoW) a été à l’origine de son intérêt pour la programmation : le jeu est sorti quand il avait 6 ans, puis l’apparition des serveurs privés l’a amené à vouloir créer ses propres PNJ. Cela l’a conduit à apprendre Lua, à compiler un core de serveur privé, à utiliser SVN, à appliquer des patchs, etc.
Un utilisateur partage une citation de John von Neumann disant que toute méthode de génération de nombres aléatoires est un péché, et affirme qu’une procédure arithmétique stricte n’est pas une méthode de génération de nombres aléatoires.
Un utilisateur raconte avoir écrit un script pour l’hôtel des ventes de WoW, capable de scanner toutes les enchères, d’acheter les objets sous-évalués et de les remettre en vente. Si quelqu’un baissait son prix, le script pouvait annuler l’enchère et la republier à un prix légèrement inférieur.
Un utilisateur mentionne un cas où Hacker News a été piraté à cause d’un RNG faible. Il fournit un lien connexe.
Un utilisateur emploie l’expression « quand les variables ne varient pas et que les constantes ne sont pas constantes ».
Un utilisateur, qui n’a pas joué à WoW, dit avoir entendu dire que de nombreux addons utilisaient les messages privés comme moyen de communication. Il ajoute que s’il existe un moyen, les gens finiront par le découvrir et l’utiliser.
À propos des incitations économiques liées au RNG, un utilisateur explique que lorsqu’il n’y a rien de réellement en jeu (par exemple dans un jeu), un RNG imparfait peut suffire. En revanche, quand de l’argent est en jeu ou que la sécurité est critique (par exemple pour un portefeuille de cryptomonnaies ou un casino en ligne), la qualité du RNG devient essentielle.