☰
黑盒动态分析逆向芯片FSM:原理、管线与实战
2026/10/14 1:43:04 网站建设 项目流程

去年我在整理硬件安全方向的文献时,被一篇来自 TIFS 2021 的工作吸引了注意力:论文题目直白得很,就是“对硬件动态分析逆向出FSM”。这里FSM就是有限状态机。做嵌入式安全的人都知道,芯片不是一堆晶体管随便堆的,芯片内部绝大多数控制逻辑,本质上都是状态机的物理实现——从串口控制器到DMA引擎,从Cache一致性协议到安全引导流程,底层全是状态和状态跳转。如果能把别人芯片里的状态机逆向出来,等于拿到了硬件行为的设计图纸。

这篇论文的切入点很有意思:不打开芯片、不扫描电子显微镜、不依赖复杂探针台,而是通过黑盒动态分析——就是给芯片喂输入、测输出、观察状态变化,用一种比较聪明的方式把隐藏在时序行为背后的FSM给“钓”出来。我读完这篇论文之后,花了些时间复现了其中的思路,踩了不少坑,也补了不少作者在论文中没有展开的细节。这篇文章就把整件事掰开揉碎,从动机、原理、管线拆解,到我自己实操时遇到的实际问题,一次说清楚。

1. 为什么“对硬件动态分析逆向出FSM”是个值得研究的问题

1.1 硬件黑盒信任危机:你知道手里的芯片在里面干什么吗

先讲个真实场景。你在做一块板子,核心芯片要么来自某大型半导体原厂,要么是从第三方采购的IP核,甚至可能是二手市场上淘来的拆机片。正常情况下,你会相信芯片厂给出的数据手册和参考设计,但“信任”这事在硬件安全里从来不是默认值。几年前的供应链安全事件已经很清楚地说明了一点:芯片可能在流片阶段就被植入恶意逻辑,也可能在封装测试环节被动过手脚。这些恶意逻辑平时不发作,但在特定条件下,比如收到某个特殊指令组合,就会激活,执行数据外泄、权限提升这类动作。

问题在于:芯片内部的真实行为,你没法通过看数据手册来验证。数据手册描述的是设计者希望你知道的规格,不一定是芯片实际做的每一件事。组合逻辑的网表可以通过光刻照片比对来逆向,但控制逻辑属于时序逻辑,它是跟着时钟一步步走的,光靠静态分析很难还原出完整的控制流。这个时候就需要动态分析——让芯片真的跑起来,通过观察输入输出、电源纹波、电磁辐射这类听得见摸得着的信号,反推它内部控制逻辑的状态跳转关系。这正是这篇论文的核心战场。

1.2 FSM:硬件里无处不在的“小剧本”

要想理解这篇论文,得先明白FSM在硬件里的地位。你可以把FSM理解为硬件控制逻辑的剧本:芯片知道自己在哪一幕、能演什么、下一步该去哪。一个典型的串口发送模块,就是状态机在“空闲—加载—移位—停止”之间循环;一个存储控制器也是状态机在“空闲—命令解析—读取—写入—刷新”之间切换。状态机不只是简单的逻辑门堆叠,它是带记忆的时序系统,输出不仅取决于当前输入,还取决于当前所处状态。

这就给逆向工作带来了根本性的挑战:组合逻辑,你可以通过静态网表分析把布尔方程列出来,输入一变输出立刻变;但状态机的行为必须看时间轴上的输入序列,同样的输入在不同状态下可能产生完全不同的输出。所以,想还原FSM,必须做动态分析,观察它在真实运行中的状态迁移轨迹,光盯着静态代码或网表是远远不够的。这也解释了这篇论文为什么选择“动态分析”这条路线。

1.3 为什么不是其他路线:静态分析有它够不着的盲区

可能有读者会问,芯片逆向不是有成熟的静态分析路线吗?确实有,比如用聚焦离子束切芯片、用扫描电子显微镜拍每一层金属布线、再人工把门级网表拼出来。这套做法在顶级实验室里已经跑了几十年,但它有几个硬伤。

第一是成本,一台能拍芯片内部结构的设备动辄数百万,普通安全团队根本用不起。第二是周期,拍一张高清的芯片截面图就要数小时,完整逆向一个小规模芯片的网络传输是论月算的。第三最关键:就算你拿到了门级网表,能不能从中还原出“状态机”仍然是两说事。门级网表是海量布尔方程和触发器,它们组合起来能表达状态机,但要把这些状态从触发器寄存器中“提取”出来,再理清状态之间的跳转关系,需要极强的形式化方法功底,而且一旦芯片设计做了状态编码混淆,静态逆向的难度直接爆炸。相比之下,动态分析把这些复杂度全部绕开了——我不关心门级实现,我只关心芯片从外部看是什么行为,然后从行为反推状态逻辑。这就像你不需要拆开一个人的脑子,只需要观察他面对不同问题的反应,就能大致推断他的决策模型。动态分析的成本更低、周期更短、也更接近攻击者的真实操作场景。

