
Allwinner V3ベースのIoTカメラ向けのリバースエンジニアリング研究とカスタムファームウェア。ファームウェアパーサー、AVIOCTRLクライアント、および認証なしのOTAファームウェア置換に対するCVE-2026-52656の概念実証(PoC)を含みます。

Allwinner V3 版 SJCAM SJ4000 Air 向けのリバースエンジニアリングノート、ファームウェアツール、概念実証コード、およびカスタムファームウェアインターフェースです。
研究記事
このリポジトリには、研究の過程で作成されたコードと成果物が含まれています。完全な記事では、最初のファームウェアダンプから Lelouch カスタムファームウェアまでの調査を解説しています。
英語で完全な研究記事を読む) または ポルトガル語。
この作業は、ドキュメントもソースコードもベンダーサポートもない安価なアクションカメラに対して、どこまで制御できるのかという単純な疑問から始まりました。
このカメラは Allwinner V3 SoC と大幅に改変された Android 4.4 システムを採用していることが判明しました。メインアプリケーションである sdv は、Binder 経由でプロプライエタリなカメラ・表示サービスと通信し、MiniGUI でインターフェースを描画し、ファームウェア更新用の HTTP サーバーを公開し、プロプライエタリなプロトコルで SJCAM Zone アプリケーションと通信します。
このリポジトリは、ファームウェアの抽出から sdv の実用的な代替品に至るまでの道のりを記録しています。研究で遭遇したファームウェア形式に対応するツール、リバースエンジニアリングしたバイナリの IDA データベース、AVIOCTRL クライアント、Lelouch カスタムファームウェアのソース、そして CVE-2026-52656 に関連する概念実証が含まれています。
このコードは、ST7789V ディスプレイコントローラと GC4653 イメージセンサーを搭載した調査対象の Allwinner V3 ボードを対象としています。Novatek NT9665X ベースの古い SJ4000 ユニットは、初期の研究の一部としてのみ含まれており、異なるファームウェア形式を使用します。製品名だけでは互換性を判断するのに十分ではありません。
Lelouch は、カメラのオリジナルの sdv 実行ファイルに代わるインターフェースです。ファームウェアから回収したプロプライエタリなライブラリに対してビルドされ、オリジナルアプリケーションと同じ内部インターフェースを使用します。
現在の実装には以下が含まれます:
HerbCamera および CedarDisplay インターフェースによるカメラプレビューwpa_supplicant のカスタム ARMv7 ビルドを使用した Wi-Fi ステーションモードLelouch は完全なディストリビューションでも、SJ4000 として販売されているすべての製品に対応する汎用ファームウェアでもありません。これは、調査対象の Allwinner V3 ユニットで使用されているライブラリ、カーネル、サービス、パーティションレイアウト、ディスプレイコントローラ、イメージセンサー、ボード構成に依存します。
一部のディレクトリには、デバイスから回収したサードパーティ製またはプロプライエタリな素材が含まれています。これらは相互運用性とセキュリティ研究のために存在しており、それらのコンポーネントがオープンソースになるわけではありません。
ビルドは x86-64 Linux でテストされています。Python 3、GNU Make、Git、C/C++ ビルド環境、および最初のツールチェーンをダウンロードするためのネットワークアクセスが必要です。
git clone https://github.com/keowu/sjcam.git
cd sjcam/Lelouch
python3 prepare_build.py
prepare_build.py は、固定された Android API レベル 14 の sysroot と ARM 用クロスコンパイラ arm-linux-androideabi-4.6 を Lelouch/android_compilers/ にダウンロードします。その後、修正版の静的 wpa_supplicant をビルドし、make を実行します。ダウンロードしたコンパイラファイルと生成されたバイナリは Git で無視されます。
生成されるファイルは以下のとおりです:
Lelouch/Lelouch
Lelouch/wpa_supplicant
C++ ソースを変更した後に再ビルドするには:
cd Lelouch
make clean
make
生成された Lelouch バイナリは、抽出したルートファイルシステム内の /bin/sdv を置き換えることを目的としています。Wi-Fi ステーションモードでは、カメラの SD カード上の /mnt/extsd/sta/wpa_supplicant にビルドした wpa_supplicant があることも期待されます。
実験的な顔検出コードは、生成されたカスケードファイルを以下の場所で探します:
/mnt/extsd/frontalface.casc
リポジトリには、事前生成されたカスケードと、それを作成するために使用したコンバーターが含まれています:
cd Lelouch/gen_cascade
python3 gen_cascade.py haarcascade_frontalface_alt2.xml frontalface.casc
抽出、ルートファイルシステムの置き換え、再パック、LiveSuit による書き込みの完全な手順は、このページの上部にリンクされている研究記事に記載されています。
すべてのパーサーのエントリポイントは Python 3 スクリプトで、組み込みの --help 出力を備え、サードパーティ製の Python 依存関係はありません。
外側の LiveSuit ファームウェアイメージを読み取り、そのファイルを抽出し、抽出したディレクトリからイメージを再構築します。
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
IMAGEWTY イメージ内にある full_img.fex コンテナを検査、抽出、再パックします。
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
パッカーは元のファイルをテンプレートとして使用するため、パーティションを置き換えながら元のレイアウトとメタデータを保持できます。
古い Novatek ベースの SJ4000 ファームウェアで使用される BCL1 コンテナを解凍し、結果をスキャンして埋め込まれたアセットとファームウェアセクションを探すことができます。
python3 "Reversing Scripts/Novatek もな BCL1 - Firmware Parser/main.py" \
"Firmwares Files/OLD_SJCAM_Novatek_NT9665X/SJCAM001.bin" \
-o firmCode.bin \
--extract
ウタ.py は、モバイルアプリケーションがポート 6666 でカメラを制御するために使用するプロプライエタリな TCP プロトコルを実装しています。Python 標準ライブラリのみを使用して、カメラのログインシーケンス、キープアライブメッセージ、IOCTRL フレーム、ファイル転送、ビデオストリーム要求を処理します。
コンピュータをカメラの Wi-Fi ネットワークに接続して実行します:
python3 "AVIOCTRL Script/ウタ.py"
デフォルトのターゲットは 192.168.100.1:6666 です。必要に応じて別のアドレスを指定できます:
python3 "AVIOCTRL Script/ウタ.py" --host 192.168.100.1 --port 6666 --debug
対話型クライアントは、バッテリーと設定の読み取り、SD カードの検査、写真の撮影、録画の開始・停止、ファイルの一覧表示・アップロード・ダウンロード・削除、サムネイルの要求、Wi-Fi の設定、ビデオストリームの要求、手動の IOCTRL コマンド送信ができます。
SD カードのフォーマット、ファイルの削除、Wi-Fi 設定の変更、工場出荷時リセットはカメラを変更します。これらのコマンドは、自分が所有するハードウェアとデータに対してのみ使用してください。
調査対象のファームウェアは、カメラのホットスポットが有効な間、認証なしの HTTP エンドポイントを公開しています。任意のファイルアップロードを受け入れ、クライアントまたはアップロードされたコンテンツのいずれも検証せずに SD カードに直接書き込みます。攻撃者は full_img.fex という名前のカスタム eGON イメージをアップロードできるため、これにより完全なファームウェア置き換えが可能になります。カメラはそのファイル名を OTA パッケージとして認識し、通常の更新フローを通じて攻撃者が制御するファームウェアを公式アップデートであるかのようにインストールします。
悪用に成功すると、アップロードされたファームウェアがデバイス上で実行されているソフトウェアを完全に制御できるようになります。同梱の概念実証は、悪意のある OTA イメージがインストールされた後、オリジナルのアプリケーションを、生の RGB565 フレームと PCM オーディオを使用して Bad Apple!! ビデオを再生するカスタム MiniGUI/AudioTrack ペイロードに置き換えることでこれを実証しています。
POC/ ディレクトリには以下が含まれます:
run_exploit.sh:攻撃者が制御する full_img.fex をカメラにアップロードしますfull_img.fex:カメラの OTA 更新メカニズムが受け入れる細工された eGON ファームウェアイメージバイバイ/:更新後の任意コード実行を実証するために使用される MiniGUI および AudioTrack の Bad Apple!! ペイロードextract_rgb_pcm_from_mp4/:デモビデオを生の RGB565 および PCM データに変換するためのヘルパーメディア変換ヘルパーには ffmpeg が必要です。生成された video.rgb および audio.pcm ファイルは、デモペイロードによってカメラの SD カードのルートに置かれることが想定されています。
この概念実証は本質的に破壊的です。不正な形式または互換性のないイメージは、カメラを恒久的に文鎮化させる可能性があります。所有していないデバイスに対して、または完全な復旧手段なしに実行しないでください。
このプロジェクトは、著者が合法的に入手したハードウェアに対するリバースエンジニアリング、相互運用性、教育、セキュリティ研究のために作成されました。SJCAM、Allwinner、Novatek、Android、およびそれらのコンポーネントの名称は、それぞれの所有者に帰属します。
このリポジトリには、ファームウェアサンプル、リバースエンジニアリングデータベース、ヘッダー、サードパーティ製品由来の共有ライブラリとともに、オリジナルのソースコードが含まれています。サードパーティの素材に対してライセンスは付与されません。研究環境の外でこれらのファイルを再配布または使用する前に、出所と適用される法律を確認してください。
現在、リポジトリ全体に適用されるオープンソースライセンスはありません。wpa_supplicant ソースは、Lelouch/modified_lelouch_wpa_supplicant_source/COPYING に独自のアップストリームライセンスを保持しています。
| パス | 内容 |
|---|
Lelouch/ | カスタムファームウェアインターフェース、ビルド環境、回収したヘッダー、プロプライエタリな共有ライブラリ、および修正版 wpa_supplicant ソース |
Reversing Scripts/ | Allwinner IMAGEWTY、Allwinner eGON、Novatek BCL1 ファームウェア用のパーサーと再パッカー |
AVIOCTRL Script/ウタ.py | SJCAM Zone が使用するプロプライエタリな TCP プロトコル用の対話型クライアント |
Bin Files/ | 研究で解析した主要な実行ファイルと共有ライブラリの IDA データベース |
Firmwares Files/ | 開発中に使用した Allwinner および Novatek のファームウェアサンプル |
POC/ | CVE-2026-52656 の概念実証、細工された eGON イメージ、およびフレームバッファ/オーディオのデモペイロード |