Questo è un post vivo: lo aggiorno man mano che la ricerca sui device Tuya va avanti. Non un singolo bersaglio, ma l’ecosistema — perché una volta capito il protocollo e il pattern hardware, la stessa chiave apre mezza casa.

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. Bussola metodologica: 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): 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 — 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 — 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, 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. Ogni device → dump della sua flash → 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 — endpoint, credenziali, magari altre chiavi. La scorciatoia cloud mi darebbe il risultato saltando tutto quello che voglio imparare.

L’arsenale#

Il banco wired è ordinato (arrivo a breve): 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/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: 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 (più superficie d’attacco): apri, foto della board, sigle di SoC e flash, poi dump — clip in-circuit o chip-off a seconda della board.
  2. binwalk + 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/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.