Trivial C# Random Exploitation

2 minute de lecture

Mis à jour :

Voici un résumé concis de l’article de cybersécurité :

Exploitation de Générateurs de Nombres Aléatoires en C# via des Jetons de Réinitialisation de Mot de Passe

Cet article détaille comment une faiblesse dans l’implémentation du générateur de nombres pseudo-aléatoires (PRNG) System.Random en C# peut être exploitée pour un détournement de compte. L’auteur a découvert une vulnérabilité critique dans un service web qui générait des jetons de réinitialisation de mot de passe en utilisant la méthode new Random().Next(min, max) sans spécifier de graine (seed).

Points Clés et Vulnérabilité :

  • Utilisation non sécurisée de System.Random: L’implémentation par défaut de System.Random utilise Environment.TickCount comme graine, ce qui correspond essentiellement à l’horodatage du système.
  • Collision de graines: Lorsque de nouvelles instances de Random sont créées dans une fenêtre temporelle très courte (typiquement 1 milliseconde), elles peuvent partager la même valeur de graine et, par conséquent, produire la même séquence de nombres aléatoires.
  • Exploitation par course (Race Condition): En soumettant deux requêtes de réinitialisation de mot de passe en succession rapide, il est possible que les deux requêtes génèrent le même jeton. Si l’une de ces requêtes est dirigée vers le compte d’un administrateur et l’autre vers un compte contrôlé par l’attaquant, ce dernier peut utiliser le jeton obtenu pour accéder au compte de l’administrateur.
  • Méthodologie “Black-Box”: L’attaque peut être réalisée sans accès au code source, en utilisant des outils comme Burp Suite pour envoyer des requêtes dans une fenêtre temporelle très réduite et observer les jetons générés.

Vulnérabilités Spécifiques :

L’article ne mentionne pas de CVE spécifiques pour cette vulnérabilité elle-même, mais elle découle de l’utilisation inappropriée de System.Random pour des tâches critiques nécessitant une sécurité cryptographique. L’exploitation exploite directement le comportement de System.Random lorsque celui-ci est initialisé sans graine explicite.

Recommandations :

  • Utiliser System.Security.Cryptography.RandomNumberGenerator: Pour toutes les opérations nécessitant des nombres aléatoires sécurisés sur le plan cryptographique, telles que la génération de mots de passe ou de jetons de sécurité, il est impératif d’utiliser RandomNumberGenerator plutôt que System.Random.
  • Vérifier la documentation: Toujours consulter la documentation des bibliothèques utilisées, en particulier la section “Remarks” pour les informations de sécurité relatives aux générateurs de nombres aléatoires.
  • Éviter l’initialisation sans graine: Si l’utilisation de System.Random est inévitable, il faut toujours fournir une graine unique et imprévisible pour chaque instance afin d’éviter les collisions.

L’article mentionne également une partie “bonus” qui explore la possibilité mathématique de prédire et d’inverser le comportement de l’ancien algorithme de System.Random via une analyse des opérations modulo une valeur spécifique (MBIG = Int32.MaxValue), mais l’exploitation la plus simple et immédiate repose sur la collision des graines dues à l’initialisation par Environment.TickCount.


Source