2. 动态环境下的观测窗口:能测什么,不能测什么

2.1 可控输入与可观输出:黑盒动态分析的前提条件

动态分析的第一个约束条件,是你要对被测设备有“可控的激励能力”和“可观测的响应能力”。说白了,你能给它发指令,你能看到它的反应。对于绝大多数数字芯片来说,这个条件天然成立——因为芯片设计出来就是为了跟外界交互,总有引脚、总线、寄存器接口。你用微控制器或者逻辑分析仪接上目标芯片的外部接口,就可以构成一个最基本的动态分析测试环境。

我自己的一个体会是,接口的选取几乎决定了后续逆向工作的质量。选择标准有三个:优先选择可重复执行的接口,比如可以通过寄存器读写循环触发相同行为;优先选择有明确时序边界的接口,比如有帧起始信号、有任务完成中断;优先选择能观察到中间状态的接口,比如带状态寄存器或标志位。如果被测对象只有一组串行数据线和一根时钟线,那动态观测的维度会少很多,后面做状态推断的时候信号特征不足,状态区分度会非常低。

2.2 时间分辨率与信号对齐:迹线数据里藏着的陷阱

动态采集到的原始数据是一连串信号波形,论文中叫“迹线”。一条好的迹线要有高时间分辨率——至少能分辨出单个时钟周期内的信号变化。不过很多初学者在这里容易踩坑:逻辑分析仪采样率不够,或者探针地线没接好,导致采集到的信号有毛刺、有毛刺不处理就硬做对齐,后面所有分析都是白搭。

我在复现时踩过一个特别典型的坑:用一根劣质杜邦线连接目标芯片的总线信号和逻辑分析仪,结果几条信号线的传播延迟不一致,逻辑分析仪上看到的时序跟芯片真实时序就差了两三个纳秒。看似不多,但在高频总线协议里,两个纳秒完全可以改变协议状态的判定结果,导致状态迁移图里出现根本不该存在的假状态转移。后来换成了等长线缆加短地线,一次通过。这个细节论文里没说,但它直接决定了实验成败——硬件逆向里的第一课永远是信号完整性,不是算法。

2.3 寄存器可读性的杠杆作用:半黑盒比纯黑盒好太多

论文中有一个值得仔细琢磨的处理:作者假定被测硬件允许读取内部寄存器状态。可能有读者会问,这不是自相矛盾吗?如果芯片真的有恶意逻辑,怎么会把状态寄存器开放给你读?这正是论文里设定比较聪明的地方:现实中的很多商用芯片,调试接口和状态寄存器并不同时被安全锁定。芯片原厂为了售后诊断、固件升级、功耗调优,会留下一些可读的状态观测点,这些观测点不暴露完整FSM,但会暴露FSM的“部分影子”——比如某些协议引擎的状态编号、当前命令队列深度、收发缓冲区占用率。

有了这些寄存器读取能力,逆向工作就从纯黑盒升级成了“半黑盒”。你不再只能靠外部引脚信号猜内部状态,而是每个时钟周期都能拿到一些关于内部状态的间接观测。这个信息量是非常大的,它让后续的状态聚类和状态推断工作有了锚点,说白了就能把它当成一串带噪声的“状态标签序列”来处理。我自己做的实验里,纯黑盒情况下状态恢复准确率大概在六成左右,加上寄存器观测之后,准确率直接跳到九成以上。这个差距,直接决定了你是能还原出完整状态机,还是只能还原出一团乱麻。

3. FSM逆向的完整管线拆解:从波形到状态迁移图

3.1 第一步:激励设计与边界遍历

动态分析的第一个实操环节,是设计输入激励。这一步的目标很明确:尽可能覆盖状态机的所有可达状态和状态转移路径。但真正做的时候远比想象的复杂。你面对的是未知状态机,你不知道它有几个状态,也不知道哪些输入序列能触发深层次的迁移,只能靠两类输入去试探:一类是协议规范里定义的正常指令,另一类是边界和异常输入,比如超长帧、非法指令码、时序违规操作。论文里的方案大致也是这样,用正常流量先摸清主路径,用异常输入去“戳”状态机的隐藏分支。

