第二章:嵌入式安全基础

各位同学,欢迎来到第二章。这一章,我们要打好地基。

嵌入式安全,说白了就是研究那些「藏在设备里的电脑」怎么被攻破。我做了这么多年渗透测试,发现一个规律:越是看起来不起眼的小设备,漏洞往往越多。为什么?因为很多厂商只关心功能能不能跑,压根没想过安全这回事。

2.1 嵌入式系统定义

嵌入式系统是什么?简单说,就是「专门干一件事的计算机系统」。你家里的路由器、智能电饭煲、汽车里的ECU、医院的输液泵……这些都是嵌入式系统。

它们和普通电脑的区别在哪?我总结了几点:

  • 资源受限:内存小、CPU慢、存储空间有限。你想想看,一个路由器可能只有64MB内存,跑个完整的Linux都费劲。
  • 功能专用:它只做一件事,比如路由器只管转发数据包,不会让你在上面写文档。
  • 实时性要求高:工业控制器必须在几毫秒内响应,慢了就会出事故。
  • 难以升级:很多设备一旦部署,几年甚至十几年都不会更新固件。

核心观点:嵌入式系统的安全短板,恰恰就出在「资源受限」和「难以升级」这两点上。攻击者可以利用这些限制,找到厂商来不及修补的漏洞。

2.2 常见嵌入式架构

做嵌入式漏洞利用,你得先认识三种主流架构。我按自己的经验,给你排个序:ARM最常见,MIPS其次,RISC-V是后起之秀。

2.2.1 ARM架构

ARM统治了移动设备和物联网市场。你的手机、平板、大部分智能家居设备,里面都是ARM芯片。

ARM有几个特点:

  • 大小端模式:ARM默认小端,但也可以配置成大端。我在项目中遇到过,有些路由器固件用的是大端ARM,第一次调试时差点被坑。
  • Thumb指令集:16位指令,代码密度高。漏洞利用时经常要在ARM和Thumb模式之间切换,这个后面会细讲。
  • 异常模式:有7种运行模式,比如SVC(超级用户模式)、IRQ(中断模式)。提权漏洞往往和模式切换有关。

个人经验:我建议初学者先从ARM入手。因为ARM的文档最全,调试工具也最多。你买个几十块钱的开发板,就能跑起一个完整的Linux系统,非常适合练手。

2.2.2 MIPS架构

MIPS曾经是路由器、网关设备的霸主。虽然现在被ARM挤压得很厉害,但存量设备依然巨大。

MIPS有个让人头疼的地方:

  • 延迟槽:分支指令后面的那条指令,无论分支是否跳转,都会被执行。这个特性让ROP(返回导向编程)变得很麻烦。我记得第一次写MIPS的ROP链,调试了整整两天才搞定延迟槽的问题。
  • 没有NX位:早期的MIPS处理器没有「不可执行」的内存保护。这意味着你可以在栈上直接执行shellcode,攻击难度低很多。

避坑指南:我曾经在分析一个MIPS路由器漏洞时,发现明明控制了PC指针,但shellcode就是跑不起来。后来查了半天,原来是延迟槽里的指令把寄存器值改了。嗯,这个坑你们迟早会遇到,提前打个预防针。

2.2.3 RISC-V架构

RISC-V是开源指令集,这几年发展很快。国内很多芯片公司都在推RISC-V,因为它没有授权费。

从安全角度看,RISC-V有几个特点:

  • 指令精简:基础指令只有40多条,比ARM和MIPS都少。这意味着攻击面更小,但也意味着漏洞利用时需要更精细的控制。
  • 可扩展性:厂商可以自定义指令。这给安全分析带来了不确定性——你永远不知道某个RISC-V芯片里藏了什么「私货」。
  • 生态不成熟:调试工具、漏洞利用框架都还在完善中。目前针对RISC-V的公开漏洞还不多,但未来一定会多起来。

2.3 嵌入式设备攻击面分析

攻击面,就是你能下手的地方。我习惯把嵌入式设备的攻击面分成四类:

