Home
//
projects
//
hardware-security-assessment-usd10-iot-camera-uart-extraction-and-firmware
ProjectApril 12, 2026

Hardware Security Assessment: $10 IoT Camera UART Extraction & Firmware Analysis

This report documents a hardware security assessment of a budget IoT camera ($10 USD). Through UART extraction and bootloader analysis, I successfully captured the full boot sequence, identifying critical firmware vulnerabilities: Ingenic XBurst T23 SoC with EOL U-Boot 2013.07 and Linux 3.10.14 kernel—both lacking 8+ years of security patches. The analysis reveals absent secure boot mechanisms, writable flash partitions, and exposed debug interfaces. Part 1 establishes the attack surface; subsequent phases will involve SPI flash extraction and network reconnaissance for deeper vulnerability mapping.

CCTVSecurity Research

WhatsApp Image 2026-04-12 at 18.58.26

# Target

The Target is a $10 IoT security camera. The camera has many features like remote microphone, infrared (night vision), saving footage to an internal SD card, a companion mobile application, panning and tilting. This many features in such a cheap device could be home to a large attack surface, anything from video feed capture to microphone eavesdropping. Additionally, low cost-focused devices such as this most likely call home and/or have unencrypted video and audio data transmission.

The tools I have used are basic. A regular 90W soldering iron with its accessories, jumper wires and TTL-To-USB adapter.

# Getting the Device Open

The first step is disassembling the device. It seems as though there are 2 screws holding the whole operation shut. WhatsApp Image 2026-04-12 at 18.58.26 (1)

There is no need for destructive measures and simply unscrewing them shows me the internals and prying at the edges reveals the internals.

WhatsApp Image 2026-04-12 at 18.58.26 (2)

# Finding UART

Luckily, UART is clearly marked but there is a problem. The UART interfaces are pads and not through holes, since I don't have probes interfacing with UART is going to require a bunch of extra work.

Before proceeding though, I wanted to make things easier so I removed connecting cables since they were making the operation crowded.

WhatsApp Image 2026-04-12 at 18.58.27

3 pads under and to the left of the SD card reader, labeled RX, TX and GND.

Furthermore, I noticed that there are 2 sets of UART interfaces. One on what seems to be the main board which is what is showcased above. The second set is another board laying under the main one. I have never seen this before nor have I researched it. I prematurely assume that the same way there is a motor or battery controller/manager there is a similar thing for a camera and that UART is to interface with it specifically.

WhatsApp Image 2026-04-12 at 19.30.22

2 Pins above the camera lens labeled RX and TX, there is a 5V pin and GND seems to be under the lens housing, interesting design choice.

# Interfacing with UART

To interface with UART without pads I would have to solder jumper wires to the pads and connect those jumper wires to the TTL-to-USB adapter.

I inferred the baudrate 115200 which is the most common for similar devices.

WhatsApp Image 2026-04-12 at 18.58.27 (2) WhatsApp Image 2026-04-12 at 18.58.28 WhatsApp Image 2026-04-12 at 18.58.28 (1)

After soldering the jumper wires I realized that they are too short and I would need to solder more jumper wires...

The last step is simply connecting the pins to their respective counterparts on the USB-to-TTL adapter. WhatsApp Image 2026-04-12 at 18.58.28 (3)

# UART Findings

Serial interface accessed: UART1 (ttyS1 @ 0x10031000, 115200 baud).

Successfully captured full boot sequence from SPL through kernel initialization.

This confirms TX is working perfectly. RX on the other side seems to be an issue. That could be the result of multiple things: my poor soldering, an interrupted RX line, console is read-only, or no interactive shell.

SoC identification: Ingenic XBurst T23 is a low-cost MIPS SoC — common in budget IP cameras.

Flash chip: ZB25VQ64 (64Mbit = 8MB) — is this sufficient for firmware + rootfs + appfs?

RAM constraints: 32MB RAM + 27MB usable = tight. This explains why squashfs (read-only compressed filesystem) is used.

