
Ricerca di reverse engineering e firmware personalizzato per telecamere IoT basate su Allwinner V3, inclusi parser di firmware, un client AVIOCTRL e un proof of concept per CVE-2026-52656 per la sostituzione non autenticata del firmware via OTA.

Trocar para Português (Brasil)
Note di reverse engineering, strumenti per il firmware, codice proof-of-concept e un'interfaccia firmware personalizzata per la versione Allwinner V3 della SJCAM SJ4000 Air.
Articolo di ricerca
Questo repository contiene il codice e gli artefatti prodotti durante la ricerca. L'articolo completo spiega l'indagine dal primo dump del firmware al firmware personalizzato Lelouch.
Leggi l'articolo di ricerca completo in inglese) o Portoghese.
Questo lavoro è iniziato con una semplice domanda: quanto controllo potrei ottenere su una action camera economica senza documentazione, codice sorgente o supporto del produttore?
La fotocamera si è rivelata utilizzare un SoC Allwinner V3 e un sistema Android 4.4 pesantemente modificato. La sua applicazione principale, sdv, comunica con servizi proprietari della fotocamera e del display tramite Binder, renderizza l'interfaccia con MiniGUI, espone un server HTTP per gli aggiornamenti del firmware e comunica con l'applicazione SJCAM Zone tramite un protocollo proprietario.
Il repository documenta il percorso dall'estrazione del firmware a una sostituta funzionante per sdv. Include strumenti per i formati di firmware incontrati durante la ricerca, database IDA per i binari reversati, un client AVIOCTRL, il codice sorgente del firmware personalizzato Lelouch e il proof of concept associato a CVE-2026-52656.
Il codice è destinato alla scheda Allwinner V3 studiata con un controller display ST7789V e un sensore immagine GC4653. Le unità SJ4000 più vecchie basate su Novatek NT9665X sono incluse solo come parte della ricerca precedente e utilizzano un formato firmware diverso. I soli nomi dei prodotti non sono sufficienti per stabilire la compatibilità.
Lelouch è un'interfaccia sostitutiva per l'eseguibile sdv originale della fotocamera. È costruita utilizzando le librerie proprietarie recuperate dal firmware e utilizza le stesse interfacce interne dell'applicazione originale.
L'implementazione attuale include:
HerbCamera e CedarDisplaywpa_supplicantLelouch non è una distribuzione completa o un firmware generico per ogni prodotto venduto come SJ4000. Dipende dalle librerie, kernel, servizi, layout delle partizioni, controller display, sensore immagine e configurazione della scheda utilizzati dall'unità Allwinner V3 studiata.
Alcune directory contengono materiale di terze parti o proprietario recuperato dal dispositivo. La loro presenza è a scopo di interoperabilità e ricerca sulla sicurezza e non rende tali componenti open source.
La compilazione è stata testata su Linux x86-64. Sono necessari Python 3, GNU Make, Git, un ambiente di build C/C++ e accesso alla rete per il download iniziale della toolchain.
git clone https://github.com/keowu/sjcam.git
cd sjcam/Lelouch
python3 prepare_build.py
prepare_build.py scarica un sysroot Android API level 14 bloccato e il cross-compilatore ARM arm-linux-androideabi-4.6 in Lelouch/android_compilers/. Successivamente compila il wpa_supplicant statico modificato ed esegue make. I file della toolchain scaricati e i binari generati vengono ignorati da Git.
I file risultanti sono:
Lelouch/Lelouch
Lelouch/wpa_supplicant
Per ricompilare dopo aver modificato i sorgenti C++:
cd Lelouch
make clean
make
Il binario Lelouch generato è destinato a sostituire /bin/sdv nel filesystem root estratto. La modalità stazione Wi-Fi prevede anche che il wpa_supplicant compilato si trovi in /mnt/extsd/sta/wpa_supplicant sulla scheda SD della fotocamera.
Il codice sperimentale di rilevamento facciale cerca il file della cascata generato in:
/mnt/extsd/frontalface.casc
Il repository include una cascata pre-generata e il convertitore utilizzato per crearla:
cd Lelouch/gen_cascade
python3 gen_cascade.py haarcascade_frontalface_alt2.xml frontalface.casc
La procedura completa di estrazione, sostituzione del filesystem root, reimpacchettamento e flashing con LiveSuit è documentata nell'articolo di ricerca collegato all'inizio di questa pagina.
Tutti i punti di ingresso dei parser sono script Python 3 con output --help integrato e nessuna dipendenza Python di terze parti.
Legge l'immagine firmware LiveSuit esterna, estrae i suoi file e ricostruisce un'immagine da una directory estratta.
python3 "Reversing Scripts/AllWinner IMAGEWTY - ROM Parser/main.py" info firmware.img
python3 "Reversing Scripts/AllWinner IMAGEWTY - ROM Parser/main.py" extract firmware.img -o image_dump
python3 "Reversing Scripts/AllWinner IMAGEWTY - ROM Parser/main.py" repack image_dump rebuilt.img
Ispeziona, estrae e reimpacchetta il contenitore full_img.fex trovato all'interno dell'immagine IMAGEWTY.
python3 "Reversing Scripts/AllWinner EGON - Firmware Parser/main.py" info full_img.fex
python3 "Reversing Scripts/AllWinner EGON - Firmware Parser/main.py" extract full_img.fex -o egon_dump
python3 "Reversing Scripts/AllWinner EGON - Firmware Parser/main.py" pack egon_dump \
--original full_img.fex \
-o rebuilt_full_img.fex
Il packer utilizza il file originale come modello in modo che il layout originale e i metadati possano essere preservati mentre le partizioni vengono sostituite.
Decomprime il contenitore BCL1 utilizzato dal firmware SJ4000 più vecchio basato su Novatek e può scansionare il risultato per risorse e sezioni firmware incorporate.
python3 "Reversing Scripts/Novatek もな BCL1 - Firmware Parser/main.py" \
"Firmwares Files/OLD_SJCAM_Novatek_NT9665X/SJCAM001.bin" \
-o firmCode.bin \
--extract
ウタ.py implementa il protocollo TCP proprietario utilizzato dall'applicazione mobile per controllare la fotocamera sulla porta 6666. Gestisce la sequenza di login della fotocamera, i messaggi keepalive, i frame IOCTRL, il trasferimento file e le richieste di streaming video utilizzando solo la libreria standard di Python.
Collega il tuo computer alla rete Wi-Fi della fotocamera ed esegui:
python3 "AVIOCTRL Script/ウタ.py"
Il target predefinito è 192.168.100.1:6666. Un indirizzo diverso può essere fornito quando necessario:
python3 "AVIOCTRL Script/ウタ.py" --host 192.168.100.1 --port 6666 --debug
Il client interattivo può leggere la batteria e la configurazione, ispezionare la scheda SD, scattare foto, avviare o interrompere la registrazione, elencare, caricare, scaricare o eliminare file, richiedere miniature, configurare il Wi-Fi, richiedere lo streaming video e inviare comandi IOCTRL manuali.
Formattare la scheda SD, eliminare file, modificare le impostazioni Wi-Fi ed eseguire un reset di fabbrica modificano la fotocamera. Usa questi comandi solo su hardware e dati di tua proprietà.
Il firmware studiato espone un endpoint HTTP non autenticato mentre l'hotspot della fotocamera è attivo. Accetta caricamenti di file arbitrari e li scrive direttamente sulla scheda SD senza convalidare né il client né il contenuto caricato. Ciò consente la sostituzione completa del firmware perché un attaccante può caricare un'immagine eGON personalizzata denominata full_img.fex; la fotocamera riconosce quel nome file come un pacchetto OTA e installa il firmware controllato dall'attaccante attraverso il suo normale flusso di aggiornamento, come se fosse un aggiornamento ufficiale.
Uno sfruttamento riuscito dà al firmware caricato il controllo completo sul software in esecuzione sul dispositivo. Il proof of concept incluso lo dimostra sostituendo l'applicazione originale con un payload MiniGUI/AudioTrack personalizzato che riproduce il video Bad Apple!! utilizzando frame RGB565 grezzi e audio PCM dopo l'installazione dell'immagine OTA maliziosa.
La directory POC/ contiene:
run_exploit.sh, che carica il full_img.fex controllato dall'attaccante sulla fotocamerafull_img.fex, l'immagine firmware eGON creata accettata dal meccanismo di aggiornamento OTA della fotocameraバイバイ/, il payload MiniGUI e AudioTrack Bad Apple!! utilizzato per dimostrare l'esecuzione arbitraria di codice dopo l'aggiornamentoextract_rgb_pcm_from_mp4/, un helper per convertire il video dimostrativo in dati RGB565 grezzi e PCML'helper di conversione multimediale richiede ffmpeg. I file generati video.rgb e audio.pcm sono attesi dal payload dimostrativo nella root della scheda SD della fotocamera.
Il proof of concept è di natura distruttiva. Un'immagine malformata o incompatibile può bloccare permanentemente la fotocamera. Non eseguirlo su dispositivi che non possiedi o senza un percorso di recupero completo.
Il progetto è stato creato per il reverse engineering, l'interoperabilità, l'istruzione e la ricerca sulla sicurezza su hardware acquisito legalmente dall'autore. SJCAM, Allwinner, Novatek, Android e i nomi dei loro componenti appartengono ai rispettivi proprietari.
Il repository contiene codice sorgente originale insieme a campioni di firmware, database di reverse engineering, header e librerie condivise provenienti da prodotti di terze parti. Nessuna licenza è concessa per materiale di terze parti. Verifica la provenienza e la legge applicabile prima di ridistribuire o utilizzare tali file al di fuori di un ambiente di ricerca.
Attualmente non esiste una licenza open source a livello di repository. Il sorgente di wpa_supplicant mantiene la propria licenza upstream in Lelouch/modified_lelouch_wpa_supplicant_source/COPYING.
| Percorso | Contenuto |
|---|
Lelouch/ | Interfaccia firmware personalizzata, ambiente di build, header recuperati, librerie condivise proprietarie e sorgente modificato di wpa_supplicant |
Reversing Scripts/ | Parser e reimpacchettatori per firmware Allwinner IMAGEWTY, Allwinner eGON e Novatek BCL1 |
AVIOCTRL Script/ウタ.py | Client interattivo per il protocollo TCP proprietario utilizzato da SJCAM Zone |
Bin Files/ | Database IDA per gli eseguibili principali e le librerie condivise analizzati durante la ricerca |
Firmwares Files/ | Campioni di firmware Allwinner e Novatek utilizzati durante lo sviluppo |
POC/ | Proof of concept per CVE-2026-52656, immagine eGON creata e payload dimostrativo per framebuffer/audio |