
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를 사용하는 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 플래싱 절차는 이 페이지 상단에 링크된 연구 문서에 설명되어 있습니다.
모든 파서 진입점은 내장 --help 출력이 있는 Python 3 스크립트이며 타사 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 표준 라이브러리만 사용하여 카메라의 로그인 시퀀스, keepalive 메시지, 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 이미지가 설치된 후 원래 애플리케이션을 raw 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/ — 데모 비디오를 raw 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 이미지, 프레임버퍼/오디오 데모 페이로드 |