PCB design observations: Two-board design (main + camera module). Implication: modular but increases attack surface (inter-board communication = potential side-channel)

ComponentValue
SoCIngenic XBurst T23 (MIPS)
RAM32 MB (27 MB usable)
FlashZB25VQ64 (64 Mbit / 8 MB)
U-Boot Version2013.07-svn8146 (EOL 2015)
KernelLinux 3.10.14 (EOL 2017)
Filesystemssquashfs (read-only), jffs2
UART Baudrate115200
UART StatusTX functional, RX unresponsive
U-Boot 2013.07-svn8146 (Jan 18 2025 - 10:44:22)

Board: ISVP (Ingenic XBurst T23 SoC)
DRAM:  32 MiB
Top of RAM usable for U-Boot at: 82000000
Reserving 385k for U-Boot at: 81f9c000
Reserving 16416k for malloc() at: 80f94000
Reserving 32 Bytes for Board Info at: 80f93fe0
Reserving 124 Bytes for Global Data at: 80f93f64
Reserving 128k for boot params() at: 80f73f64

Booting kernel from Legacy Image at 80600000 ...
   Image Name:   Linux-3.10.14__isvp_pike_1.0__
   Image Type:   MIPS Linux Kernel Image (lzma compressed)
   Data Size:    1332627 Bytes = 1.3 MiB
   Load Address: 80010000
   Entry Point:  803277b0
   Verifying Checksum ... OK
   Uncompressing Kernel Image ... OK

Linux version 3.10.14__isvp_pike_1.0__ (book@100ask) (gcc version 5.4.0 (Ingenic Ingenic r3.3.0-gcc540 Smaller Size 2023.05-22) ) #7 PREEMPT Thu Feb 13 15:09:34 CST 2025
Ingenic Kernel version H20241112a

cpufreq 	udelay 	loops_per_jiffy	
12000	 5942	 5942	
24000	 11884	 11884	
60000	 29710	 29710	
120000	 59421	 59421	
200000	 99035	 99035	
300000	 148553	 148553	
600000	 297106	 297106	
792000	 392180	 392180	
1008000	 499138	 499138	
1200000	 594212	 594212	
squashfs: version 4.0 (2009/01/31) Phillip Lougher
jffs2: version 2.2. © 2001-2006 Red Hat, Inc.

Creating 7 MTD partitions on "jz_sfc":
0x000000000000-0x000000040000 : "boot"
0x000000040000-0x000000048000 : "bootenv"
0x000000048000-0x0000001b8000 : "kernel"
0x0000001b8000-0x000000488000 : "rootfs"
0x000000488000-0x000000798000 : "appfs"
0x000000798000-0x0000007f8000 : "config"
0x0000007f8000-0x000000800000 : "confbak"

This is the bootlog minus noise (or what I deem to be noise)

The bootlog reveals several security-critical design choices. The device boots with console=null (no interactive shell on primary UART), yet the absence of secure boot mechanisms and presence of older, unpatched kernel versions suggests the firmware was designed for cost optimization over security.

# Possible CVEs

U-Boot 2013.07 reached end-of-life back in 2015. A simple Google search reveals at least 5 publicly disclosed vulnerabilities affecting this version, including:

  • CVE-2024-57254
  • CVE-2024-57255
  • CVE-2024-57258
  • CVE-2024-57259
  • CVE-2020-8432

Linux 3.10.14 similarly reached LTS end-of-support in 2017, accumulating 2205 known kernel CVEs unpatched in this firmware.

Without confirming which patches, if any, are present in this device's firmware build, specific vulnerability enumeration requires binary analysis.

# Next Steps

Network reconnaissance will be the next phase. By connecting to the device's hotspot and capturing traffic with Wireshark, I can identify the communication protocols (likely HTTP or proprietary binary protocol), detect information leakage, and assess network-layer security. If RX remains inaccessible, SPI flash extraction via CH341A programmer becomes the primary path forward for firmware analysis.