Quando si pensa a un Web server, la prima cosa che viene in mente è un datacenter o almeno un single-board computer come Raspberry Pi. Bogdan Ionescu, geek fino al midollo, si è ingegnato per fare in modo di ospitare un sito Web su un dispositivo nato per tutt’altro scopo, con appena qualche kilobyte di memoria e nessuna interfaccia di rete. Il concetto di riutilizzare l’hardware elettronico di dispositivi di consumo al di fuori del loro scopo originario non è nuovo, ma continua a suscitare grande interesse nel mondo del reverse engineering e dell’embedded. Un caso emblematico è quello delle sigarette elettroniche “usa e getta”, che negli ultimi anni si sono evolute da semplici vaporizzatori con una batteria sigillata a veri e propri dispositivi elettronici con microcontrollori ARM, ricarica USB-C e memorie integrate.
Dall’hardware nascosto al potenziale inespresso
Smontando un vaporizzatore “usa e getta”, ci si aspetterebbe di trovare poco più di una batteria al litio e un ASIC minimale. In realtà, alcuni modelli contengono microcontrollori PUYA PY32, derivati dall’architettura ARM Cortex-M0+, con caratteristiche decisamente interessanti:
- CPU: ARM Cortex-M0+ @ 24 MHz
- Memoria Flash: 24 KiB
- RAM: 3 KiB
- Periferiche: GPIO, timer e periferiche seriali
Si tratta di specifiche che, seppur ridotte, sono più che sufficienti per eseguire uno stack TCP/IP leggero e un server HTTP basilare. Sono componenti pensati per applicazioni embedded a basso costo ma, riprogrammati, possono trasformarsi in micro-server sperimentali.
Connettività: dal semihosting al protocollo SLIP
Ionescu spiega che uno dei punti più critici era la mancanza di interfacce di rete. Per aggirare il problema, il ricercatore ha utilizzato il semihosting, una tecnica che consente a un microcontrollore ARM di delegare alcune chiamate di sistema all’host.
Per trasmettere pacchetti IP, si è quindi sfruttato un approccio storico: SLIP (Serial Line Internet Protocol). Questo protocollo, utilizzato ai tempi dei modem dial-up, permette di incapsulare pacchetti IP su connessioni seriali. Integrando SLIP con il semihosting e collegandolo al sistema host tramite socat e slattach, il microcontrollore è stato “virtualmente” connesso a una rete IP.
socat è un “coltellino svizzero” per le connessioni di rete e di sistema. Permette di collegare due flussi di dati diversi tra loro. In questo progetto serve a trasformare la connessione TCP in una porta /dev/tty* che i programmi Linux possono trattare come una vera seriale.
slattach è un’utility che prende un dispositivo seriale (reale o virtuale) e lo “attacca” a un’interfaccia di rete, configurandolo per trasportare pacchetti IP usando protocolli storici come SLIP o PPP. In pratica dice al kernel: “da adesso questa porta seriale è una scheda di rete”.
Da qui è stato possibile avviare uIP, uno stack TCP/IP minimale progettato per sistemi a 8 e 16 bit, che fornisce anche un esempio di server HTTP.
Ottimizzazione delle prestazioni
Ionescu racconta che la prima implementazione del suo lavoro era quasi inutilizzabile: risposta al ping con 1,5 secondi di latenza e perdita di pacchetti del 50%. Il collo di bottiglia era dovuto alla gestione dei dati byte per byte, con un overhead enorme.
L’aggiunta di un ring buffer e la gestione dei pacchetti in blocchi hanno cambiato radicalmente le prestazioni permettendo di ottenere un ping pari a 20 ms senza alcuna perdita di pacchetti. Il caricamento di un’intera pagina ha invece richiesto circa 160 ms. Il tutto utilizzando meno del 50% della RAM disponibile (1,3 KB su 3 KB).
Capacità effettive
Con circa 20 KB di memoria flash liberi, non è realistico ospitare applicazioni Web moderne basate su framework come React, ma è sufficiente per servire pagine statiche HTML, gestire un mini-API in JSON (ad esempio, per fornire il numero di richieste gestite o l’ID del microcontrollore), implementare logiche server-side in C puro, senza dipendenze esterne.
L’impego di Ionescusa apre quindi scenari interessanti per applicazioni IoT ultraleggere, in cui la connettività minima e l’elaborazione locale possono bastare.
Dentro il repository GitHub: strumenti e codice del progetto
Il repository GitHub messo a disposizione dal ricercatore raccoglie tutto il necessario per replicare l’esperimento e comprendere il funzionamento del progetto. Al suo interno si trovano i riferimenti al blog che racconta la genesi dell’idea e i dettagli tecnici nonché gli script di configurazione per compilare e flashare il microcontrollore (tramite make flash serve) e per creare la porta seriale virtuale (make tty).
Ancora, tramite GitHub sono condivise le istruzioni per l’uso di socat e slattach, fondamentali per trasformare la connessione in un canale di rete via SLIP; il codice del Web server basato su uIP, un piccolo stack TCP/IP che consente al microcontrollore di rispondere a ping e richieste HTTP; i dati di benchmark, che mostrano consumi di memoria, tempi di risposta e throughput raggiunti durante i test.
Riflessioni e implicazioni
L’esperimento mette in evidenza alcuni punti chiave. Innanzi tutto, dispositivi etichettati come “usa e getta” integrano ormai hardware complesso e riutilizzabile. Recuperarli significa ridurre sprechi e aprire nuove opportunità di sperimentazione.
Un chip Cortex-M0+ con poche decine di KB di memoria è sufficiente per gestire i principali protocolli di rete, dimostrando come la miniaturizzazione e l’ottimizzazione abbiano abbattuto le barriere di ingresso all’IoT (Internet delle Cose).
Il lavoro di Ionescu, infine, offre un ottimo spunto per insegnare e apprendere concetti di networking, sistemi embedded e utilizzo dei protocolli storici come SLIP.
Ovviamente, un Web server di questo tipo non è pensato per applicazioni reali, ma è un brillante esempio ingegneristico e un invito a guardare con occhi diversi i dispositivi di consumo che ci circondano. In un’epoca in cui l’IoT cresce esponenzialmente, questi esperimenti ci ricordano che l’innovazione non nasce sempre da hardware costoso e dedicato, ma spesso da ciò che altri considerano rifiuto.
L’immagine in apertura è di Bogdan Ionescu