本文主要是介绍论文阅读总结:The Nexmon firmware analysis and modification framework: Empowering researchers to enhance Wi,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
论文阅读总结:The Nexmon firmware analysis and modification framework: Empowering researchers to enhance Wi-Fi devices(Nexmon固件分析和修改框架:授权研究人员增强无线设备)
- 专有名词
- 1.introduction
- 2、相关工作
- 3、Broadcom的wifi芯片
- 3.1 信号传输路径
- 3.2 信号接收路径
- 3.3 可编程状态机(PSM)
- 3.4 嵌入式ARM处理器
- 4、分析固件加载和提高安全性
- 4.1 当前固件处理实现的分析
- 4.2 降低远程开发的风险
- 5、Nexmon固件补丁框架
- 5.1 Nexmon固件补丁框架的设计和开发
- 5.2 实现自定义目标
- 5.3 如何在运行时配置固件或提取调试信息
- 5.4 full mac卡和soft mac卡的区别
- 6、 可编程固件调试器
- 6.1 如何访问调试核心寄存器
- 6.2 调试器的实现
专有名词
- FPGA( field-pro-grammable gate arrays ):现场可编程门阵列
- DMA:寄存器
- MIMO(multiple-input multiple-output):多输入输出
- CTC(cross-technology communication):跨设备通信(异构无线网)
- PSM(programmable state machine):可编程状态机
- QAM(quadrature amplitude modulate):正交幅度调制信号
- IQ(inphase and quadrature):正交信号
- PHYs:物理层设备
- FIFO(First Input First Output):先进先出存储器
- D11
- CORDIC
- DSSS(direct sequence spread spectrum):直接序列扩频(802.11b/g)
- OFDM(orthogonal frequency-division multiplexing):正交频分复用(802.11a/g)
- DACs(digital to analog converters ):数字-模拟转换器
- JTAG
- GOT (global offset table):全局偏移表
- ioctl(input/output control):设备驱动程序中对设备的I/O通道进行管理的函数
- Breakpoint Control (DBGBCR) registers:断点控制寄存器
- Breakpoint Value(DBGBVR) registers:断点值寄存器
- Watchpoint Control (DBGWCR) registers :观察点控制寄存器
- Watchpoint Value(DBGWVR) registers:观察点值寄存器
1.introduction
绕开wifi芯片中FullMAC方法的限制,基于芯片未使用的物理层、mac子层的特性,开发出nexmon固件补丁框架。
贡献:
- 全面分析了Broadcom FullMac芯片
- 分析固件加载以及自定义固件的安全性
- Nexmon固件补丁框架的详细概要
- 一个支持单步的固件补丁
在第2节中,我们介绍了相关的工作
在第3节中介绍了芯片内部的背景
第4节中介绍了固件加载分析
在第5节描述我们的Nexmon框架
在第6节介绍调试补丁
第7节的讨论和第8节的结论来结束这项工作。
2、相关工作
- 将固件修改应用于FullMAC Wi-Fi芯片
- 修改在芯片上运行的所有实时代码
- 基于Nexmon框架的工作
3、Broadcom的wifi芯片
3.1 信号传输路径
当接收到来自主机的帧后,Wi-Fi芯片负责使用Wi-Fi头将帧的有效载荷通过无线接口转发,并修正物理层设置以到达目的节点。
物理层主要由三组组件组成:基带(从mac层提取比特并将它们调制成复杂的基带信号)、模拟前端(使用dac将其转化为模拟信号,转换到由选定的Wi-Fi频道号码定义的传输频率,传给外部组件)和无线电以及外部组件(将2.4 GHz和5 GHz信号通过双工器连接到双频天线)。
3.2 信号接收路径
- 收集原始样品:通过写入D11核心的psm_phy_hdr_param寄存器来触发捕获。使用SampleCollectStart和StopPtr寄存器,我们可以定义接收的原始样本存储在哪里。
- Wi-Fi帧的解调:首先需要检测帧的存在,找到帧的起始点。通过应用快速傅里叶变换(FFT)提取每个Wi-Fi子载波的正交调幅(QAM)符号来解调它们。由于无线信道上的衰落,每个子载波的发送和接收符号之间的振幅和相位发生变化。为了逆转这种影响,物理层需要通过将接收到的长训练场符号除以每个子载波已知的传输等效量来估计振幅和相位变化。结果称为CSI。
- 接收路径上的帧处理:
3.3 可编程状态机(PSM)
代码和数据相互分离并且可以外部访问。
3.4 嵌入式ARM处理器
RAM代码在一个固定的位置有一个函数指针表,ROM中的包装函数使用它来调用作为这个表一部分的函数。
对于某些固件来说,存储在ROM中的函数如果也被ROM中的其他函数直接调用,则需要覆盖它们以扩展它们,使它们与扩展结构兼容,或者只是修补安全漏洞。由于我们不能直接覆盖ROM内容,Wi-Fi芯片提供了一个闪存补丁单元。我们可以将其配置为在访问内存位置时从内存位置读回最多8个任意字节(大多数芯片)或正好8个字节(例如BCM43596a0)。使用闪存补丁,我们可以在有限的位置上改变ROM中的程序流。一般情况下,最多支持256个补丁。
4、分析固件加载和提高安全性
-
固件:1、在芯片生产期间安装在ROM上;2、由驱动器加载到随机存取存储器RAM中。
-
由于Broadcom的Wi-Fi芯片不验证固件文件的有效性,我们可以对固件二进制文件进行修改并将其重新加载到芯片中。从安全的角度来看,在通信设备上加载任意代码是非常危险的,因为它们可能会被恶意地重新配置。例如,操纵或嗅探网络流量,甚至对无线通道执行物理攻击。
-
Broadcom芯片允许攻击者远程注入和执行Wi-Fi芯片上的任意代码。
4.1 当前固件处理实现的分析
- 加载的固件没有签名和加密,容易被人使用反编译器进行反向工程。
- 将固件分割成ROM和RAM
4.2 降低远程开发的风险
需重新设计固件加载机制和存储机制:
- 数字签名,且必须使用非对称加密,公钥存储在内存。
- 固件代码必须存储在ROM中,验证代码之后才能将程序流引导到代码。
- 在加载和直接验证固件之前,主机系统必须锁定任何直接访问芯片内部的行为。
- 需要阻止主机系统直接访问芯片内部寄存器。在目前的设计中,主机系统直接访问连接所有芯片内部核心的骨干总线。因此,这种安全特性需要重新设计芯片的主机接口。
- 避免闪片和重组内存
- 限制调试功能:反向工程师不仅可以使用JTAG接口,还可以直接从软件访问调试寄存器。
- 阻止静态代码分析:确保没有人可以直接访问在Wi-Fi芯片上执行的二进制代码。可以使用对称加密算法进行固件加密。
- 确保数字签名公钥的可交换性:如果使用者想要运行自定义固件,芯片应该提供物理接口以便对存储在芯片中的公钥进行修改,公钥应该存储在一个单独的可读可写闪存中。同时,终端用户应该始终具有使用Wi-Fi驱动程序读取和验证已安装密钥的能力。
- 固件更新可以采用一种简单的内存随机化形式。
- 包含代码的内存区域应该被标记为可执行但没有写权限。包含数据的区域应该设置无执行位。这将阻碍对手将攻击代码注入数据内存并触发其执行。
- 防止降级攻击:在芯片中始终存储安装成功的固件的最高版本号,并且可以使用芯片上的外部引脚进行重置。
5、Nexmon固件补丁框架
这是一个使用C语言编写的固件补丁的开源框架。
5.1 Nexmon固件补丁框架的设计和开发
如何编写补丁:
-
at(0x100, ``’’, CHIP_VER_BCM4339, FW_VER_ALL):四个参数分别为,地址、flashpatch/dummy、芯片型号、固件版本;多个at-attribute可以使一个c文件应用到多个固件中。
flashpatch:在c中定义flash补丁。
-
BLPatch(name, func)和BPatch(name, func):跳转到目标函数func,func可以使函数名或者地址。
-
HookPatch4(name, func, inst):在调用原始函数之前,通过使用到中间函数的分支指令覆盖原始函数的前四个字节来调用钩子函数func,inst是原始函数中被覆盖的汇编指令。
-
GenericPatch1/2/4(name, val): 用val覆盖原始固件中的1、2或4个字节。目标函数地址应该+1。
哪里嵌入补丁代码:
在运行时分析固件,我们意识到某些功能和数据区域只需要在Wi-Fi芯片的初始化。在使用数据之后,调用hndrte_reclaim函数释放现在未使用的空间,并将其分配给堆。在将代码固件写入负责实时操作的可编程状态机(PSM)的内存后,最大的内存块将被释放。分析这个二进制代码可以压缩大约50%。
如何给只读内存(ROM)打补丁:
只需在ROM中覆盖一条分支指令(例如,使用BLPatch或BPatch),就可以将程序流从ROM重定向到RAM。
如何侧向加载功能到一个运行芯片:
Nexmon还允许在固件执行期间动态重新加载代码,所以黑客可以通过远程代码注入目标设备。
Nexmon PIC扩展:PIC表示位置无关。
对blob进行数字签名,非特权用户只能加载签名认证过的代码。
如何分析固件
动态分析:使用Nexmon,我们可以将调试代码打补丁到固件中。它可以使用printf函数将寄存器内容和其他调试信息写入控制台。
5.2 实现自定义目标
研究人员经常编写固件补丁来实现更高的目标,这是未经修改的Wi-Fi固件无法实现的。这包括激活监控模式和帧注入,以在操作系统中实现自定义的底层通信协议,然后通过降低延迟和功耗的固件实现。除了常规的帧处理,Nexmon还进一步提供了对物理层的直接访问,例如,释放类似sdr的功能来传输任意信号。
传输帧:
- wlc_sendpkt剥离以太网头,添加wifi头
- wlc_d11hdrs_ext设置物理层参数
- wlc_prec_enq排队
- wlc_send_q传输
- sendframe发送原始802.11帧
固件中从头制作帧,我们需要通过调用pkt_buf_get_skb创建一个sk_buff结构,并用原始帧字节填充它的数据部分。
在固件中,每个帧存储在一个sk_buff结构中,该结构包含一个指向帧本身(data)的指针,帧长度(len)和一些标志(flags)。底层数据内存甚至可以更大,通过调用skb_push和skb_pull辅助函数,我们可以通过自动调整len变量来前置或删除头文件来向前或向后移动数据指针。
wlc_phydump_chanest函数:它读取CSI表的内容并将它们作为字符串转储。
5.3 如何在运行时配置固件或提取调试信息
- 直接访问芯片内存:使用dhdutil ,它允许读写随机存取存储器中的任意存储位置,可以转储固件的内部控制台缓冲区。
- 使用printf函数:
- 使用用户数据报协议(UDP)通过隧道提取数据:将数据封装在UDP中发送给主机使用函数prepend _ Ethernet _ IP v4 _ udp _ header(默认情况下使用UDP端口5500)来预先准备以太网、IP和UDP头。
- 使用ioctls控制固件
- 将事件从固件发送到主机:使用Wi-Fi固件创建一个事件,并将其作为消息发送给主机,我们可以在驱动程序中处理它。
5.4 full mac卡和soft mac卡的区别
6、 可编程固件调试器
监视器模式调试:以软件的形式进行调试,每当调试事件发生时,调试核心都会生成异常。这些异常还会暂停当前正在运行的程序的执行,但随后会在异常处理程序中重定向执行以继续。
我们为ARM Cortex-R4微控制器实现了这样一个硬件支持的监控模式调试器,该微控制器在Broadcom Wi-Fi芯片上执行Wi-Fi固件。
6.1 如何访问调试核心寄存器
在控制寄存器中,我们设置了触发断点或观察点的条件。在值寄存器中,我们设置想要触发的地址。
6.2 调试器的实现
github发布版本:
debugger_base.c:存储每个调试器实现所需的初始化函数和异常处理程序。
debugger.c:设置断点和观察点,并实现相应的处理程序。
这篇关于论文阅读总结:The Nexmon firmware analysis and modification framework: Empowering researchers to enhance Wi的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!