Contexte technique
Lors de la création du premier compte utilisateur, Windows XP parcourt le répertoire %ALLUSERSPROFILE%\Default Pictures pour choisir une image d’accueil. Le système utilise la fonction native RtlRandomEx comme générateur de nombres pseudo‑aléatoires, initialisé avec la valeur renvoyée par GetTickCount(). Cette valeur représente le nombre de millisecondes écoulées depuis le démarrage du système, ce qui fournit un point d’entrée déterministe mais dépendant du moment exact de la création du compte.
Algorithme de sélection
L’opération repose sur un algorithme à passe unique, variante du reservoir sampling avec k=1. Au lieu de compter d’abord le nombre total de fichiers puis de choisir un indice aléatoire – ce qui impliquerait deux accès disque – l’algorithme parcourt chaque fichier une seule fois et décide à chaque itération s’il devient le nouveau « gagnant ». La probabilité d’accepter le i‑ème fichier est 1/i, garantissant une distribution uniforme sur l’ensemble des éléments rencontrés.
selectRandomFromIterator(iterator)
{
var count = 0;
var winner = null;
while (iterator.moveNext()) {
++count;
if (uniform_random(min: 1, max: count) == count) {
winner = iterator.current();
}
}
return winner;
}
Implémentation concrète
Le code source de Windows XP invoque RtlRandomEx à chaque appel de uniform_random. Le générateur utilise un algorithme linéaire congruentiel à 32 bits, dont la période est suffisante pour les besoins du système d’exploitation, mais dont la sortie reste prévisible si l’on connaît la graine initiale. Étant donné que GetTickCount() ne dépasse pas 2³² ms (environ 49,7 jours), un attaquant disposant d’une estimation de l’heure de création du compte peut reproduire la séquence et deviner l’image sélectionnée.
Implications et limites
Le choix d’une passe unique réduit le nombre d’appels au système de fichiers, ce qui améliore les performances lors du premier démarrage du compte. La limitation à 100 images constitue une mesure de sécurité contre les répertoires contenant un nombre excessif de fichiers – par exemple un répertoire rempli de millions de fichiers ralentirait le processus et augmenterait le risque de débordement de compteur. Cette coupure introduit toutefois un biais statistique minime : les images situées après la centième position sont tout simplement ignorées, ce qui réduit légèrement l’uniformité si le répertoire dépasse cette taille.
En résumé, Windows XP combine un générateur de nombres pseudo‑aléatoires basé sur le temps d’exécution avec un algorithme de réservoir sampling à passe unique, optimisé pour la rapidité et la robustesse face aux modifications du répertoire. La prévisibilité du seed et la borne de 100 fichiers sont les seules faiblesses notables, mais elles restent peu exploitables dans un contexte d’utilisation standard.