VMC2040安全摄像头的Root操作
摘要
本篇博客文章是系列教程的第一部分,内容涵盖硬件检查、UART发现以及初始Bootloader分析,目标是对Arlo VMC2040安全摄像头进行Root操作。
<p><a href="https://lobste.rs/s/jfe19u/rooting_vmc2040_security_camera">评论</a></p>
查看缓存全文
缓存时间: 2026/05/08 20:32
# 破解VMC2040安防摄像头第一部分:基础检查
来源:https://www.marcusfolkesson.se/blog/arlo-vmc2040-part1/
## 简介
我朋友有一个Arlo VMC2040安防摄像头[\[1\]](https://www.marcusfolkesson.se/blog/arlo-vmc2040-part1/#footnote-1),一直放在架子上。他买了很久,但几乎没用过,因为需要订阅才能正常使用。他唯一想要的功能是无需云服务就能直接从摄像头获取视频流,但可惜原厂不支持。
瑞典复活节假期很长,我决定看看这个摄像头,探索一下可能性。了解一款安防摄像头实际的安全性,以及固件中是否留有后门或调试功能,会很有趣。
/media/arlo-5.jpg
本系列的第一部分专注于检查硬件和软件,尽可能从摄像头中获取更多信息。
该系列分为七个部分:
- 第一部分 (https://www.marcusfolkesson.se/blog/arlo-vmc2040-part1):基础检查
- 第二部分 (https://www.marcusfolkesson.se/blog/arlo-vmc2040-part2):提取固件
- 第三部分 (https://www.marcusfolkesson.se/blog/arlo-vmc2040-part3):分析启动序列
- 第四部分 (https://www.marcusfolkesson.se/blog/arlo-vmc2040-part4):深入分析
- 第五部分 (https://www.marcusfolkesson.se/blog/arlo-vmc2040-part5):未成功的方法
- 第六部分 (https://www.marcusfolkesson.se/blog/arlo-vmc2040-part6):成功的方法
- 第七部分 (https://www.marcusfolkesson.se/blog/arlo-vmc2040-part7):结论与总结
## 检查硬件
首先检查硬件,了解我们面对的是什么设备。VMC2040 基本符合云连接摄像头的预期配置:
- **SoC:**MStar/SigmaStar Infinity6 (SSC009B\-S01A) — 基于ARM
- **NAND闪存:**GigaDevice GD5F1GQ4UBYIG — 128MB SPI NAND
- **RAM:**128 MB DDR3
- **WiFi:**MediaTek MT7682
- **传感器:**PIR运动检测器、光传感器、扬声器
### 寻找UART
几乎所有嵌入式系统都有调试用的UART控制台,所以我搜寻了可能与SoC的UART引脚相连的焊盘和测试点。以下焊盘是热门候选:
/media/arlo-6.jpg
没错。我验证了这些引脚与SoC的UART引脚相连:
/media/arlo-7.jpg
WiFi模块也有UART引脚,但我没在意。
## 检查软件
既然有了UART,让我们看看摄像头启动时控制台是否输出信息。
### 初始引导加载程序
初始引导加载程序的输出提供了一些有用信息:
``
IPL b4d3638
D-0b
miupll_200MHz
256MB
BIST0_0001-OK
Load IPL_CUST from SPINAND
CLK->36
SPI+54M
SNI: 0010,0000,0005
BlSize 00003ed0
SNI: 0010,0000,0005
CUST_KEY
Checksum OK
IPL_CUSTb4d3638
CLK->36
SPI+54M
SNI: 0016,001c,0005
SNI: 0016,001c,0005
Load BL from SPINAND
CUST Key
KEYN_SIZE(0x0100)
KEYN_ADDRESS(0x23c03cd0)
decomp_size=0x000784dc
``
我们看到下一个引导加载程序是从SPI-NAND加载的:
``
Load BL from SPINAND
``
并且引导加载程序可能已签名:
``
CUST Key
KEYN_SIZE(0x0100)
KEYN_ADDRESS(0x23c03cd0)
decomp_size=0x000784dc
``
### U-Boot
接下来是U-Boot:
``
U-Boot 2015.01 (May 12 2021 - 03:08:24), Build: jenkins-CI-VMC2040-master-619
Version: I6gf088bce
I2C: ready
DRAM:
WARNING: Caches not enabled
SPINAND_I: SPINAND: _MDrv_SPINAND_GET_INFO: Found spinand INFO
(0xC8), (0xD9),
GD Quad mode enabled
SPINAND: board_nand_init: CIS contains part info
128 MiB
MMC: MStar SD/MMC: 0
INFO: ENV loaded
In: serial
Out: serial
Err: serial
No ethernet for Sparrow... PEGA-UBOOT VERSION:1.010-PRODUCTION
gpio debug MHal_GPIO_Pad_Set:603
gpio debug MHal_GPIO_Pad_Set:603
gpio debug MHal_GPIO_Pad_Set:603
gpio debug MHal_GPIO_Pad_Set:603
reset wifi done
secure_value 0x9, secure_flg 1:Enabled
NAND read: device 0 offset 0x200000, size 0x20000
Time:13059 us, speed:10036 kBps
131072 bytes read: OK
# Booting No.1 rootfs/kernel #
- Checking rootfs [ROOTFS]...
NAND read: device 0 offset 0x1300000, size 0x1000
Time:608 us, speed:6736 kBps
4096 bytes read: OK
Magic number 0x73717368.
Magic number 0x73717368 is a squashfs archive.
squashfs image_size 0xf76000
NAND read: device 0 offset 0x1300000, size 0xf77000
Time:1612774 us, speed:2065 kBps
16216064 bytes read: OK
secure checking ...
[U-Boot] Key in IPL_CUST
Magic number 0x73717368.
Magic number 0x73717368 is a squashfs archive.
squashfs image_size 0xf76000
runAuthenticate: compare RSA address --> MDrv_RSA_Run done
[U-Boot] Authenticate pass!
Pass
- Checking kernel [KERNEL]...
NAND read: device 0 offset 0x780000, size 0x1000
Time:607 us, speed:6747 kBps
4096 bytes read: OK
Magic number 0x56190527.
Magic number 0x56190527 is a kernel.
data_size 0x1a7f1c, 0x1c7f1a00
kernel image_size 0x1a7f5c
NAND read: device 0 offset 0x780000, size 0x1a9000
Time:173275 us, speed:10046 kBps
1740800 bytes read: OK
secure checking ...
[U-Boot] Key in IPL_CUST
runAuthenticate: compare RSA address --> MDrv_RSA_Run done
[U-Boot] Authenticate pass!
Pass
bootargs rootfs is root=/dev/mtdblock9 already.
- bootm run kernel...
## Booting kernel from Legacy Image at 22000000 ...
Image Name: MVX2##I6gf5c0b43KL_LX409####[BR:
Image Type: ARM Linux Kernel Image (lzma compressed)
Data Size: 1736476 Bytes = 1.7 MiB
Load Address: 20008000
Entry Point: 20008000
Verifying Checksum ... OK
-usb_stop(USB_PORT0)
-usb_stop(USB_PORT2)
Uncompressing Kernel Image ...
[XZ] !!!reserved 0x21000000 length=0x 1000000 for xz!!
XZ: uncompressed size=0x377000, ret=7
OK
ERR: Can't find KIMG header and initrd address, 0x00000000
atags:0x20000000
Starting kernel ...
``
这个转储也提供了一些有价值的信息。我们看到U-boot相当旧(来自2015年):
``
U-Boot 2015.01 (May 12 2021 - 03:08:24), Build: jenkins-CI-VMC2040-master-619
``
U-boot环境在运行时加载,可能来自闪存:
``
INFO: ENV loaded
``
内核和SquashFS根文件系统都经过RSA签名,并针对IPL_CUST分区中的密钥进行验证:
``
secure checking ...
[U-Boot] Key in IPL_CUST
runAuthenticate: compare RSA address --> MDrv_RSA_Run done
[U-Boot] Authenticate pass!
Pass
``
**不可能**通过向UART发送按键来停止启动过程并获得U-Boot提示符。
#### 内核
内核日志很长,这里只粘贴有趣的几行。
我们可以看到内核也比较旧:
``
Linux version 4.9.84 (root@firmware-device-build-1754937378489-33-mcz0d-g35sm) (gcc version 8.3.0 (GNU Toolchain for the A-profile Architecture 8.3-2019.03 (arm-rel-8.36)) ) #20 PREEMPT Mon Aug 11 19:03:09 UTC 2025
``
我们早就知道SoC是Infinity6,但确认一下也不错:
``
OF: fdt:Machine model: INFINITY6 SSC009B-S01A QFN128
``
内核命令行也很有趣。它提供了分区布局和UBI参数:
``
Kernel command line: ubi.mtd=11,2048 root=/dev/mtdblock9 rootfstype=squashfs ro init=/linuxrc LX_MEM=0xffc6000 mma_heap=mma_heap_name0,miu=0,sz=0x2400000 mma_memblock_remove=1 mtdparts=nand0:0xC0000@0x140000(IPL0),0xC0000(IPL_CUST0),0xC0000(UBOOT0),0xC0000(UBOOT1),0x140000(ENV),0x140000(ENV_P1),0xC0000(MANUFACTURE),0x5C0000(KERNEL),0x5C0000(KERNEL_P1),0x1E00000(ROOTFS),0x1E00000(ROOTFS_P1),-(UBI)
``
SoC有一个硬件AES引擎,因此我们不应期望根文件系统中存储任何明文密钥:
``
[SAR] infinity_sar_probe
MSYS: DMEM request: [AESDMA_ENG]:0x00001000
MSYS: DMEM request: [AESDMA_ENG]:0x00001000 success, CPU phy:@0x2D647000, virt:@0xCD647000
MSYS: DMEM request: [AESDMA_ENG1]:0x00001000
MSYS: DMEM request: [AESDMA_ENG1]:0x00001000 success, CPU phy:@0x2D648000, virt:@0xCD648000
infinity_aes soc:aesdma: SSTAR AES engine enabled.
cryptodev: driver aesdmadev loaded.
``
MTD分区及其地址范围:
``
0x000000380000-0x000000440000 : "UBOOT1"
0x000000440000-0x000000580000 : "ENV"
0x000000580000-0x0000006c0000 : "ENV_P1"
0x0000006c0000-0x000000780000 : "MANUFACTURE"
0x000000780000-0x000000d40000 : "KERNEL"
0x000000d40000-0x000001300000 : "KERNEL_P1"
0x000001300000-0x000003100000 : "ROOTFS"
0x000003100000-0x000004f00000 : "ROOTFS_P1"
0x000004f00000-0x000008000000 : "UBI"
``
UBI分区有一个名为“nvrservice”的卷:
``
ubi0: attaching mtd11
ubi0: VID header offset: 2048 (aligned 2048), data offset: 4096
ubi0: LEB size: 126976 bytes (124.0 KiB)
ubi0: PEB size: 131072 bytes (128.0 KiB), min. I/O size: 2048 bytes
ubi0: attached mtd11 (name "UBI", size 82 MiB)
ubi0: Volume name "nvrservice", ID 0
``
在启动接近结束时,我看到了这条日志:
``
Press Enter to activate console
``
不幸的是,按回车键无效。我们稍后会找出原因。
### 端口扫描
目标上没有运行与黑客攻击相关的友好服务:
``
1$ nmap 192.168.1.12
2Starting Nmap 7.98 ( https://nmap.org ) at 2026-04-04 15:45 +0200
3Nmap scan report for 192.168.1.12
4Host is up (0.012s latency).
5Not shown: 997 closed tcp ports (conn-refused)
6PORT STATE SERVICE
7554/tcp open rtsp
85061/tcp open sip-tls
9
10Nmap done: 1 IP address (1 host up) scanned in 4.07 seconds
``
## 我们目前了解的情况
到目前为止我们知道:
- SoC 是基于 ARM 的 SigmaStar Infinity6 (SSC009B\-S01A)
- 所有软件都在 SPINAND 闪存 (GigaDevice GD5F1GQ4UBYIG) 上
- 我们已物理连接调试 UART
- ROM 引导加载程序从闪存加载一个自定义的**已签名**引导加载程序
- U-Boot 版本是 2015.01
- 内核是 Linux 4.9.84
- 根文件系统是 SquashFS
- UBI 的 VID 头偏移为 2048 字节
- UBI 分区有一个名为 *nvrservice* 的卷
- 内核和根文件系统都经过 RSA 签名,并针对 IPL_CUST 分区中的密钥进行验证
- U-Boot 环境未签名,在运行时从闪存加载
- 没有明显的可通过网络攻击的服务
我们还弄清了 SPINAND 闪存的分区方式,并(猜测了)每个分区的用途:
| 分区 | 已签名? | 备注 |
|------|---------|------|
| IPL0 | 是 | 初始程序加载器 |
| IPL_CUST0 | 否? | 包含 RSA 公钥 |
| UBOOT0/1 | 是 | 引导加载程序 |
| ENV/ENV_P1 | 否 | U-Boot 环境 |
| KERNEL | 是 | |
| ROOTFS | 是 | |
| UBI | 否 | 挂载为读写 |
由于 IPL0、U-Boot、内核和根文件系统都已签名,没有私钥我们就无法修改它们。唯一可写的分区是 ENV 和 UBI。
## 总结
在这一部分,我们检查了硬件和软件,尽可能多地获取了摄像头的信息。我们还确定了闪存分区及其用途,并且知道唯一可写的分区是 ENV 和 UBI。
在第二部分 (https://www.marcusfolkesson.se/blog/arlo-vmc2040-part2) 中,我们将从闪存中提取固件,并仔细查看其内容。
---
相似文章
ruvnet/RuView
RuView 是一个开源 WiFi 传感平台,利用来自低成本 ESP32 传感器的信道状态信息(CSI)来检测人员、追踪运动、测量生命体征,以及在不使用摄像头或穿戴设备的情况下估计穿透墙壁的姿态。该系统完全在边缘硬件上运行,具有密码学证明机制,并使用脉冲神经网络进行本地自适应。
将机器人AI引入嵌入式平台:数据集录制、VLA微调和设备端优化
NXP和Hugging Face展示了在嵌入式机器人平台上部署视觉-语言-动作(VLA)模型的技术,涵盖数据集录制最佳实践、VLA微调以及针对i.MX 95处理器的设备端优化,包括量化和异步推理调度。
Vercel 2026年4月安全事件
Vercel披露了一起安全事件,涉及因一名Vercel员工使用的第三方AI工具Context.ai被入侵而导致对内部系统的未授权访问。少量客户凭证被入侵,但标记为敏感的环境变量未被访问;公司正与外部网络安全公司和执法机构合作积极调查。
你给我一个u32。我让你成为root。 (io_uring ZCRX freelist LPE)
Linux内核io_uring子系统中通过零拷贝接收freelist漏洞实现的本地权限提升利用。
Gemma 4 VLA 在 Jetson Orin Nano Super 上的演示
NVIDIA 与 Hugging Face 发布实操演示,展示 Gemma 4 作为视觉-语言-动作模型在 Jetson Orin Nano Super 上完整运行,使用本地语音转文字/文字转语音及网络摄像头输入。