我在复现的时候发现一个很有用的技巧:状态机内部通常会定义错误处理状态,比如收到非法指令后进入“错误等待”状态,再通过超时或复位命令回到空闲状态。这类错误路径是普通测试永远覆盖不到的,但对逆向来说价值极高——因为异常路径往往能暴露状态机的“安全边界”,你通过异常路径观测到的新状态,往往就是判断芯片是否有恶意逻辑的关键证据。所以我的建议是,激励设计表里至少要留一半额度给异常输入,不要被协议手册带偏。

3.2 第二步:迹线采集与状态特征提取

激励打出去之后,目标芯片会产出一大堆时序响应信号。此时不能直接把原始波形送进状态推断算法,需要先做特征提取。什么样的特征适合区分状态?可以是输出总线上的模式组合、状态寄存器的值变化、关键控制信号的电平翻转,也可以是耗时信息——比如某些状态停留固定的周期数。论文里用的是多目标联合观测,我自己的经验是,特征不是越多越好,而是要挑区分度高的。如果一股脑把所有信号都塞进去,互相干扰导致状态聚类分裂,后续构建的状态迁移图里会平白多出一堆伪状态。

特征提取做完之后,还要做一个重要处理:时间对齐。不同迹线之间可能存在相位偏移,比如触发条件抖动导致第一条迹线从第10个时钟开始记录,第二条从第12个时钟开始。不做对齐直接比较,所有信号特征都会失真。我用的办法是找迹线中一个稳定的参考沿,比如帧起始信号或者周期性的ping信号,把所有迹线都以它为原点做重新切片。这个操作看起来不起眼,但它是后续所有分析成功的地基。

3.3 第三步:状态推断与状态合并

这是论文中算法层面的核心环节。拿到观测迹线和特征之后,问题变成:我怎么知道哪些观测特征对应同一个状态,哪些对应不同状态?更麻烦的是,同一个逻辑状态在不同时刻(比如负载不同的时候)观测到的特征可能有细微差异,直接细抠每一个快照会产生爆炸性的状态数量。论文采用的办法是聚类加合并两段式:先通过聚类算法把特征空间中的相近点聚成候选状态簇,然后再用状态迁移的一致性校验,把能够证明是同一个状态的簇合并。

我自己实现这一步时发现,聚类参数的选择特别敏感。簇的半径设太大,会把不同状态并成一个,状态机被过度简化;簇半径设太小,同一个状态的噪声波动又会被拆成好几个假状态。论文里没有给出参数选择的通用准则,我摸索出的一个相对实用的方法是,用“状态最少但迁移覆盖完整”作为目标函数,反复调整聚类参数,直到裂缝稳定不再剧烈变化。总而言之,这一步没有什么银弹,更多是实验调参的经验活,但调参过程会迫使你更深入理解观测数据的本质。

3.4 第四步:状态迁移图重建与语义标注

状态标注完成之后,接下来要做的是重建状态之间的跳转关系。这一步的核心是观察迹线序列中状态的前后关系:从状态A出发,施加某个输入,状态跳到状态B;同一条件下重复实验,如果总是从A跳B,就可以确认AB之间有一条确定性的迁移边。把所有迹线中的这类迁移关系汇总,就得到了一个初步的状态迁移图。

到这里,逆向工作还没有完成,因为状态迁移图只告诉我们状态怎么跳,没告诉我们每个状态“意味着什么”。最后还需要做语义标注:把某个状态和串口空闲、DMA等待、错误恢复这些功能语义挂上钩。怎么挂?两个手段:一是用已知输入的可预测行为做对照,比如输入一个软件复位命令,观察它跳到的状态,基本可以标注成“复位态”;二是用经验知识对照,比如某几个状态之间的迁移路径跟IEEE 802.3协议规范里的状态定义能对上,那这几个状态大概率就是协议引擎的主状态。做完语义标注,逆向出的FSM才有真正的利用价值。

4. 论文里隐含的假设与边界条件:哪些环节最容易翻车

4.1 可重置性:几乎所有FSM逆向都绕不开的前提

先提一个论文里一笔带过但极其关键的前提:被测硬件必须可重置。为什么这么重要?因为状态机推断算法的基础逻辑是先建立一个已知的初始状态,然后观察从初始状态出发的各类迁移。如果芯片上电后的初始状态不稳定,或者没法通过外部引脚强制进入一个确定的复位状态,那么每条迹线的起点都不一样,所有迁移比对都无法对齐,后面每一步分析都建立在流沙之上。

