VMC2040安全摄像头的Root操作

Lobsters Hottest 新闻

摘要

本篇博客文章是系列教程的第一部分,内容涵盖硬件检查、UART发现以及初始Bootloader分析,目标是对Arlo VMC2040安全摄像头进行Root操作。

<p><a href="https://lobste.rs/s/jfe19u/rooting_vmc2040_security_camera">评论</a></p>
查看原文 导出为 Word 导出为 PDF
查看缓存全文

缓存时间: 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

GitHub Trending (daily)

RuView 是一个开源 WiFi 传感平台,利用来自低成本 ESP32 传感器的信道状态信息(CSI)来检测人员、追踪运动、测量生命体征,以及在不使用摄像头或穿戴设备的情况下估计穿透墙壁的姿态。该系统完全在边缘硬件上运行,具有密码学证明机制,并使用脉冲神经网络进行本地自适应。

Vercel 2026年4月安全事件

Lobsters Hottest

Vercel披露了一起安全事件,涉及因一名Vercel员工使用的第三方AI工具Context.ai被入侵而导致对内部系统的未授权访问。少量客户凭证被入侵,但标记为敏感的环境变量未被访问;公司正与外部网络安全公司和执法机构合作积极调查。

Gemma 4 VLA 在 Jetson Orin Nano Super 上的演示

Hugging Face Blog

NVIDIA 与 Hugging Face 发布实操演示,展示 Gemma 4 作为视觉-语言-动作模型在 Jetson Orin Nano Super 上完整运行,使用本地语音转文字/文字转语音及网络摄像头输入。