Une bibliothèque de livres interdits dans une ampoule connectée en Wi‑Fi
(richardosgood.com)- Banned Book Library est un projet de dead drop numérique qui transforme une ampoule connectée en Wi‑Fi en point d’accès ouvert et en serveur web, afin que les appareils à proximité puissent accéder à des livres électroniques tant que l’ampoule est allumée
- Le matériel de départ est une ampoule avec ESP32C3 4MB et Tasmota préinstallé, et la principale contrainte a été d’ajuster l’espace de stockage pour y faire tenir à la fois le firmware, le site web et les fichiers des livres, à cause de la faible capacité de flash
- L’ajout d’une carte microSD a été abandonné, car la soudure à l’intérieur de l’ampoule, le retrait de la carte et un remontage sûr étaient trop difficiles ; à la place, la table de partitions a été modifiée pour faire passer l’espace de stockage des fichiers de 320KB à 2MB
- Comme Arduino seul ne permettait pas d’accéder aux zones protégées de la flash, le projet a utilisé ESP-IDF avec Arduino as a Component, et a mis en place un chemin de mise à jour avec un firmware safeboot distinct et ElegantOTA
- L’application web finale comprend une liste de livres, un panneau d’administration, une fonction de restauration et un portail captif ; à cause de la limite des 4MB, chaque ampoule ressemble davantage à une bibliothèque personnelle de quelques ouvrages choisis qu’à une vaste collection
Vue d’ensemble
- Le projet est né de l’idée de modifier une ampoule connectée en Wi‑Fi pour fournir un point d’accès Wi‑Fi ouvert et un serveur web de livres interdits
- Tant que l’ampoule est allumée, les utilisateurs à proximité peuvent accéder, avec n’importe quel appareil Wi‑Fi, aux contenus stockés dans l’ampoule
- La forme d’une ampoule la rend peu visible, son coût est relativement faible, et elle a été pensée comme un dead drop numérique à laisser dans différents endroits d’un quartier
- L’idée s’inspire de la nouvelle Library de Ben Brown, où la « bibliothèque » sert d’archive numérique pour conserver des créations, des manuels, des modèles 3D et d’autres documents qui ne devraient pas disparaître d’Internet
- Le travail concret a commencé il y a quelques mois, et le résultat a été publié sous le nom de Banned Book Library
Matériel
- Après avoir présenté l’idée lors d’une rencontre DEFCON locale, l’auteur s’est penché sur Tasmota
- Tasmota est un firmware open source pouvant être installé sur divers appareils connectés pour les intégrer à des systèmes domotiques comme HomeAssistant
- Son objectif principal est de permettre un contrôle local des appareils sans dépendre de services cloud
- De nombreux appareils connectés reposent sur des services cloud susceptibles de changer ou de disparaître avec le temps, et Tasmota permet de les remplacer par un hébergement interne
- L’auteur n’a finalement pas modifié Tasmota directement, mais a trouvé un vendeur d’ampoules Wi‑Fi livrées avec Tasmota préinstallé
- La page produit indiquait que l’ampoule utilisait un
ESP32C3 4MB - Les broches GPIO pour piloter les LED étaient aussi documentées, ce qui s’est révélé utile par la suite
- Le mapping des broches était
R=GPIO6,G=GPIO7,B=GPIO5,CW=GPIO3,WW=GPIO4
- La page produit indiquait que l’ampoule utilisait un
- Tasmota disposant d’une mise à jour OTA du firmware, il semblait possible d’installer un firmware personnalisé sans démonter l’ampoule
- Le plus gros problème était la flash de 4MB, qui devait contenir à la fois le firmware, le site web et les fichiers des livres
- Deux ampoules ont été achetées, pour limiter les risques en cas de casse pendant les essais
Démontage
- La partie diffuseur en plastique blanc située en haut de l’ampoule a été retirée après deux découpes au cutter sur le pourtour puis une torsion
- À l’intérieur se trouvait une carte fille circulaire portant les LED, reliée à la carte inférieure par six broches
- Une partie de la carte principale remontait par le trou central ; il s’agissait de l’antenne de l’ESP32
- Le boîtier de l’ampoule et la carte fille étant en aluminium, l’ensemble semblait conçu pour préserver la réception Wi‑Fi
- Une fois la carte fille retirée, on a pu voir l’ESP32C3 et des composants semblant servir à l’alimentation et au pilotage des LED
- Plusieurs broches de l’ESP32 étaient exposées, laissant penser qu’il serait peut-être possible d’ajouter un lecteur de carte microSD
- Comme il était impossible d’introduire un fer à souder à l’intérieur de l’ampoule, il a fallu retirer la carte principale en grattant un composé d’enrobage caoutchouteux avec un couteau et un tournevis
- Le retrait de la carte principale était extrêmement pénible, et sa réinstallation ne semblait pas suffisamment sûre pour en faire une étape obligatoire d’un vrai déploiement en dead drop
- L’ampoule démontée a donc servi de plateforme de développement, avec des fils soudés sur VCC, GND, TX, RX et IO9 pour la programmation série
- Les emplacements de VCC, GND, TX et RX ont été repérés grâce à des photos du même module sur AliExpress montrant les étiquettes des broches
- GND a été relié à un blindage métallique facile à souder
- L’entrée en mode téléchargement se faisait en démarrant l’appareil avec IO9 relié à la masse
- L’intégralité du firmware a été extraite avec
esptool, ce qui a permis d’obtenir quelques minutes plus tardtasmota_original_firmware.bin
Premières expérimentations
-
Hello World
- Au départ, l’auteur voulait modifier le code source de Tasmota pour en faire Banned Book Library, mais le firmware s’est révélé plus complexe que prévu, avec une prise en charge de nombreuses architectures et de nombreux appareils
- Comme le projet voulait supprimer les fonctions inutiles et libérer de l’espace de stockage, l’idée de modifier Tasmota a été abandonnée
- Après avoir vérifié que l’ESP32 pouvait être programmé avec Arduino, l’auteur a configuré l’IDE Arduino
- Un programme Hello World basique a été téléversé pour envoyer un message sur le port série, confirmant qu’il était possible d’écrire directement un firmware personnalisé sur l’ampoule
-
Serveur web
- L’étape suivante consistait à mettre en place un point d’accès Wi‑Fi ouvert et un serveur web
- Un tutoriel de serveur web sur ESP32 a servi de base, mais il a été modifié car le contrôle des LED n’était pas l’objectif du moment
- L’implémentation a ensuite été portée vers Async Web Server à partir de tutoriels associés
-
Carte microSD
- Pour augmenter l’espace de stockage, une carte de développement microSD Sparkfun a été achetée
- Le câblage du lecteur SD a été déterminé à partir de la fiche technique de l’ESP32C3
- Un Adafruit ItsyBitsy ESP32 a été utilisé pour le prototype plutôt que l’ampoule réelle, car il était bien plus simple d’y souder des barrettes de broches et d’y connecter la microSD
- L’hébergement des fichiers du serveur web via microSD et LittleFS a fonctionné, mais l’approche a été abandonnée car elle était trop difficile à appliquer à la vraie ampoule
- Pour souder sur l’ESP32C3 de l’ampoule réelle, il aurait fallu sortir la carte de son boîtier, ce qui revenait presque à détruire l’appareil
- La réutilisation des broches de contrôle des LED a aussi été testée, mais dans cette architecture les GPIO ne pouvaient servir qu’en sortie pour activer des transistors et fermer le circuit vers la masse
- Un clamp imprimé en 3D destiné à se poser sur l’ESP32 pour faire contact avec les broches a même été conçu, mais il s’est avéré trop instable et peu fiable, et a été abandonné
Étude des contournements
- D’autres ampoules connectées ont été examinées pour voir s’il en existait de plus faciles à souder
- Plusieurs billets de démontage ont été trouvés, mais la plupart montraient des structures internes similaires à celle de l’ampoule utilisée
- Certaines ampoules utilisaient des puces autres que l’ESP32, mais comme l’auteur avait déjà appris à programmer l’ESP32, la recherche s’est concentrée sur des modèles basés sur cette puce
- L’une des ampoules achetées dans un magasin de bricolage local présentait une structure comparable, mais avec une protection en aluminium rendant le retrait sûr de la carte principale difficile
- Une Philips WiZ semblait prometteuse, car retirer le seul diffuseur en plastique exposait un ESP32C3-mini-1, mais il restait impossible d’accéder aux broches ESP32 nécessaires
- L’idée d’intégrer son propre circuit dans une ampoule LED classique a aussi été envisagée, mais elle se révélait encore plus complexe et spécialisée que le flash d’une ampoule Tasmota
- Au final, le choix a été de conserver l’ampoule Tasmota et de résoudre le problème dans la limite des 4MB
Le problème de l’espace de stockage
- Sur ESP32, la table de partitions est généralement stockée à l’offset flash
0x8000; cette zone a été extraite puis convertie en CSV pour en examiner la structure - Les partitions existantes étaient au nombre de cinq :
nvs,otadata,safeboot,app0,spiffsnvssert d’espace de stockage non volatil pour des paramètres comme le réseau Wi‑Fi, le mot de passe ou la couleur des LEDotadatasemble être liée aux mises à jour OTAsafebootest un firmware de démarrage séparé utilisé par Tasmota pour flasher le firmware principalapp0contient le firmware principalspiffsest une petite partition de système de fichiers destinée au stockage de fichiers ; ici, elle peut aussi représenter LittleFS
- Dans la configuration d’origine, le firmware principal occupait presque 3MB, safeboot presque 1MB, et il ne restait que 320KB pour les fichiers
- Comme le firmware personnalisé était plus simple que Tasmota, il semblait possible de réduire la taille de
app0et d’agrandirspiffs - La nouvelle configuration de partitions attribue à
spiffsune taille de0x200000, offrant 2MB d’espace de stockage pour les fichiers web et les livres - Modifier la table de partitions est risqué : en cas de corruption, l’appareil peut cesser de démarrer et ne plus être récupérable que par programmation série
- La fin de la table contient une somme de contrôle MD5, si bien qu’il ne suffit pas de changer les offsets et les tailles pour pouvoir redémarrer
- Déplacer la partition
app0en cours d’exécution empêcherait aussi de redémarrer sur ce firmware, il a donc fallu conserver son point de départ - Un nouveau CSV de partitions a été créé, transformé en table binaire avec
gen_esp32part.py, puis converti au format tableau C avecxxdafin d’être intégré danspartition.h - Une fonction a été écrite pour comparer le MD5 de la table actuelle à celui de la nouvelle, ignorer l’opération s’ils étaient identiques, sinon effacer la table puis écrire la nouvelle
- Dans l’environnement Arduino, l’accès aux zones protégées de la flash était bloqué, si bien que l’API renvoyait un succès sans permettre réellement de lire ou d’écrire la table de partitions
ESP-IDF
- ESP-IDF, le framework officiel pour ESP32, est plus complexe à configurer et à utiliser, mais offre un contrôle plus fin sur l’appareil et sur le framework lui-même
idf.py menuconfigpermet de modifier la configuration du framework via un menu proche du menuconfig du noyau Linux- Pour lire et écrire la table de partitions, il a fallu régler
SPI_FLASH_DANGEROUS_WRITE_ALLOWEDsurAllowed - Il a aussi fallu désactiver
SPI_FLASH_DANGEROUS_WRITE_ABORTSpour permettre l’accès à la table de partitions - Utiliser ESP-IDF directement faisait perdre les commodités d’Arduino, mais l’ajout de Arduino as a Component a permis de combiner les fonctionnalités Arduino avec le contrôle offert par ESP-IDF
- Des bibliothèques comme ElegantOTA, Async_TCP et AsyncWebServer ont dû être clonées dans le répertoire
componentsdu projet ou dans le répertoirelibrariesdu composant Arduino - Certains
CMakeLists.txtont également dû être ajustés, et un scriptbuild.sha été ajouté au dépôt pour automatiser ces tâches répétitives - La compilation se faisait avec
idf.py build, et le flash série avecesptool -p /dev/ttyUSB0 write-flash 0xe0000 build/library.bin
Page de configuration
- L’image du firmware principal inclut des endpoints essentiels du serveur web, mais le code réel de la bibliothèque est stocké séparément dans la partition LittleFS
- L’image du système de fichiers doit être flashée séparément, d’où l’intégration d’ElegantOTA
- Si l’appareil démarre sans que le système de fichiers ait encore été flashé, une page de configuration s’affiche
- Cette page explique comment utiliser ElegantOTA pour flasher l’image du système de fichiers et le firmware safeboot
Safeboot
- Pour conserver les mises à jour OTA du firmware principal, l’idée initiale était de réutiliser tel quel le safeboot de Tasmota
- Le safeboot de Tasmota effectue les mises à jour à partir des paramètres Wi‑Fi présents dans la partition
nvs - Le problème est que le SSID et le mot de passe Wi‑Fi y sont stockés en clair
- Laisser une ampoule à l’extérieur avec ces identifiants encore présents constitue une mauvaise posture de sécurité opérationnelle
- Le firmware personnalisé commence donc par effacer la partition
nvs, puis également la partition SPIFFS - Une fois les paramètres Wi‑Fi supprimés de
nvs, le safeboot de Tasmota ne peut plus se connecter au réseau, ce qui casse le chemin de mise à jour par défaut - Pour résoudre cela, un firmware safeboot personnalisé distinct est devenu nécessaire
- Ce firmware safeboot a été développé à partir d’un exemple GitHub de mise à jour OTA avec point d’accès et serveur web minimal
- Certains paramètres
menuconfigont été désactivés pour réduire suffisamment l’image afin qu’elle tienne dans la partition safeboot, et le résultat fonctionne - La partition safeboot elle-même n’a pas de mot de passe, mais la fonction d’administration qui redémarre dessus est protégée par mot de passe
Application web
-
Bibliothèque
- L’écran d’accueil affiche l’image d’un conteneur maritime jaune avec une porte
- Cette image fait référence à la nouvelle Library de Ben Brown mentionnée plus haut
- Bien qu’elle occupe de l’espace de stockage, elle a été conservée, et l’écran d’accueil inclut aussi un effet de glitch pour donner une ambiance « hacker »
- La page principale de la bibliothèque a été développée à la main en HTML et CSS
- Le plan initial était un simple index HTML avec liste de fichiers, mais le résultat a évolué vers quelque chose de plus esthétique et plus amusant
- La structure du site reste relativement simple
- Une section explique ce que l’utilisateur est en train de consulter
- La section des livres affiche le titre, l’auteur, ainsi que la raison pour laquelle l’ouvrage a été contesté ou interdit
- Une section de liens de référence est aussi présente, mais comme le point d’accès Banned Book Library n’a pas de connexion Internet, les liens externes ne fonctionnent pas pendant l’accès
-
Administration
- Le chemin
/admindonne accès à un panneau d’administration protégé par mot de passe - Le panneau d’administration permet de contrôler la température de couleur de l’ampoule
- Le but est de la faire ressembler aux autres ampoules présentes dans un lieu public, afin de rendre la modification moins visible
- Comme le vendeur de l’ampoule publiait les broches GPIO de contrôle des différentes LED, il a été possible de régler l’intensité de chaque couleur avec
AnalogWrite() - Les réglages de couleur sont stockés dans
NVS, ce qui permet de restaurer la même teinte au redémarrage suivant - Les fonctions d’administration comprennent aussi un bouton menant à la page de restauration
- Le chemin
-
Restauration
- La fonction de restauration remet partiellement en état la table de partitions puis redémarre sur safeboot
- En pratique, cela redémarre sur la partition safeboot personnalisée, ce qui permet ensuite de flasher un autre firmware par-dessus Banned Book Library
- Il peut s’agir d’une nouvelle version, de Tasmota, d’ESPHome, etc.
- Aucune bonne méthode n’a encore été trouvée pour restaurer la partition safeboot elle-même
- Si l’on reflashe Tasmota puis que l’on clique sur « Firmware Upgrade » dans l’interface Tasmota, l’appareil redémarre à nouveau sur le safeboot personnalisé
- Ce safeboot peut servir aux mises à jour de Tasmota, mais ne s’intègre pas de manière fluide à l’expérience de mise à niveau standard de Tasmota
- Pour cette raison, la restauration des partitions ne remet pas complètement le sous-type de safeboot à
Factory, mais le laisse enOTA_1
-
Portail captif
- Comme un utilisateur connecté au point d’accès ouvert peut simplement voir qu’il n’y a pas d’Internet et abandonner, un portail captif est nécessaire
- L’ancienne méthode consistait à intercepter les requêtes HTTP pour les rediriger vers le portail, mais elle s’accorde mal avec le fait que la plupart des sites utilisent aujourd’hui HTTPS
- L’approche moderne repose sur des options DHCP signalant l’usage d’un portail captif, ainsi que sur le traitement des requêtes de détection propres à chaque type d’appareil
- Un exemple de code de portail captif pour ESP32 a été trouvé et partiellement réutilisé dans le projet
- Ce code accomplit deux tâches
- Le serveur DNS répond à toutes les requêtes avec l’adresse IP de l’ESP32 lui-même
- Des requêtes HTTP spécifiques utilisées par Microsoft, Android, iOS, Firefox et d’autres sont interceptées pour envoyer une redirection ou une réponse adaptée
- Les requêtes inconnues sont redirigées vers une URL locale via
server.onNotFound, et l’hôte ainsi que l’URL demandée sont affichés sur le moniteur série
Réflexions finales
-
Limites de taille
- La capacité totale de stockage de l’appareil est limitée à 4MB
- Certains livres au format epub examinés faisaient environ 350KB chacun, ce qui signifie qu’une seule ampoule ne peut en contenir qu’un petit nombre
- Au départ, l’auteur imaginait un serveur web proposant de nombreux livres interdits ; cette limite a donc été décevante
- Avec le recul, cette contrainte a fini par être perçue comme un avantage, car chaque dead drop reflète alors les choix de la personne qui l’a créé
- Son créateur doit sélectionner les livres qui comptent pour lui ou auxquels il estime que d’autres devraient avoir accès
- S’il y en a plusieurs dans une même zone, avec des contenus différents dans chaque ampoule, l’expérience de recherche et de découverte peut devenir encore plus amusante
-
Idées pour la suite
-
Contrôle des couleurs
- L’auteur aimerait ajouter des curseurs pour piloter plus finement les couleurs RGB et la température de blanc
- Cela permettrait d’ajuster encore mieux l’ampoule à la teinte des éclairages déjà présents sur le lieu d’installation
-
Réseau maillé
- En lien avec les limites de stockage, l’idée d’un réseau maillé entre plusieurs ampoules a émergé
- En utilisant une approche proche d’une table de hachage distribuée, un utilisateur connecté à une seule ampoule pourrait accéder aux livres stockés sur les autres appareils à portée
- Cette piste reste une direction intéressante à explorer
-
Divers
- Il existe encore de nombreuses idées pour réutiliser des appareils connectés à d’autres fins
- La puce ESP32 est jugée très bon marché tout en offrant des performances suffisantes
- Après avoir appris à utiliser l’ESP32, l’auteur a de fortes chances de créer davantage de projets autour de cette puce
-
1 commentaires
Réactions sur Hacker News
Comme dans la citation de Pravin Lal dans Alpha Centauri, l’avertissement selon lequel ceux qui cherchent à contrôler le flux d’information cherchent au fond à devenir des maîtres paraît toujours très pertinent
L’idée que « la démocratie meurt sous un tonnerre d’applaudissements » semble plus proche de la réalité
C’est le meilleur jeu 4X de tous les temps, et le 2060 qu’il imaginait semble se rapprocher un peu plus chaque jour
On dirait une œuvre qui marque le sommet de la complexité et de la maturité dans le jeu vidéo
Ce jeu et ses idées sont vraiment intemporels
Parce qu’on a bien vu que le mensonge aussi est une information, et qu’il peut même encore mieux se diffuser en empruntant le même canal
Comme prévu, l’exemple de livres cité dans l’article n’était pas réellement constitué de « livres interdits »
En général, il s’agit plutôt de retirer des bibliothèques scolaires des livres au contenu explicite, à la demande de parents
Comme ce n’est pas le sujet principal du texte, j’ai l’impression qu’il n’y avait qu’un ou deux exemples de livres
Nineteen Eighty-four contient aussi du contenu sexuel, donc un autoritaire qui voudrait limiter l’accès à la littérature sur le totalitarisme n’aurait qu’à pousser les parents à s’indigner de cet aspect
Il n’a pas besoin d’être interdit à l’échelle mondiale pour qu’on puisse employer ce mot
Il n’y en a sans doute pas beaucoup, mais de nos jours cela ressemble parfois à un raccourci vers la notoriété
Il y avait autrefois PirateBox
Le principe consistait à installer un firmware personnalisé sur un petit point d’accès Wi-Fi avec serveur web, forum et hébergement de fichiers ; le site d’origine a disparu, mais il existe un projet dérivé ici : https://www.jasongriffey.net/librarybox/
Cela dit, si on autorise l’upload par les utilisateurs, il est inquiétant rien que d’imaginer quels fichiers pourraient s’y retrouver
Les gens avaient peur de se connecter à un Wi-Fi ouvert et, comme il n’offrait pas « Internet gratuit », ils se déconnectaient généralement tout de suite
Malheureusement, le projet dérivé LibraryBox ne semble plus vraiment actif non plus
Je suis curieux de voir la liste des livres interdits
En la parcourant, avec l’absence de l’une des plus grandes plateformes sociales, je doute qu’on y trouve des livres particulièrement intéressants ; cela ressemble plutôt aux ouvrages qu’on verrait dans un rayon « livres interdits » d’une librairie grand public
On dirait une banalité de la pensée privée de toute diversité significative
La liste des « livres interdits » est courte : Call of the Wild, The Adventures of Huckleberry Finn, The Adventures of Tom Sawyer, Women in Love
Quelle audace, vraiment
Il n’existe donc pas de liste unique : on y met ce qu’on veut
J’ai déjà vu ce genre de chose appelé Pirate Box vers 2012
L’idée de base est de mettre en place un réseau Wi-Fi et un serveur web isolés du reste d’Internet, afin que les gens puissent y téléverser et y télécharger des fichiers
C’est en quelque sorte une bibliothèque de partage numérique limitée géographiquement
Pour quelqu’un qui semble soucieux de l’efficacité logicielle et énergétique, le fait que les images de l’article soient des PNG de 5 Mo saute aux yeux
Android aime se déconnecter automatiquement des réseaux Wi-Fi qui ne fournissent pas Internet
Pour désactiver cette fonction, il faut passer par plusieurs réglages assez obscurs
La dernière fois que j’ai vérifié, la détection de portail du téléphone n’exigeait même pas de certificat HTTPS valide
L’utilisateur recevrait une invite lui demandant d’appuyer sur « Sign In », puis tomberait directement sur le dead drop
Cela dit, je ne l’ai pas testé moi-même et je ne sais pas si cela fonctionnerait vraiment, ni s’il faudrait un DNS correctement configuré
C’est un bon exemple de jusqu’où on peut aller, même sans grandes connaissances de départ, quand on a un objectif clair, de la passion et de la curiosité
C’est sympa, mais l’idée que « comme c’est une ampoule, ce sera difficile à détecter et discret » me laisse sceptique
Ce ne sera pas plus difficile à désactiver que n’importe quel autre appareil Wi-Fi accessible publiquement, et on pourra probablement le trouver en coupant l’alimentation ou les appareils un par un
Les points d’accès d’entreprise modernes intègrent aussi des fonctions pour localiser physiquement un appareil et envoyer des alertes automatiques sur les points d’accès non autorisés
Cela dit, ces alertes sont souvent ignorées ou désactivées, parce qu’elles se déclenchent chaque fois que quelqu’un imprime en Wi-Fi Direct ou lance une diffusion d’écran
Surtout si elle ressemble à une ampoule tout à fait ordinaire vissée à sa place : qui penserait qu’il s’agit d’un point d’accès Wi-Fi ?
Le matériau d’enrobage brun a probablement aussi servi à extraire la chaleur des composants, en plus de ses autres fonctions