Bonjour !
Je souhaite vous présenter un système de messagerie qui fonctionne uniquement avec des requêtes DNS. L’idée de base est de pouvoir communiquer depuis un avion en vol avec des gens sur le plancher des vaches.
Introduction
Communiquer en avion avec le sol ? Bah tu te connectes au réseau Wi-Fi de l’avion et basta, pourquoi vouloir faire compliqué ?
Parce qu’en avion, la connexion Wi-Fi coûte très cher et est très instable. Et la personne pour qui j’ai conçu le système n’avait pas envie de payer 50 euros pour un service médiocre pendant 10 heures de vol.
Alors oui, ma solution nécessite un accès à Internet à bord, mais pas de vider son porte-monnaie. En effet, la quasi-totalité des points d’accès Wi-Fi laissent passer les requêtes DNS sans trop de filtrage. En exploitant cela, on peut donc envoyer et recevoir des messages contenus à l’intérieur de requêtes DNS.
DNS, DNS, c’est quoi à la fin ?
Pour faire simple, le DNS est un système permettant d’interroger un serveur pour connaitre l’adresse IP associée à un nom de domaine, comme zestedesavoir.com. Les messages de ce type sont rarement filtrés et on peut y faire transiter ce qu’on veut. Ainsi, en exploitant les spécificités du système, on peut communiquer à peu près ce qu’on veut… moyennant un peu de travail en amont.
La mise en place de Chatavion est expliquée sur la page GitHub du projet. Le système est à l’état de prototype et fonctionne sous NodeJS, il s’adresse pour le moment à un public de geeks et autres bidouilleurs. Si quelqu’un veut faire une vrai appli Android ou iOS, c’est avec plaisir ! Le fonctionnement est schématisé dans ce post. Pour comprendre d’où sort ce projet, un petit retour en arrière s’impose.
2012, découverte de l’IP over DNS
C’est au début de la décennie que je découvre le concept d’IP over DNS. Il consiste à faire passer tout son trafic réseau sous forme de requêtes DNS qui arrivent jusqu’à un serveur, qui fait office d’intermédiaire, et qui renvoie les retours sous forme de réponses DNS. Après un bon moment à comprendre et mettre en place un tel système, je l’éprouve avec succès sur des hotspots Wi-Fi belges et français, le tout sans avoir besoin de compte associé à l’opérateur.
Un peu plus tard dans l’année, je tombe à court de crédit data sur mon smartphone. À l’époque, mon abonnement ne me permettait d’utiliser seulement 250 Mo par mois - c’était il y a seulement 7 ans ! Toutefois, je me rends compte que mon opérateur laisse quand même passer les requêtes DNS. Je commence à m’imaginer des programmes de transmission d’informations simples over DNS, comme la météo ou des tirages de loterie. Ça en restera au stade d’idée.
2014, réseau pourri sur toute la ligne
Alors que je prenais le train pour la Normandie, je souhaite aller sur Twitter. Il faut savoir que sur les lignes Paris-Normandie, on voyage dans des boites de conserve (ça va changer en 2020 \o/). Pas de Wi-Fi et un réseau mobile quasi inexistant dès qu’on s’éloigne des villes. Contemplant avec dépit le "G" m’indiquant que je ne dispose que d’une connexion GPRS, je me dis qu’une requête DNS, ça devrait passer. Je commence alors à concevoir une preuve de concept qui permet d’envoyer un tweet avec un réseau pourri, au moyen d’une seule requête DNS. N’étant pas développeur et n’ayant pas le courage de me former à des choses que je ne connais pas, je bricole et adapte quelques morceaux de code dans les seuls langages que je connais à peu près : le C et le bash.
2019, long-courrier et petits messages
Quelques mois avant un long voyage en avion, une amie me dit que sa mère risque de s’inquiéter pendant le vol. En se renseignant auprès de la compagnie aérienne, on apprend que la plupart des avions sont équipés d’une connexion Wi-Fi mais les tarifs sont "carrément abusés". Je ressors des cartons la POC mentionnée ci-dessus et la modifie pour que le message n’aille pas sur Twitter, mais sur une page web quelconque. Puis je tente quelque chose pour essayer de vérifier si le message a été bien envoyé. Du bricolage. Puis je rebricole par-dessus pour essayer de savoir s’il a été lu. Puis finalement, je passe plusieurs jours (voire nuits) à faire en sorte de pouvoir recevoir les messages, et que les gens sur Terre puissent en ajouter de manière simple (une bête page PHP). Au final, je réussis à utiliser le système dans un TGV sans m’authentifier. Quelques adaptations auront été faites jusqu’au départ. Et à bord du vol pour Tokyo, les choses fonctionnent à peu près : l’envoi de messages ne pose aucun souci, mais la réception est plus compliquée, certains caractères ne s’affichent pas. Cela n’a pas empêché leur lecture en faisant manuellement des requêtes DNS.
Suite à ce succès, j’ai décidé de partager ce projet. Tout le code est disponible sur GitHub, je suis ouvert aux propositions d’amélioration. Le programme d’origine tel que je l’ai utilisé en vol est disponible dans la branche first. C’est un assemblage bancal de programmes bash et C, rien à voir avec la version actuelle (branche master) entièrement en NodeJS !
Je peux aussi vous aider à monter votre Chatavion si le mode d’emploi est trop compliqué.
L’interface utilisateur est très austère, c’est de la ligne de commande, utilisable dans un émulateur de terminal sous Android (Termux). N’ayant aucune compétence en développement mobile, je serais ravi si quelqu’un d’aventureux souhaitait créer une véritable appli. L’image suivante date de la toute première version, mais ça n’a pas évolué des masses.
Pour rappel, c’est un prototype à la stabilité hasardeuse. Gardez ça en tête si vous tentez de monter votre Chatavion. Par ailleurs, les adresses de mes serveurs Chatavion ont été modifiées sur GitHub. Le système n’est absolument pas sécurisé, tous les messages peuvent potentiellement être interceptés et lus, en particulier sur les réseaux ouverts type hotspot.
Je vous laisse avec ce magnifique photomontage qui m’a pris une demi-heure.
Mise à jour 2023
2022 - 2023 : la concrétisation d’un rêve
Eh oui, l’histoire ne s’arrête pas là. Depuis que j’ai présenté ce projet ici, j’ai toujours voulu en faire une application facile d’utilisation. Mes compétences en développement mobile ne me permettent pas de m’y atteler, mais c’était sans compter sur un message Linkedin d’un ancien professeur sur lequel je tombe par une chance inouïe au bon moment. Pour faire court, cela m’a permis de présenter Chatavion à l’université Gustave Eiffel, et 6 mois plus tard, avec un groupe d’élèves ingénieurs qui ont été assez fous pour accepter le projet, nous avons rendu publique l’application Android dont je rêvais.
Communautés actuellement ouvertes au public : default@chatavion.com et public@chatavion.com - vous pouvez me demander pour en ouvrir d’autres sur le serveur chatavion.com, ou créer votre propre serveur.