2 points par GN⁺ 2024-01-15 | 1 commentaires | Partager sur WhatsApp

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

 
GN⁺ 2024-01-15
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.

    • Partage son expérience d’une réponse à une question similaire sur l’« inversion de RNG » sur StackOverflow. Les RNG de Java et de MSVC utilisent tous deux une conception LCG, ce qui permet des attaques similaires.
  • 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.

    • Suppose qu’il serait possible d’exploiter cela sous certaines conditions si le serveur utilise le même RNG.
  • 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.

    • Souligne le problème du RNG congruentiel linéaire, qui ne génère qu’un nombre limité de valeurs avant de boucler, et insiste sur la nécessité d’améliorer l’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.

    • Partage le fait que WoW a éveillé son intérêt pour la programmation. Il a acquis des compétences techniques grâce aux serveurs privés et à l’apprentissage de Lua.
  • 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.

    • Cite le point de vue de John von Neumann sur la génération de nombres aléatoires. Souligne qu’une procédure arithmétique stricte n’est pas une méthode de génération aléatoire.
  • 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.

    • Partage son expérience d’un script utilisé à l’hôtel des ventes de WoW pour obtenir de l’or à l’infini.
  • Un utilisateur mentionne un cas où Hacker News a été piraté à cause d’un RNG faible. Il fournit un lien connexe.

    • Évoque un cas où Hacker News a été compromis à cause d’un RNG faible, en soulignant le problème de sécurité.
  • Un utilisateur emploie l’expression « quand les variables ne varient pas et que les constantes ne sont pas constantes ».

    • Utilise une formule satirique sur le rôle des variables et des constantes en programmation.
  • 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.

    • Dit avoir entendu que les addons de WoW utilisaient les messages privés comme canal de communication, et estime que les gens finissent toujours par trouver et exploiter ce genre de méthode.
  • À 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.

    • Souligne qu’un RNG imparfait peut suffire dans des contextes peu critiques comme les jeux, mais que sa fiabilité est cruciale lorsque des enjeux financiers ou de sécurité entrent en compte.