FPGA 专家 21:FPGA 安全——比特流加密、认证、安全启动
本文是
fpga/专家层第 24 篇。加载机制见 PR/ICAP 与比特流、量产烧录,可靠性见 SEU 防护,SoC 启动见 Zynq PS/PL。
一、威胁模型
| 威胁 | 说明 |
|---|---|
| 比特流克隆 | flash 明文被复制→直接烧到同型号板重放 |
| 设计逆向 | 比特流反汇编推网表 |
| 篡改/恶意升级 | 刷入植入后门的比特流 |
| JTAG 攻击 | 读写内部状态/回读配置 |
| 侧信道 | 功耗/电磁提取密钥 |
| 固件链攻击(SoC) | FSBL/固件被替换 |
二、防护体系

| 机制 | 防什么 | 要点 |
|---|---|---|
| AES 比特流加密 | 克隆/窃取 | eFUSE 不可读/BBRAM 电池 |
| RSA/ECC+HMAC 认证 | 篡改/恶意升级 | 公钥内置、验签失败拒载 |
| 安全启动链 | 固件链攻击 | 根信任逐级验签(Zynq) |
| 防回滚 | 刷回有漏洞旧版 | 版本号单调 |
| JTAG 保护 | 调试口攻击 | 量产关闭/认证(权衡可维修性) |
三、密钥管理(最易被忽视的环节)
- eFUSE:一次性、不可读、最安全,产线末段烧写、不可逆;
- BBRAM:可重写但需电池,失电丢密钥;
- 密钥分级、HSM 保管、产线安全注入、签名私钥轮换/撤销流程;
- 烧密钥与烧比特流工序分离、全程追溯。
五、威胁建模:从资产出发而不是从功能清单出发
安全设计最常见的失败是把“启用加密”当成终点,却没有定义要保护什么、攻击者是谁、能接触到什么。正确起点是资产清单:比特流(核心算法和架构 IP)、密钥(设备身份和升级信任根)、生产数据(校准参数、客户配置)、运行时数据(密钥材料、网络凭证、采集数据)、服务可用性(设备不能被刷砖或劫持)。然后按攻击者能力分级:只能接触网络接口的远程攻击者、能接触管理协议的现场人员、能拆壳读 flash/JTAG 的持证拥有者、能控制供应链一段的内部对手。每种能力对应不同攻击路径——远程攻击走网络服务和升级协议,物理攻击走 flash 重放、JTAG、探针和侧信道。没有这个分级,团队容易在物理克隆上重金防护却让升级接口明文接收固件。
威胁建模还要回答逆向经济性:克隆者复制一块板的收益、重新实现功能的成本、法律手段的有效性。对很多商业产品,AES 比特流加密的意义是把克隆成本抬高到自研之上,而不是追求数学上不可破;而金融、军工、医疗设备则要把拥有者也视为潜在对手,需要安全启动、认证调试口和侧信道防护。建议用结构化方法(如 STRIDE:仿冒、篡改、抵赖、信息泄露、拒绝服务、提权)逐接口过一遍,产出一张“资产—威胁—机制—残余风险”表,并在每次架构变更时复评。安全是系统属性,配置比特流保护只是其中一行。
六、机密性:比特流加密的工程细节
AES 比特流加密的工作模型是“密文存外部、密钥不出芯片”:构建时用密钥加密比特流,运行时 FPGA 内部解密引擎在配置过程中实时解密,配置存储器写入明文但外部总线只有密文,攻击者复制 flash 得到的是无法在无密钥器件上重放的数据。工程实现有一连串细节决定它是否真的有效。密钥存储:eFUSE 一次性烧入、不可读出,适合量产定型设备,但烧错不可恢复;BBRAM 靠板上电池保持,可改写但电池失效后设备必须重新注入密钥,维护成本高。许多器件还支持密钥更新(用旧密钥加密新密钥写入),这让 eFUSE 方案也有有限的轮换能力,但更新协议本身必须防回滚。密钥供给链:主密钥绝不应出现在办公电脑和普通 CI 上;构建在 HSM 或受控构建舱内完成加密,产线只注入设备唯一密钥(每设备不同,单台泄露不波及全线),注入工位审计人员、时间和序列号。
易被忽视的缺口:第一,明文比特流在开发/试产阶段可能已经流出,加密只保护量产版本,早期镜像要有销毁和访问控制记录。第二,内部配置访问口(ICAP/SelectMAP)在运行时若可被用户逻辑或主机写入未认证数据,等于绕过启动认证(与 专题 03 的动态加载联动,partial bitstream 同样必须验签)。第三,回读功能若开启,配置存储器可能被读出;量产应关闭回读或只允许加密回读。第四,多 FPGA 板上每片都要有独立密钥,不能共享一个出厂默认值。第五,加密会增加启动时间(解密在配置路径上)和少量功耗,冷启动指标要重测。加密解决“读”的问题,不解决“让设备执行攻击者内容”的问题——后者属于下一节的认证。
七、完整性与信任链:认证、安全启动和防回滚
认证回答“这个镜像是否来自我信任的发布者且未被修改”。机制是非对称签名(RSA/ECC,私钥离线保存、公钥哈希固化在 BootROM 或 OTP)或对称 HMAC(密钥共享,器件要能安全持有),对镜像头(含哈希、版本、适用型号)签名,加载时先验头再逐段校验哈希。Zynq/MPSoC 这类 SoC 的安全启动是信任链:芯片内不可改的 BootROM 是根信任,验签 FSBL/PMUFW,FSBL 验下一阶段(ATF、u-boot、比特流、R5 固件),每一级只加载签名有效的下一级,任何一环失败进入安全失败路径(停在 ROM、回 golden 或安全态)。纯 FPGA 器件则由内部配置控制器在配置时完成镜像认证,选项比 SoC 少,因此启动模式引脚和配置口访问控制更重要。
防回滚是和签名并列的必需机制:攻击者手里的合法旧版本可能含已修复漏洞,没有最小版本号检查就可以“降级攻击”。版本计数器应存于单调存储(eFUSE 计数位或带认证可写的安全存储),只增不减;A/B 槽位升级(专题 04)在安全场景下要和防回滚联动——回滚机制只对“未通过健康确认的新镜像”生效,绝不能允许手工选择任意旧槽。失败语义要设计:验签失败是否重试、是否上报、是否锁死(防擦除攻击)、现场如何恢复 golden;安全态下调试口和业务数据路径如何关闭。生产与开发分离:开发镜像允许未签名以提高效率,但工程模式必须由物理手段(模式引脚+外壳内)进入,出货配置中不存在“跳过验签”的编译开关。最后,签名私钥的保护级别决定整条链的强度:私钥进 HSM、签名操作双人审批、泄露应急流程(新根密钥轮换计划)必须在产品上市前演练,因为私钥泄露等于所有在役设备的信任根失效。
八、调试口与运行时攻击面
JTAG/SWD 这类调试端口是物理攻击的捷径:正常用途是读写内部状态、回读配置、注入测试模式,但留在出货设备上就是未认证的特权通道。处理选项按安全等级递增:产线烧录和测试完成后在末站永久关闭(熔断位,不可逆,牺牲现场 JTAG 诊断);保留但要求挑战响应认证(密钥在器件和工厂工具间,调试会话带时效);只保留在需要工厂授权的维修模式(经安全处理器授权后短期开启、全程审计)。无论哪种,都必须在首版原理图评审决定,因为熔断/认证选项影响产线流程和返修能力。值得注意的是“关掉 JTAG”并不会自动保护 flash 内容和升级路径,它只是收窄攻击面的一环;同样,处理器侧的调试口(Zynq 的 PS JTAG、ARM DAP)和 FPGA 侧 TAP 可能是独立开关,要分别确认。
运行时攻击面还包括:未认证的网络重配置服务(现场很常见的“方便功能”)、明文的配置下载协议、可写任意地址的维护寄存器、默认口令、未校验长度的 DMA(专家 08 的 IOMMU 讨论同样适用于嵌入式主控)、可以被普通用户访问的 ICAP。SoC 设备还要利用 TrustZone/异常级别隔离:安全侧持有密钥和升级控制,非安全侧的 Linux 即使被攻破也无法直接重配 PL。侧信道是另一层:密码运算的功耗和电磁辐射可能泄露密钥,高安全场景需要算法掩码、随机化、恒定时间实现,并做实测评估;即使不做密码运算,密钥在 FPGA 内部也不应以可从配置位或调试寄存器读出的形式出现。把“设备出厂后暴露的每个接口和每条带外通道”列成清单逐项关闭或认证,安全架构才闭合。
九、安全更新与密钥运营:产品全生命周期
安全能力的长期有效性由运营决定,而不是由芯片特性决定。更新体系:升级包标准化为“清单(各组件版本、哈希、签名)+镜像”的形式,设备验证清单签名、型号匹配和最低版本号后再安装,A/B 槽原子切换、健康确认与回滚(专题 04 第八节);更新通道可以走 TLS 提供传输保护,但最终信任必须靠设备端验签,不能假设网络永远可信。密钥体系:至少区分根密钥(离线/HSM,只签中间密钥)、固件签名密钥(日常发布)、设备密钥(每台唯一,用于身份认证和加密通道),根公钥的哈希固化进 OTP;制定轮换策略(签名密钥按周期轮换,设备内置新公钥的方法)和撤销机制(证书撤销列表或版本化密钥槽)。生产运营:密钥注入工位与普通烧录分离、双人操作、注入结果只回传成功与否和序列号,HSM 操作日志独立保存;试产密钥与量产密钥物理隔离。
现场响应:漏洞披露后需要能回答三个问题——哪些序列号运行受影响版本(靠升级遥测)、修复包能否在现场完成验证安装、无法升级的设备如何缓解(关停功能/召回)。因此设备应支持只读的版本与安全事件上报(验签失败、回滚尝试、调试口访问、异常配置中断)。报废与返修:维修流程中先安全擦除用户数据和可写密钥槽、更换主板时重新注入设备身份;报废设备的密钥和证书要在后台注销,防止克隆板继续入网。把这些流程写成运维文档并演练一次“签名密钥疑似泄露”的桌面推演,是检验安全体系是否可运营的有效方法。芯片提供的是信任根,组织流程决定这棵树能不能活过产品的十年生命周期。
十、安全设计检查清单与决策梯度
按风险从低到高给一个可裁剪的防护梯度。基础级(一般商业):比特流 AES 加密防克隆、关闭配置回读、JTAG 末站关闭或认证、升级包 CRC+签名校验、A/B 槽防砖、设备唯一序列号和版本寄存器。增强级(联网基础设施/工业控制):完整安全启动信任链、每设备唯一密钥的 HSM 注入、防回滚版本号、安全态失败语义、安全事件遥测、TrustZone 或等效隔离、威胁模型文档化并随版本复评。高安全级(金融、安全相关、国防):上述全部,加上侧信道评估、加密算法的认证实现、调试口的工厂授权机制、密钥轮换与撤销预案、正式的安全认证文档(FIPS/Common Criteria 或行业标准)、供应链和报废流程审计。
评审检查单:资产和攻击者模型是否成文?flash 中是否还有任何明文信任材料?加密密钥的注入、存储、更换、丢失流程是否演练?镜像签名覆盖了完整启动链(含 partial/PL 固件)吗?防回滚计数器在哪?验签失败的行为定义了吗?JTAG/配置口在出货镜像中的实际状态是否验证过(而不是只看了选项)?网络侧有没有可触发重配置或写内存的未认证接口?设备上报哪些安全事件?私钥签名操作是否全程在 HSM?返修和报废流程怎么处理密钥?能不能列出三个即使主控软件被攻破仍受保护的资产?逐条打钩后,安全设计才从“勾选了加密”变成可向客户和审计解释的体系。FPGA 安全没有银弹,它是启动链、芯片特性、密钥运营和组织纪律的乘积,任何一项为零,整体就为零。
十一、典型攻击场景复盘:从威胁到防护的映射
用几个反复出现的真实形态把抽象机制落到具体场景。flash 重放克隆:攻击者拆下外置配置 flash 读出全部内容,焊到自己生产的板子上,未加密时上电即得到相同逻辑;防护是 AES 加密加片内密钥存储,密文离开合法器件不可配置,必要时叠加器件 DNA 绑定(镜像与芯片唯一标识关联,需要加载侧配合)。恶意固件升级:设备的升级协议接受任意镜像,攻击者构造含后门的版本刷入;即使比特流加密也无法阻止设备主动解密一个“合法加密但来源错误”的镜像,必须靠签名认证、型号匹配和防回滚。降级利用:新版修复了越权漏洞,攻击者刷回带漏洞旧版后再利用;防回滚计数器是唯一有效手段,A/B 槽不能允许任意手工切换。
JTAG 劫持:现场设备外壳打开后接下载器,回读配置、改寄存器、注入测试模式;防护是熔断关闭或挑战响应认证,并把关键控制不放在可被调试口直接访问的路径。供应链内鬼:产线烧录工位可以接触镜像和密钥,若密钥在普通服务器上,一次泄露波及全线;防护是 HSM 签名、密钥分段持有、工位只下发设备唯一密钥且全程审计。侧信道提取:密码核的功耗轨迹可被统计分析还原密钥;高安全产品采用掩码实现、随机化、恒定时间编程,并做实测。每个场景对应的防护都能在第五节至第十节的清单里找到位置;反过来,任何一项启用的机制都应该能回答“它防的是哪个攻击场景”。
十二、FPGA 与整机安全:边界、隔离与云场景
孤立地保护比特流并不等于整机安全,FPGA 在系统中通常是高速数据路径的执行者,攻击面通过它与处理器、网络、DMA 的连接扩展。与主控的信任边界:若主机软件可能被攻破,PL 侧应对命令做格式、长度、地址范围校验,不能把 DMA 任意地址写、链路重配置等能力无保护地暴露(专家 08 的 IOMMU 隔离同样适用于嵌入式主控);安全寄存器只接受安全处理器/TrustZone 侧写入。多租户与云 FPGA:Shell/AF 模型下平台提供 PCIe/DDR/管理,租户逻辑作为受隔离分区加载,必须保证租户间存储清零(切换时加载 blank/清理分区)、DMA 地址窗口隔离、侧信道风险评估、部分重配置镜像的逐租户认证(与 专题 03 联动)。网络暴露面:跑在 FPGA 内的协议卸载(UDP 栈、TLS 加速)同样需要畸形输入防护、默认管理口关闭、固件升级鉴权(专题 01)。
安全启动后的运行时信任:Boot 链验签只保证启动镜像,运行中处理器被攻破后仍可能改写 PL 业务;需要把“谁有权触发重配置、写密钥槽、关监控”做成硬件可执行的策略,而不是靠软件自觉。可用性攻击:攻击者可能不窃取而是让设备失效——刷写半截镜像、持续触发重配、耗尽 flash 擦写寿命,防护包括原子 A/B 切换、重配频率限制、升级鉴权和看门狗恢复。整机安全评审应画一张信任域图:哪些资产在安全域、跨域接口有什么强制策略、一个域被攻破后另一个域还能保证什么;FPGA 的配置保护是这张图的基础而不是全部。
十三、一页纸结论:FPGA 安全工程
把全篇压缩为可执行结论:第一,先做威胁建模和资产分级,再选机制,避免“只开加密”的形式安全。第二,机密性靠 AES 比特流加密和不出芯的密钥(eFUSE/BBRAM,各有取舍),完整性靠 RSA/ECC 签名、哈希和逐级信任链,两者解决不同问题,高安全场景必须同时具备。第三,防回滚、验签失败语义、安全启动顺序在架构期定义,并覆盖 partial bitstream 和全部处理器固件。第四,JTAG/配置口/ICAP/网络重配置接口逐项关闭或认证,量产状态由 MES 记录确认。第五,密钥运营往往是最弱环节:HSM、每设备唯一密钥、分级密钥、产线工位隔离、轮换撤销预案和报废注销流程,比芯片加密位本身更决定整体强度。第六,结合可靠性(SEU/刷新,专家 21)和量产流程(烧录/A/B,专题 04),把安全事件变成可观测、可升级、可恢复的运维对象。安全是多个机制乘积为正的体系,任何一环缺失都会让其余投入失效。
十四、安全开发流程:把要求嵌入研发与供应链
再强的芯片特性,如果只在项目末尾“开启选项”,也会被流程漏洞绕过。建议把安全纳入常规研发节奏。需求阶段:输出安全需求(保护哪些资产、对抗哪类攻击者、认证目标),威胁模型与功能需求同评审;没有安全需求的项目默认采用基础级清单。设计阶段:信任链图、密钥体系(根/签名/设备密钥)、调试口策略、升级与回滚机制进入架构评审;安全关键逻辑(验签、访问控制)尽量放在处理器安全世界或经过审查的 IP 中,自研密码核必须评估侧信道。实现阶段:固件/比特流构建在受控环境完成,私钥签名操作只发生在 HSM;CI 产物可复现(同输入产出同哈希),发布清单含全部组件版本;代码评审中“跳过验签”“临时关闭认证”这类调试代码不得进入发布分支,应有编译期和构建期双重检查。
供应链阶段:器件采购渠道可追溯(翻新料、remark 料风险),代工厂和烧录服务商签安全协议,密钥注入工位物理隔离、人员权限最小化、操作日志独立保存;试产密钥与量产密钥物理分开,工程样机出厂前清理。验证阶段:除正常功能外做负向测试(错误签名、截断镜像、伪造版本号、错误型号镜像、降级包、JTAG 异常访问、升级中断电),每类都要验证设备拒绝并保持安全态;高安全等级按认证标准做独立评估。运维阶段:签署密钥的访问定期审计,事件响应预案覆盖“密钥疑似泄露”,设备遥测聚合验签失败和异常重配,报废流程注销设备身份。把这套流程文档化并不意味着官僚——它把安全从某位专家的记忆变成组织能力,这对长生命周期的嵌入式/基础设施产品尤其关键。
十五、常见认知误区收尾
最后澄清几个反复出现的误区,帮助评审快速对齐。“加密了就安全”:加密只解决机密性和克隆,篡改与降级要认证和防回滚。“JTAG 关了就没事”:升级通道、ICAP、处理器 DAP、网络维护口都是独立攻击面。“内部网络可信所以不用认证升级”:横向移动正是许多真实入侵的路径,最终信任必须在设备端。“密钥存服务器就行”:设备必须持有自己的信任根(公钥哈希/设备密钥),否则整个体系依赖一个可被冒充的网络服务。“安全启动能防所有运行时攻击”:它保证启动内容,不保证启动后的软件不被攻破,运行时隔离(TrustZone/IOMMU/PL 访问控制)是另一层。“安全是量产前加个选项”:密钥注入工位、熔断工序、A/B 布局、调试口物理访问都要在原理图和 NPI 阶段设计。把这些误区逐条对照设计评审,很多看似“高级”的安全漏洞其实在架构图阶段就已经注定;反过来,早期一张资产和信任域图加一次评审,往往比后期加密模块更能降低真实风险。安全投入的正确姿势是按威胁等级裁剪、按全生命周期运营,而不是追求特性清单的长度;评审时能讲清每条机制防什么、残余风险在哪,比勾选更多选项更有价值。
常见坑对照
| 坑 | 后果 | 正确做法 |
|---|---|---|
| 比特流明文出货 | flash 一读即被克隆 | AES-256 加密 |
| 只加密不认证 | 可刷入恶意固件 | 加签名验签 |
| eFUSE 烧错/漏管 | 密钥相关不可逆 | 末段工序+HSM 流程 |
| 签名私钥泄露 | 全线信任崩塌 | HSM+轮换/撤销 |
| 开发期 JTAG 常开出厂 | 攻击面敞开 | 量产关闭或认证保护 |
| 无防回滚 | 旧漏洞版被刷回 | 版本号单调检查 |
相关与延伸
机制:PR/ICAP、量产烧录。 关联:Zynq 安全启动/TrustZone、SEU 可靠性、云端多租户隔离(专家层后续)。
总结
SRAM FPGA 的比特流是设计 IP 本体且明文存于外部 flash——不防护时拆下 flash 复制就能克隆产品;防护分两层缺一不可:AES-256 比特流加密(flash 只存密文、密钥烧在芯片内 eFUSE 不可读或 BBRAM 电池保持,克隆者拿不到密钥)防'读'即防克隆窃取,RSA/ECC 签名+哈希认证(启动验签、拒绝未签名/被篡改比特流)防'写'即防恶意固件。Zynq 把它做成安全启动信任链(BootROM 根信任→FSBL→bitstream 逐级验签),并配合防回滚版本号。JTAG 是独立攻击面(可回读/注入),量产关闭或密码保护,但要权衡可维修性。真正的难点不在芯片功能而在密钥管理:eFUSE 不可逆(产线末段管控烧写)、签名私钥用 HSM 保管且有轮换撤销、烧密钥与烧产品工序分离——私钥泄露等于全线信任崩塌。商业产品普遍至少做加密,高安全场景加密+认证+安全启动全套。