WTF : il parvient à jouer à DOOM avec des enregistrements DNS

Vous le savez déjà, la question "Can it run DOOM?" est une tradition sacrée de l'informatique depuis les années 90. Calculatrices, tests de grossesse, thermostats, neurones humains cultivés en labo : rien n’est épargné.
Mais Adam Rice, chercheur en sécurité et créateur de challenges CTF ("Capture the Flag"), a trouvé un nouveau support auquel personne n’avait (sans grande surprise) pensé : le DNS.
Oui, le protocole de résolution de noms de domaine. La couche la plus invisible de votre stack réseau, le truc le plus ennuyeux d'Internet, celui qu'on oublie systématiquement jusqu'au jour où notre site ne répond plus, où tout semble pété, et où après 45 minutes de debug acharné vous réalisez que le coupable, c’était juste ce bon vieux DNS.
Le key-value store que personne n'a demandé
Le raisonnement de Rice est d'une logique imparable : les enregistrements de type TXT du DNS peuvent contenir à peu près n'importe quoi. À la base, ils servent surtout à prouver qu'un domaine vous appartient (validation SPF, DKIM, Google Search Console…), mais dans les faits, personne ne vérifie vraiment ce qu'on y met.
Chaque record peut stocker environ 2000 caractères, et une zone DNS peut en contenir des milliers. Le tout est distribué mondialement, mis en cache sur des serveurs répartis aux quatre coins du globe, et interrogeable par quiconque dispose d'une connexion internet.
Autrement dit, le DNS peut être vu comme une espèce de base de données clé-valeur gratuite, distribuée mondialement et sans serveur à gérer.
Comme l’explique Rice sur son blog : si on peut y stocker des données arbitraires, on peut techniquement y stocker un fichier, et si on peut y stocker un fichier, on peut techniquement y stocker un programme.
Il a d'abord testé le concept avec une photo de canard encodée en Base64, découpée en petits morceaux de 2000 caractères chacun et uploadée en TXT records. Le canard est parti en morceaux dans le DNS, il en est ressorti intact avec des hashes identiques. Proof of concept validé.

Il a ensuite envisagé d'y stocker un film entier, mais 1 Go de données nécessiterait environ 670 000 records répartis sur des centaines de domaines. Tester oui, mais pas à l’excès.
Un annuaire qui fait tourner des FPS
Pour DOOM, ça tombe bien, les chiffres sont plus raisonnables. Après compression, le fichier WAD passe de 4 Mo à 1,7 Mo et les DLL du moteur de jeu de 4,4 Mo à 1,2 Mo.
Le tout tient dans environ 1 966 enregistrements TXT sur une seule zone Cloudflare Pro (le tier gratuit plafonne à 185 records, ce qui obligerait à dispatcher DOOM sur une dizaine de domaines différents). L'upload des quelques 2000 records via l'API Cloudflare a pris environ 15 minutes.

Côté moteur, il a utilisé managed-doom, un port C# pur du jeu original. Le problème : le port lisait ses données depuis le disque dur et compilait en exécutable natif, deux choses incompatibles avec l'idée de tout charger en mémoire.
Rice a donc patché le code pour accepter des MemoryStreams, remplacé la bibliothèque de fenêtrage par des appels Win32 directs, et viré l'audio pour économiser de la place. DOOM tourne sans le moindre son, mais à ce niveau de cursed, les démons n’ont plus vraiment besoin d'hurler.
Petit aparté : Rice explique s'être appuyé sur Claude (l'IA d'Anthropic) pour les bouts de C#, langage qu'il ne maîtrise pas (on appréciera la transparence).
Du DNS au frag en quelques secondes
Le script de lancement fait environ 250 lignes de PowerShell. Il résout les quelques 2000 requêtes DNS en 10 à 20 secondes, réassemble tout en mémoire, charge les assemblies .NET par réflexion et lance le jeu.
Rien n'est écrit sur le disque, rien n'est installé, aucune dépendance supplémentaire n'est requise.

Le DNS a bientôt 45 ans. Il a été conçu pour mapper des noms d'hôtes vers des adresses IP, point. Quand l'IETF (l'organisme qui définit les standards techniques d'Internet) a rédigé le RFC 1035 en 1987, personne n'imaginait qu'on s'en servirait un jour pour distribuer un FPS. Et pourtant, le protocole le plus soporifique d'Internet se révèle aussi l'un des plus détournables.
Le code source complet est disponible sur GitHub, pour celles et ceux parmi vous qui voudraient transformer leur registrar en salle d'arcade.
À propos de l'auteur
Nicolas Lecointre
Chief Happiness Officer des développeurs, ceinture noire de sudo. Pour rire, j'ai créé Les Joies du Code. J'utilise Vim depuis 10 ans parce que je sais pas comment le quitter.
À lire également

Passbolt : le gestionnaire de mots de passe open source que votre équipe mérite vraiment
Je connais l’histoire, vous la connaissez, on la connaît tous. Le stagiaire qui est resté six mois, qui a fini par avoir accès à un peu (beaucoup) plus de choses...
Articles similaires

Chat Control rejeté : le Parlement européen dit stop au scan de vos messages

Pour surfer sur la crise, un développeur crée un Démineur sur le détroit d'Hormuz


13 ans plus tard, la Xbox One réputée imprenable se fait hacker

Chat Control rejeté : le Parlement européen dit stop au scan de vos messages

Pour surfer sur la crise, un développeur crée un Démineur sur le détroit d'Hormuz

Les RFC : qu’est-ce qui se cache vraiment derrière la théière ?

13 ans plus tard, la Xbox One réputée imprenable se fait hacker
Plus de contenu

Quand on m'annonce que je vais devoir reprendre tout ce qu'a développé le dernier stagiaire

Quand le chef s'engage sur un délai de livraison sans même nous consulter

Alors, ça donne quoi tes tests ?

Non mais faut pas pousser non plus, oh
Quand je déclenche un build vendredi soir et que je pars en week-end sans me retourner

Quand on m'annonce que les specs viennent encore de changer

Quand mon nouveau dev s'intègre parfaitement dans le projet

Ah ben oui mais normal aussi

Quand on m'annonce que je vais devoir reprendre tout ce qu'a développé le dernier stagiaire

Quand le chef s'engage sur un délai de livraison sans même nous consulter

Alors, ça donne quoi tes tests ?

Non mais faut pas pousser non plus, oh
Quand je déclenche un build vendredi soir et que je pars en week-end sans me retourner