实操中怎么判断可重置性?我的经验是,至少要用三种方式去尝试复位:外部复位引脚拉低、上电重启、软件复位寄存器写值。只要有一种方式能稳定地把芯片带回同一个初始状态,动态分析就可以继续推进。但如果在这三个层面都搞不定,那我建议你调整整个实验设计,先设法找到芯片内部的复位信号,或者切换到另一个可观测接口上重做方案,不要硬上。

4.2 状态可观测性:直接读不到寄存器时怎么办

论文里做了“允许读寄存器”的设定,但真实攻击场景往往没那么友好,目标芯片可能把所有内部状态观测接口全部锁死。这种情况下,逆向工作还能做吗?答案是能,但精度和效率都要打折。你只能依靠外部引脚和行为特征来间接判断内部状态,比如根据数据线上的协议时序特征来猜测状态机的宏观位置。相当于你只能看到演员在舞台上说了什么台词,却看不到剧本写在哪个章节。

我自己也测过完全无寄存器观测的情况。坦白说,状态数的恢复效率会显著下降,原本能恢复的几十个状态里面,纯黑盒只能还原出大致十来个高显著性的状态。那些状态停留时间短、外部表现差异小的内部节点,几乎不可能被找回。这也意味着,论文的方法在“半黑盒”假设下表现最好,纯黑盒时它更适合做“找后门”而不是“完整逆向FSM”。读论文时切不可忽略这层隐含边界。

4.3 状态数量爆炸与聚类调参的拉扯

状态数量爆炸是FSM逆向投入产出比最难受的地方。一个正常的网络接口控制器,其核心协议引擎加上各种配置子状态,可能有几十上百个状态。如果特征提取粒度太细,聚类时状态数轻松翻到几百个,手动确认状态合并几乎不可能。但如果特征提取粒度太粗,重要区分信息又会被平均掉,重要的安全状态被淹没,逆向结果没有攻击鉴别力。

我在实操时发现一个还算有效的折中:对迹线数据做分层分析。先在全量数据上做粗粒度状态推断,拿到状态机骨架;然后针对骨架上的关键边沿,比如大状态之间的迁移点,做细粒度的局部特征提取,确认是否存在隐藏子状态。这种“先粗后细”的策略可以明显降低调参工作量,也更容易发现被噪声掩盖的隐蔽状态。论文里的方法没有这么细的分层描述,但它符合状态合并一致性校验的理论框架。

4.4 多时钟域与异步逻辑:同步假设失效的场景

很多现代芯片内部不止一个时钟域。接口控制器往往运行在低频率的IO时钟上,而核心处理引擎跑在高频率的系统时钟上,两个时钟域之间通过异步FIFO或握手信号做数据交换。论文中的FSM推断逻辑,隐含假设是“被测状态机是单时钟域的同步时序系统”,一旦这个假设不成立,迹线上的状态迁移关系就会变得不稳定。

举个真实例子:某个存储控制器工作在两个时钟域下,主状态机在一次命令处理过程中,需要等待另一个时钟域的事件信号。等待时间不确定,从外部观测来看,同一输入下它的停留周期数忽长忽短,做迁移比对时会发现状态跳转时间出现大幅抖动。后面我把观测粒度从“周期级”调整为“事件级”——不再比较每个时钟的状态,而是比较每个协议事件完成后的状态,抖动问题才得到抑制。这算是论文算法在真实芯片上的一个必要修正。

5. 我基于论文思路复现的一次FSM逆向实验

5.1 实验对象选择与测试环境搭建

为了验证论文方法的可复现性,我找了一颗协议行为相对清晰、状态逻辑可预测的网络控制芯片作为实验对象。选择这个对象有个讲究:它的数据手册里有完整的寄存器列表和中断状态描述,我可以用这些信息交叉验证逆向出的FSM是否正确。比起完全未知的黑盒芯片,这种“半已知”对象更适合验证方法论本身。

测试环境的搭建其实很简单,一张带PCIe接口的主板、一个逻辑分析仪、一段定制的测试程序,全部加起来不到几千块。我写了个Python脚本跑在主机端,通过总线接口给目标芯片发送构造好的数据包序列,同时用逻辑分析仪抓取芯片与PHY芯片之间的管理总线时序。为了拿到寄存器观测值,我在驱动里加了几个调试探针,每发一个包就读一次协议引擎的状态寄存器。整个过程不到一天就搭完了,比我想象的快很多。

5.2 从迹线推断状态机的实际操作记录

激励设计方面,我写了四种类型的输入序列:标准数据包、超长帧、短帧间隔、非法长度字段。每种激励重复500次,保证统计显著性。总共采集到大概几千条有效迹线。为了验证可重复性,我把同一个输入序列打两遍,用第二次的迹线去验证第一次推断出的迁移路径,却发现状态迁移一致率只有七成左右。