攻击面类型 具体入口 我的实战案例
物理接口 UART、JTAG、SPI、I2C 通过UART串口拿到root shell,这是最经典的入门操作
网络接口 HTTP、Telnet、SNMP、UPnP 某品牌路由器Web管理界面存在命令注入,直接getshell
无线接口 Wi-Fi、蓝牙、ZigBee、NFC 智能灯泡的蓝牙协议没做认证,可以远程控制开关
固件接口 固件更新、配置备份、文件系统 从固件里提取出硬编码的私钥,解密了所有通信流量

你想想看,一个设备有这么多入口,只要有一个没守住,整个设备就沦陷了。我见过最离谱的案例:某智能门锁,物理接口没做保护,直接用JTAG读出了Flash里的管理员密码。

2.4 固件提取与逆向工程简介

固件,就是设备的操作系统和应用程序打包在一起的文件。拿到固件,你就拿到了设备的「灵魂」。

2.4.1 固件提取方法

提取固件有三种主流方式:

  1. 从官网下载:最简单,但厂商可能会加密或混淆。
  2. 通过UART/JTAG读取:需要物理接触设备,但最可靠。
  3. 从Flash芯片直接读取:用编程器或者热风枪吹下芯片,用读卡器读出数据。

我个人最常用的是第二种。拿UART来说,你只需要找到板子上的TX、RX、GND三个引脚,用USB转串口模块连上,设置好波特率(通常是115200或57600),就能看到设备的启动日志。如果bootloader没做保护,你甚至可以直接中断启动过程,进入uboot命令行。

关键技巧:很多设备的UART接口不会标注引脚定义。我的经验是:用万用表量电压。GND一般是0V,TX在空闲时是3.3V或1.8V,RX在空闲时也是高电平。多试几次,总能找到正确的组合。

2.4.2 固件逆向工程

拿到固件之后,第一步是解包。常见的固件格式有:

  • SquashFS:只读压缩文件系统,Linux嵌入式设备最爱用。
  • JFFS2/UBIFS:可读写文件系统,适合需要保存配置的设备。
  • TRX/CHK:带头部信息的固件包,需要去掉头部才能解压。

解包工具我推荐 binwalk。这个工具能自动识别固件里的文件系统、压缩算法、甚至隐藏的代码。用法很简单:

# 扫描固件,识别文件结构
binwalk firmware.bin

# 提取所有识别的文件
binwalk -e firmware.bin

解包之后,你会得到一个完整的文件系统。这时候就可以开始分析了:

  • 找硬编码的密码和密钥
  • 分析Web应用的PHP/Python代码
  • 反编译二进制程序,找缓冲区溢出漏洞

我的习惯:拿到固件后,我第一件事是搜 passwordsecretkey 这些关键词。很多时候,厂商会把调试用的后门密码留在固件里。我曾经在一个摄像头固件里找到了一串base64编码的字符串,解码后就是root密码——厂商连编码都懒得换。

本章知识体系

下面这张图,是我梳理的本章核心逻辑。你可以把它当成一张「作战地图」:

嵌入式安全基础 - 知识体系 嵌入式安全基础 嵌入式系统定义 常见架构 攻击面分析 固件提取与逆向 资源受限 功能专用 实时性要求 难以升级 ARM MIPS RISC-V 物理接口 网络接口 无线接口 固件接口 官网下载 UART/JTAG Flash读取 逆向分析 核心目标:找到攻击面 → 提取固件 → 逆向分析 → 发现漏洞

这张图把本章内容串起来了。你从「嵌入式安全基础」出发,先理解系统定义,再熟悉三种架构,然后分析攻击面,最后掌握固件提取和逆向的方法。每一步都是为后面的漏洞利用打基础。


好了,第二章就到这里。内容不少,但都是干货。我建议你找个旧路由器或者开发板,亲手试试UART连接和binwalk解包。光看不练,永远学不会。

公众号:蓝海资料掘金营,微信deep3321