Analyse : Dopewars 1.5.12 Server Denial of Service

Auteur: 
ekse

Dans cet article, je fais l'analyse d'un Denial of Service découvert dans le serveur du jeu Dopewars 1.5.12. Le bug a été découvert par dougtko et l'avis original peut-être lu ici : http://seclists.org/bugtraq/2009/Oct/36.

Le problème est rencontré lorsqu'un joueur utilise un jet pour se déplacer. Le code fautif est le suivant :

serverside.c : ligne 505
case C_REQUESTJET:
i = atoi(Data);
...
Plus loin, la valeur est utilisée de cette façon :
else if (i != Play->IsAt && (NumTurns == 0 || Play->Turn <>EventNum == E_NONE && Play->Health > 0) {
dopelog(4, LF_SERVER, "%s jets to %s", GetPlayerName(Play), Location[i].Name);
...
Location est un tableau de structures LOCATION qui représentent les villes du jeu. Comme le jeu ne contient que 8 villes, il est possible de lire bien en dehors du tableau. En utilisant une adresse suffisamment grande, une lecture en dehors de la limite de la mémoire du programme sera tenté ce qui cause un erreur de segmentation et fait planter le serveur.

Pour corriger le problème, le code suivant a été ajouté après avoir récupéré la valeur de i :

/* Make sure value is within range */
if (i <>= NumLocation) {
dopelog(3, LF_SERVER, _("%s: DENIED jet to invalid location %s"), GetPlayerName(Play), Data);
break;
}