查了很久,原因出在驱动程序的发送逻辑上:直接寄存器写入发送命令之间引入了额外的软件延迟,导致目标芯片在某些时刻观察到的输入时序跟设计值不一致,触发了一些协议无关的等待状态。后来我在驱动里换成硬实时发送策略,用专门的DMA描述符循环来发送数据包,消除了软件抖动之后,一致率才提升到九成以上。这个小插曲很有代表性:动态分析中“被测设备”并不是孤立存在的,它和测试环境共同构成了时序系统,环境不稳定,逆向结果就不可能稳定。

5.3 结果对照:逆向出的FSM与数据手册的差异点

逆向完成之后,我把推断出的状态迁移图与数据手册里的协议状态描述做了一番对照。主路径高度一致:空闲、传输准备、数据发送、等待确认、完成中断这几个核心状态全部成功还原,状态迁移条件也能对上号。这说明论文的基本方法确实有效,不是纸上谈兵。

差异主要集中在两个地方。第一个是手册上没画的“等待DMA描述符更新”状态,逆向结果里出现了一个独立状态,因为在驱动发送模式下,芯片经常处于等待主机更新描述符的状态,而手册直接把这个过程合并进了“发送准备”状态。第二个差异是错误处理路径,手册里只提到“发送错误后返回空闲”,但实际逆向出的迁移图显示,连续多次错误后芯片会进入一个需要软复位才能退出的死锁状态,这个状态在手册里完全没有记录。这个发现也侧面印证了FSM逆向的一个核心价值:它返回的是芯片的真实行为,而不是设计者希望你知道的行为。

6. 这套方法在现实世界能走多远:局限与延伸思考

6.1 复杂度门槛:从网络接口到完整SoC的鸿沟

论文的方法能顺利处理一个协议引擎级别的硬件模块,但面对一个完整SoC,复杂度会是另一个量级。完整SoC内部有成百上千个状态机在并行运转,它们之间还有大量交互。如果你试图对整个SoC做动态分析,采集到的迹线会变成无数状态机叠加的混合信号,单靠聚类和迁移一致性校验,基本不可能把每个状态机的独立结构从混合信号中分离出来。

所以我的判断是,这套方法最适合做目标明确的局部逆向,比如锁定某个特定外设控制器、某个网络协议引擎、某条总线桥接逻辑。用于全芯片级别的“地毯式扫描”是不现实的。这篇论文选取的验证对象也都是接口控制器级别的加速器模块,这个选择本身就暗示了方法的使用边界。

6.2 与硬件木马检测的结合:动机与现实的落差

论文的动机是硬件安全,实际实验中我又发现了一个落差:看到异常状态不等于找到木马。逆向出FSM后,你发现一个手册里没记录的神秘状态,怎么判定它是恶意后门,还是一个用户手册简化掉的功能分支?这个判定本身需要额外证据,比如观察该状态触发的条件、能访问的数据、对外输出行为。单靠FSM逆向结果,只能提示“这里有不寻常的东西”,不能直接定性“这是恶意逻辑”。

不过这并不意味着工作价值打了折扣。恰恰相反,它能作为硬件安全审查的“第一级漏斗”,把嫌疑状态筛出来,再用其他方法做深挖。这比工程师对着几百页数据手册逐一核对效率高出太多。我在这颗网络芯片上找到的那个手册未记录死锁状态,如果是在一个严格审查流程里,就足够触发一次针对该模块的深度审计了。

6.3 可能的增强方向:自动化与形式化验证的汇合

如果说论文方法还有什么值得继续挖的地方,我觉得有两个方向。一个是把激励生成自动化,用覆盖率驱动的模糊测试来替代人工设计激励,让测试输入自动去撞那些难以执行的深层状态;另一个是把逆向出的状态迁移图与高层的安全属性描述做形式化交叉验证,直接输出“某状态是否违反安全属性”的判断。这两条路都已经有零散的研究工作在做,但在跟论文方法无缝整合的层面还有不少空间。

我个人的期望是,这套思路能发展成一个比较成型的安全分析工具链,让硬件厂商在流片前就能做行为级审计,让第三方检测机构拿着硬件就能快速定位可疑控制行为。硬件安全的攻防本质上是信息不对称的对抗,而动态分析逆向FSM,正是试图抹平这种信息不对称的努力。正如我在这篇论文复现过程中感受到的——芯片会说话,就看你怎么让它开口了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询