Ormai a ridosso delle festività natalizie, la striscia LED è protagonista indiscussa di questo periodo dell’anno. Si tratta di un dispositivo sempre più spesso utilizzato per l’illuminazione decorativa, ambientale, posizionato anche dietro TV e altri schermi, adottato nell’ambito di molti altri campi applicativi.
Nelle strisce LED “addressable” (indirizzabili), ogni singolo LED può essere controllato separatamente, consentendo di impostare colori diversi o modelli di illuminazione specifici per ciascun diodo a emissione di luce. Nel caso dei prodotti di questo tipo, è indispensabile un meccanismo di controllo più sofisticato e un sistema di indirizzamento, che può essere programmato per gestire ogni singolo punto luminoso.
Reverse engineering delle strisce LED Bluetooth: in cosa consiste e come si fa
Un ricercatore indipendente racconta di essersi recentemente divertito ad effettuare il reverse engineering di tutta una serie di strisce LED non-addressable. Sebbene si tratta di “sistemi chiusi”, risalire al funzionamento di questi prodotti è piuttosto semplice. Tanto che diventa possibile integrare le strisce LED all’interno di un sistema aperto come Home Assistant.
Quest’ultima è la ben nota piattaforma open source per la gestione e l’automazione dei dispositivi smart: permette di allestire un completo, versatile e flessibile sistema di domotica che offre un ambiente centralizzato per controllare e coordinare una vasta gamma di device, tra cui luci, termostati, telecamere di sicurezza, sensori di movimento, e molti altri. Poter integrare una striscia LED o da pochi euro in un sistema di domotica come Home Assistant non ha prezzo.
Per controllare il funzionamento delle strisce LED, generalmente è previsto l’utilizzo dello standard Bluetooth LE (Low Energy, BLE). Così, il ricercatore ha pubblicato BJ_LED, un’applicazione che permette di controllare in totale libertà le strisce LED compatibili: il comando “69 96 06 01 01
“, ad esempio, provoca l’accensione; “69 96 02 01 00
” lo spegnimento. Una serie di appositi comandi, consente di regolare i colori, con una rappresentazione numerica per i valori di rosso, verde, blu e bianco.
Strisce LED indirizzabili: come prenderne il controllo svincolandosi dall’app ufficiale
Dicevamo che la gestione delle strisce LED indirizzabili risulta un po’ più complicata: l’autore ha voluto cimentarsi con i prodotti che montano LED WS2812 o simili. Su Amazon Italia si trovano tanti esempi di strisce indirizzabili con chip WS2812. Alcuni prodotti sono davvero economici.
L’autore fa presente che misurarsi con il funzionamento di una striscia LED addressable può essere un’esperienza davvero divertente e, allo stesso tempo, formativa. Bisogna però anche muoversi con cautela perché, sebbene il costo di questi dispositivi sia limitato, c’è anche la possibilità di comprometterne definitivamente il funzionamento passando al firmware comandi errati o definendo comportamenti che possono potenzialmente essere causa di problemi.
Per controllare le comunicazioni con la striscia LED, il primo passo consiste nell’esaminare i byte inviati tramite Bluetooth tramite l’app ufficiale. I dispositivi di illuminazione come quelli presi in esame, di solito utilizzano un protocollo semplice con un’intestazione (header), byte di comando (azioni come accendere/spegnere, cambiare colore) e un elemento di chiusura o footer che potrebbe svolgere il ruolo di checksum (tecnica utilizzata in informatica e telecomunicazioni per verificare l’integrità dei dati trasferiti).
Attivare le Opzioni sviluppatore Android
Gli utenti che volessero gettarsi nell’impresa e interagire direttamente con le strisce LED via BLE, dovrebbero attivare le Opzioni sviluppatore Android (di solito è possibile farlo toccando in rapida sequenza, per almeno 7 volte di seguito, la voce Info sul telefono nelle impostazioni). Dalle Opzioni sviluppatore, è quindi indispensabile attivare la voce Registro Bluetooth HCI snoop.
La voce “Registro Bluetooth HCI snoop” o “Bluetooth HCI Snoop Log” si riferisce a un registro diagnostico che tiene traccia delle interazioni a basso livello tra un dispositivo Bluetooth e il suo controller Bluetooth Host Controller Interface (HCI). HCI è uno standard di interfaccia tra il livello fisico Bluetooth e il livello di protocollo superiore: qui avvengono le trasmissioni di pacchetti Bluetooth a livello di protocollo, dati utilizzabili per analizzare dettagliatamente le attività in corso.
L’opzione contenuta nel menu di Android, registra i byte scambiati via Bluetooth annotandoli in un file leggibile mediante Wireshark. Eseguendo le normali azioni previste nell’app ufficiale, si possono così raccogliere preziose indicazioni sulle sequenze di dati da inviare alla striscia LED per accendere, spegnere le luci e programmare specifici comportamenti.
Nell’articolo citato in precedenza, abbiamo visto come usare l’app adb (Android Debug Bridge) per accedere da PC al contenuto del file system di Android. Con il comando seguente si può copiare il registro HCI dallo smartphone al computer collegato:
adb pull sdcard/btsnoop_hci.log .
Analisi del registro Bluetooth HCI con Wireshark
Aprendo il file di log Bluetooth HCI con Wireshark si possono verificare i byte scambiati tra app e striscia LED. Con un po’ di pazienza, è possibile trovare valori che differiscono per un byte (ad esempio 1 e 0 per “on” e “off”) nel caso delle azioni di accensione e spegnimento della striscia BLE.
Il ricercatore suggerisce un prezioso filtro Wireshark che aiuta ad estrarre le informazioni che contano:
bluetooth.dst == ff:ff:ff:ff:ff:ff && btatt.opcode.method==0x12
Al posto di ff:ff:ff:ff:ff:ff
va indicato il MAC address delle luci mentre btatt.opcode.method==0x12
consente di estrapolare le comunicazioni di “scrittura” disposte dal dispositivo Android verso la striscia LED.
Fin qui è tutto abbastanza semplice, soprattutto se l’intento dell’utente fosse limitato allo spegnimento e all’accensione della striscia LED.
Decompilare l’applicazione Android per comprendere tutti i segreti
Alcune strisce LED, così come tanti altri dispositivi Bluetooth, non espongono in chiaro tutte le loro funzionalità. Decompilare un’app Android partendo dal suo file APK aiuta ad esporne tanti “segreti”. jadx, ad esempio, è un software open source progettato per decompilare (tradurre da bytecode a codice sorgente) le applicazioni Android scritte in Java. Il tool può essere utilizzato per ottenere una rappresentazione leggibile del codice Java partendo da un’app Android compilata.
Nel caso della striscia LED con chip WS2812, il ricercatore ha notato diversi riferimenti all’uso del protocollo AES nel sorgente decompilato: ciò suggerisce l’utilizzo di scambi cifrati tra il device Android e il dispositivo Bluetooth.
Tuttavia, poiché i dati crittografati non cambiano ogni volta, l’autore ha facilmente compreso che la chiave doveva essere unica (tra l’altro la stessa per tutti i dispositivi dello stesso produttore di strisce LED). Inoltre, un microcontrollore (MCU) caratterizzato da bassi consumi energetici – come quello delle strisce LED – non può evidentemente utilizzare chiavi crittografiche complesse.
Decompilando la libreria AES utilizzata dall’app, è stato possibile recuperare la chiave di cifratura (che peraltro era già conosciuta sul Web). La procedura, effettuata con il decompilatore IDA Free, è illustrata nel dettaglio a questo indirizzo.
A questo punto è possibile esaminare ogni funzione dell’app, registrare i byte inviati alla striscia LED e creare i propri modelli da implementare, ad esempio, all’interno di piattaforme come Home Assistant.
Credit immagine in apertura: iStock.com/mkarco