
Recherche en rétro-ingénierie et firmware personnalisé pour les caméras IoT basées sur Allwinner V3, incluant des analyseurs de firmware, un client AVIOCTRL et une preuve de concept de la CVE-2026-52656 pour le remplacement non authentifié de firmware OTA.

Trocar para Português (Brasil)
Notes de rétro-ingénierie, outils pour le firmware, code de preuve de concept et une interface de firmware personnalisé pour la version Allwinner V3 du SJCAM SJ4000 Air.
Article de recherche
Ce dépôt contient le code et les artefacts produits lors de la recherche. L'article complet explique l'investigation depuis le premier dump du firmware jusqu'au firmware personnalisé Lelouch.
Lire l'article de recherche complet en anglais) ou en portugais.
Ce travail a commencé avec une simple question : quel degré de contrôle pouvais-je obtenir sur une caméra d'action bon marché sans documentation, code source ni support du fabricant ?
La caméra s'est avérée utiliser un SoC Allwinner V3 et un système Android 4.4 fortement modifié. Son application principale, sdv, communique avec des services propriétaires de caméra et d'affichage via Binder, rend l'interface avec MiniGUI, expose un serveur HTTP pour les mises à jour du firmware et communique avec l'application SJCAM Zone via un protocole propriétaire.
Ce dépôt documente le chemin depuis l'extraction du firmware jusqu'à un remplacement fonctionnel de sdv. Il comprend des outils pour les formats de firmware rencontrés lors de la recherche, des bases de données IDA pour les binaires rétro-conçus, un client AVIOCTRL, le code source du firmware personnalisé Lelouch, et la preuve de concept associée à CVE-2026-52656.
Le code cible la carte Allwinner V3 étudiée, avec un contrôleur d'affichage ST7789V et un capteur d'image GC4653. Les anciennes unités SJ4000 basées sur Novatek NT9665X ne sont incluses que dans le cadre des premières recherches et utilisent un format de firmware différent. Les seuls noms de produits ne suffisent pas pour établir la compatibilité.
Lelouch est une interface de remplacement pour l'exécutable sdv d'origine de la caméra. Il est construit sur les bibliothèques propriétaires récupérées du firmware et utilise les mêmes interfaces internes que l'application d'origine.
L'implémentation actuelle comprend :
HerbCamera et CedarDisplaywpa_supplicantLelouch n'est ni une distribution complète ni un firmware générique pour tous les produits vendus sous le nom SJ4000. Il dépend des bibliothèques, du noyau, des services, de la disposition des partitions, du contrôleur d'affichage, du capteur d'image et de la configuration de la carte utilisés par l'unité Allwinner V3 étudiée.
| Chemin | Contenu |
|---|---|
Lelouch/ | Interface du firmware personnalisé, environnement de construction, en-têtes récupérés, bibliothèques partagées propriétaires et source modifiée de wpa_supplicant |
Reversing Scripts/ | Analyseurs et reconditionneurs pour les firmwares Allwinner IMAGEWTY, Allwinner eGON et Novatek BCL1 |
AVIOCTRL Script/ウタ.py | Client interactif pour le protocole TCP propriétaire utilisé par SJCAM Zone |
Bin Files/ | Bases de données IDA pour les principaux exécutables et bibliothèques partagées analysés lors de la recherche |
Firmwares Files/ | Échantillons de firmware Allwinner et Novatek utilisés lors du développement |
POC/ | Preuve de concept CVE-2026-52656, image eGON fabriquée, et charge utile de démonstration framebuffer/audio |
Certains répertoires contiennent du matériel tiers ou propriétaire récupéré de l'appareil. Leur présence est destinée à l'interopérabilité et à la recherche en sécurité et ne rend pas ces composants open source.
La construction a été testée sur Linux x86-64. Vous avez besoin de Python 3, GNU Make, Git, d'un environnement de construction C/C++ et d'un accès réseau pour le téléchargement initial de la chaîne de compilation.
git clone https://github.com/keowu/sjcam.git
cd sjcam/Lelouch
python3 prepare_build.py
prepare_build.py télécharge un sysroot Android API niveau 14 épinglé et le compilateur croisé ARM arm-linux-androideabi-4.6 dans Lelouch/android_compilers/. Il construit ensuite le wpa_supplicant statique modifié et exécute make. Les fichiers du compilateur téléchargés et les binaires générés sont ignorés par Git.
Les fichiers résultants sont :
Lelouch/Lelouch
Lelouch/wpa_supplicant
Pour reconstruire après avoir modifié les sources C++ :
cd Lelouch
make clean
make
Le binaire Lelouch généré est destiné à remplacer /bin/sdv dans le système de fichiers racine extrait. Le mode station Wi-Fi attend également le wpa_supplicant construit à l'emplacement /mnt/extsd/sta/wpa_supplicant sur la carte SD de la caméra.
Le code expérimental de détection de visages cherche le fichier de cascade généré à :
/mnt/extsd/frontalface.casc
Le dépôt inclut une cascade pré-générée et le convertisseur utilisé pour la créer :
cd Lelouch/gen_cascade
python3 gen_cascade.py haarcascade_frontalface_alt2.xml frontalface.casc
La procédure complète d'extraction, de remplacement du système de fichiers racine, de reconditionnement et de flashage via LiveSuit est documentée dans l'article de recherche lié en haut de cette page.
Tous les points d'entrée des analyseurs sont des scripts Python 3 avec une sortie --help intégrée et aucune dépendance Python tierce.
Lit l'image firmware LiveSuit externe, extrait ses fichiers et reconstruit une image à partir d'un répertoire extrait.
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
Inspecte, extrait et reconditionne le conteneur full_img.fex trouvé à l'intérieur de l'image 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
Le reconditionneur utilise le fichier original comme modèle afin de préserver la disposition et les métadonnées originales tout en remplaçant les partitions.