Questo è un post che aggiorno man mano che la ricerca sui device Tuya va avanti. Non un singolo bersaglio, ma l’ecosistema: una volta capito il protocollo e il pattern hardware di uno, gli altri diventano lavoro ripetibile. Non una chiave condivisa (ogni device ha la sua local key), ma lo stesso metodo che vale per tutti.

Tuya è la piattaforma white-label che sta sotto a un’infinità di gadget economici: telecamere, prese, irrigatori, sensori. Cambia il marchio sulla scatola, ma dentro c’è quasi sempre lo stesso SoC, la stessa app (Smart Life / Tuya Smart) e lo stesso protocollo. Bersaglio perfetto per imparare: ne ho un lab pieno, e sono tutti cugini. Come bussola uso due libri, The Hardware Hacking Handbook e Practical IoT Hacking.

La mappa del lab#

Dopo il ping sweep, gli inquilini IoT della rete:

192.168.1.3   Camera Tuya       v3.5   6668/tcp + 6682/tcp
192.168.1.18  Dongle irrigatore v3.4   (gateway WiFi radio)
192.168.1.16  IoT ignoto (Qingdao)     da identificare

Da subito emerge la doppia natura del problema. Alcuni device parlano IP (la camera, il dongle) e li attacchi via LAN. Altri non hanno un IP: l’irrigatore vero, per esempio, parla al suo dongle via radio (sub-GHz, BLE o Zigbee, da capire). Due mondi, due cassette degli attrezzi:

  • Wired, per i device con una board da aprire. Apertura del case, UART, dump della flash SPI, analisi del firmware. È il binario principale, quello da cui esce la local key.
  • Radio, per quello che vive nell’etere. Sniffare il link tra irrigatore e dongle, i sensori BLE/Zigbee, il sub-GHz. Serve a mappare i device senza IP e, dove si può, a parlarci.

Ricognizione (e il primo falso positivo)#

Prima regola dell’IoT: la ricognizione decide tutto, e non ci si fida del primo host che sembra giusto. Lezione imparata subito, sbagliando. Un nmap mi aveva fatto puntare un host con una porta aperta che credevo la camera:

$ nmap -p- 192.168.1.10
3000/tcp open   # ...aspetta

La 3000 non è una telecamera: è il mio OWASP Juice Shop in locale su quella macchina. Avevo puntato la mia stessa station di pentest. Ping sweep rifatto con calma, e la camera salta fuori pulita:

IP:          192.168.1.3
Protocollo:  Tuya v3.5
Device ID:   bffa7e4eb71e87da57rrxa
Product ID:  keymf7afuxvw85qt
Porte:       6668/tcp  (protocollo locale Tuya)
             6682/tcp  (non documentata, media/P2P?)

La 6668 è il canale locale di Tuya, quello che l’app usa sulla LAN senza cloud. La 6682 non è nel protocollo locale documentato: profuma di stream/P2P, e me la segno per una cattura dedicata. Nel giro trovo anche il .18 (dongle WiFi dell’irrigatore, v3.4, bfae977fd2b319d166aoux) e un .16 ancora da identificare.

Il muro: la local key#

Il nodo di tutti i Tuya locali è la local key. Il protocollo sulla 6668 è cifrato (AES-GCM in v3.5), e senza quella chiave non decifri il traffico né mandi comandi. Con IP e Device ID sei arrivato alla porta, ma la chiave ce l’ha il device.

C’è la via comoda, il wizard di tinytuya che scarica le local key dal cloud Tuya via account developer, e funziona. La salto di proposito.

La local key la estraggo dal firmware. Per ogni device il dump della sua flash, e dentro la sua chiave. Il Device ID, che ho già per ognuno, fa da ancora di ricerca nel dump.

Non è masochismo: l’obiettivo è capire il device, non solo pilotarlo. Nel dump non c’è solo la local key, ci sono endpoint, credenziali, magari altre chiavi. La scorciatoia cloud mi darebbe il risultato saltando tutto quello che voglio imparare.

L’arsenale#

Il banco wired è ordinato e in arrivo: saldatore TS101, stazione ad aria calda per il chip-off, programmatore CH341A con clip SOIC-8 per la flash, analizzatore logico per trovare e validare la UART, USB-TTL CP2102 per la seriale, multimetro TRMS, più flux, treccia, terza mano e tappetino ESD. Copre tutta la catena: apri, salda o dissalda, dumpa, analizza.

Sul fronte radio ho già Flipper Zero e WiFi Pineapple, e in arrivo due SONOFF Zigbee CC2652P (uno coordinatore per una rete Zigbee di lab, uno sniffer) e un dongle nRF52840 per BLE e 802.15.4. Più avanti, senza fretta, un ST-Link V2 (JTAG/SWD), un RTL-SDR genuino per l’SDR sub-GHz (occhio ai cloni su Amazon) e un ChipWhisperer per glitching e side-channel.

I prossimi passi#

  1. Camera prima, che ha più superficie d’attacco: apri, foto della board, sigle di SoC e flash, poi il dump, con clip in-circuit o chip-off a seconda della board.
  2. binwalk e analisi: estrarre il filesystem, cercare la local key usando il Device ID come ancora.
  3. Validare la chiave: con la local key vera, tinytuya sulla LAN deve decifrare la 6668 e farmi leggere e comandare il device in locale, cloud escluso.
  4. Poi il resto: stesso trattamento agli altri Tuya, e apertura del binario radio per l’irrigatore e i device senza IP.

Un ecosistema, un metodo ripetibile. Bucane uno per bene e gli altri vengono dietro.

Aggiornamenti#

  • 2026-09-08 Ricognizione di rete completata. Camera individuata a .3 (v3.5), mappati dongle irrigatore e device ignoto. Banco da saldatura ordinato. Prossimo atto: apertura della camera e prima foto della board.

Tutto su device miei, in laboratorio, a scopo di studio. Aggiorno a ogni tappa.