
经常有做硬件的朋友跟我抱怨设备卖得好好的突然市面上就出现了外观一模一样、价格砍半的仿制品。以前大家觉得抄板就是抄PCB、抄物料清单最多再读个固件出来。但这几年情况变了越来越多的边缘推理设备被人抄走的不只是硬件还有整份模型参数。很多团队辛辛苦苦标注数据、训练几个月的模型别人拿一台样机拆开半小时就把权重文件提出来直接量产。模型参数已经成了抄板的新目标。我这几年做边缘设备的安全方案从工业视觉检测盒、智能摄像头到车载边缘计算单元都遇到过这类问题。这篇文章不聊云侧那种“模型加密下发”的常规套路只讲设备端落地时真正会遇到的事攻击者怎么读走你的参数、你在硬件和固件上能做什么、防抄板加密芯片在其中到底起多大作用以及一个经常被忽略的环节——边缘设备现场部署时的模型参数校准本身也可能成为泄露参数信息的旁路。内容偏向实操适合正在做边缘AI设备、又担心被逆向的团队参考。1. 抄板目标升级为什么模型参数成了香饽饽1.1 从“抄硬件”到“抄参数”威胁模型已经变了传统抄板的核心是拿到硬件方案PCB层叠结构、网络连接、BOM清单、关键芯片型号。这些东西拿到了找一版兼容物料PCBA打样回来基本就能复制功能。但边缘推理设备不一样它的核心价值很大一部分在算法里——同样是8通道工业视觉检测你的设备能分拣出微裂纹别人的算法做不到那这套模型参数就是你设备的真正护城河。问题在于很多硬件团队的安全意识还停留在“防止别人抄PCB”的阶段给Flash加密、给固件加壳但模型参数往往以明文形式躺在文件系统里。攻击者把板子上的SPI Flash吹下来用编程器读个镜像然后在镜像文件里搜一下很快就能定位到权重文件。这类文件格式特征非常明显TensorFlow Lite模型的结尾通常有一串非结构化浮点数ONNX模型的头部有固定的protobuf特征RKNN、NPU专用格式也有各自的魔数。不需要什么高深技术一个binwalk加几行Python脚本就能搞定。现实中我见过一个更夸张的情况某团队把模型参数放在SD卡里SD卡座还正好设计在设备背面螺丝一拆就能看到。这种物理暴露加明文存储等于把算法资产直接放在门口。所以说模型参数保护的第一个认知转变就是——抄板目标从“电路结构”升级到了“权重数值”这是一场针对知识产权的精准打击。1.2 模型参数的商业价值和泄露代价为什么说模型参数值得被“精准打击”一组训练好的模型参数里沉淀的是数据、算力、算法调优经验。训练一个能实际部署的缺陷检测模型前期要花几个月采数据再花大量时间标注、清洗、训练、量化、剪枝。不说人力成本单算GPU算力和数据采集的设备投入一般也是六位数起步。而复制一份模型参数的边际成本几乎为零通过调试串口或者Flash读取几分钟就能拿到顶多再花时间适配一下推理框架。更要命的是连带风险。模型被复制之后攻击者逆向出你的模型结构还能做针对性的对抗样本攻击让你的算法失明。也就是说模型参数泄露不止损失一个产品的竞争力还会暴露模型结构的弱点后续你的每一台设备都可能有安全漏洞被定向利用。对做B端项目的团队来说客户现场设备被人破解直接影响的还有商务上的信任关系。我在给一家做工业读码器的厂商做方案时对方最担心的不是代码被谁抄而是“如果参数被拿去客户不再续签维保合同整个商业模型就崩了”。这让我意识到模型参数保护不是单纯的“防君子”而是整个产品商业闭环里的一环。1.3 常见的攻击路径攻击者到底怎么拿到你的参数梳理下来攻击者获取模型参数的路径大致有四类。了解这些路径才能针对性地做防护布局。第一类是离线读取外部存储芯片。设备上的Nor Flash、eMMC、SD卡只要能被物理拆下来或者用测试点飞线连接理论上有编程器就能读。很多时候开发者只做了文件系统加密但密钥却明文存在同一个存储里这种“拿着钥匙锁门”的做法在嵌入式项目里非常常见。第二类是调试接口攻击。JTAG、SWD、UART这类调试口如果量产固件里没关掉攻击者接上调试器就能直接dump内存。更隐蔽的是有些启动阶段的BootROM会开放调试权限配合故障注入比如对电源管脚打毛刺可以绕过Secure Boot直接进恢复模式。第三类是运行时内存嗅探。边缘推理设备的算力有限一般不会把所有参数常驻内存但推理过程中肯定会把模型加载到内存中运行。如果系统跑的是Linux攻击者通过已知内核漏洞提权到root再用/proc/kcore或者dev/mem把内存镜像抓走模型参数同样会泄露。哪怕没有漏洞插个USB网卡、开个ADB调试端口也能慢慢把数据传出去。第四类是侧信道分析这个更高级一些需要专业设备。比如通过测量设备运行时的功耗、电磁辐射结合已知模型结构推断参数。对大多数中小团队来说前三种路径才是真实威胁侧信道攻击通常不是首要考虑的但作为方案设计者心里得有一本账。把攻击路径想明白你会发现一个核心矛盾模型参数必须在某个时刻以明文形式存在于设备中否则推理无法进行。所以防护的本质不是“让参数永远不出现”而是“让攻击者即使拿到了密文也解不开、即使看到了明文也带不走”。2. 防抄板方案的整体设计不是加个加密芯片那么简单2.1 边缘设备算法保护的完整链路很多朋友一听到“算法保护”就想到加密芯片。这个方向没错但如果只把加密芯片当成一个“高级Flash”用把模型参数写进去再读出来意义很有限。因为加密芯片和主控之间走的是SPI或I2C线路上的数据可以被逻辑分析仪抓包。真正能落地且经过大量产品验证的方案是一条完整链路安全存储、安全启动、运行时隔离、物理防护。安全存储解决的是“静态数据防读取”的问题。模型参数以密文形式存放在大容量Flash里密钥不出安全芯片。安全启动解决的是“固件不被篡改”的问题从BootROM到OS、到应用层逐级验签防止攻击者替换你的启动代码。运行时隔离解决的是“推理时参数不被内存抓取”的问题比如把解密后的模型放在受保护的内存区域利用MPU/IOMMU限制非授权访问。物理防护解决的是“攻击者物理接触设备”的问题比如敏感信号内层走线、覆盖接地层让测试点变得难以接触。这四个环节缺一不可。你只做加密存储攻击者可以绕过启动校验、自己写一段代码调用你的解密接口就能拿到明文模型你只做安全启动但Flash里的模型还是明文攻击者照样可以直接拷贝你全都做了但调试口还开着攻击者照样上车。这就是为什么我总是跟硬件团队说模型参数保护是一个系统工程别指望单点方案能扛住所有攻击。2.2 防抄板加密芯片在方案里的位置防抄板加密芯片比如很多人用过的SMEC98SP这类器件在整个链路里承担的核心工作并不是“存储模型”而是“保管密钥”和“提供信任根”。打个比方Flash是一个大仓库模型参数是仓库里的货加密芯片则是保险柜货可以放在仓库里但开仓库的钥匙放在保险柜里。攻击者就算把仓库搬走打不开保险柜也拿不到货。具体落地上SMEC98SP这类芯片通常有内部不可读的存储区。你在产线上把主密钥、设备唯一密钥写进去之后任何接口都读不出来。主控侧加解密模型参数时通过向加密芯片发起运算请求比如AES、SM4加解密运算由芯片内部完成运算后把结果返回这样密钥从头到尾不出安全芯片。这样即使攻击者用逻辑分析仪抓芯片与主控之间的通信抓到的也只是密文和临时运算结果不是根密钥。另外一个容易被忽略的点是“真随机数”和“防重放”。加密芯片内置的TRNG真随机数发生器可以用来生成每次启动时的随机盐值配合计数器防回滚。这能防止攻击者录制一段合法的解密流程后反复重放来尝试破解模型参数。SMEC98SP这类芯片通常还内置了总线加扰、金属防护层能提高硬件破解的成本。但我在实际项目中经常提醒同事加密芯片不是万能的。如果主控和加密芯片之间的通信协议设计得不好攻击者完全可以在主控里植入一段恶意代码替代主控去和加密芯片通信骗取解密结果。所以加密芯片必须配合安全启动使用保证主控里跑的还是你的代码而不是别人注入的代码。2.3 方案选型时的实际考量具体选型时很多人会问“选国产加密芯片还是进口的、选EEPROM型还是逻辑型”。我的建议是不要只看芯片型号要看三个指标密钥是否可读出、是否支持对称与非对称算法、有没有配套的产线烧录工具。有些所谓的加密芯片其实只是个EEPROM里面的密钥可以被编程器强制读走这种就不能当信任根用。另一点是主控评估。如果主控本身有TEE可信执行环境或者HSM硬件安全模块优先用主控自带的信任根能省一颗芯片也少一条SPI总线暴露面。比如NXP i.MX系列的HAB、ST STM32MP1的TrustZone、瑞萨的HSM都能实现类似效果。但如果主控没有这些能力或者安全等级不够再加外部安全芯片。不是每一款产品都需要外置加密芯片但每一款产品都需要明确自己的信任根在哪里。效率上也要权衡。模型参数可能在几十MB到几百MB如果加解密全部走加密芯片那颗低速MCU启动时间会非常感人。常见的做法是用加密芯片做密钥协商和会话密钥生成然后由主控的硬件加速引擎用会话密钥做批量解密也就是“安全芯片负责锁门、主控负责搬货”。3. 核心实操模型参数的加密存储与安全加载流程3.1 模型参数加密与密钥管理的落地细节先说加密算法选型。边缘设备上的模型参数保护一般建议用AES-256-GCM或者SM4-GCM。GCM模式自带认证能在解密时检查密文是否被篡改防止攻击者把模型参数里的某些数值改成自己想要的。这一点在做安全产品时尤其重要——攻击者可以篡改模型让设备产生误判。密钥管理是最容易出错的地方。不要把所有设备用同一个密钥否则一台设备被攻破全线产品沦陷。量产时要生成设备独有的密钥写进加密芯片的OTP区同时把密钥索引用明文存在Flash里。启动时主控向加密芯片提供索引由加密芯片返回对应的密钥运算结果。这个设计可以避免一把钥匙开所有锁。我见过一个反面案例开发者把AES密钥硬编码在代码里代码被打包成.so文件放在系统分区。攻击者拿到固件用strings命令直接搜到32字节密钥然后顺着代码逻辑找到解密接口一次性把所有模型解密完毕。这种方案等于在门外贴了钥匙。正确的做法是密钥要么在安全芯片里要么在TEE的Secure World里绝不能出现在应用层代码中。// 伪代码示例模型加载时的解密流程 uint8_t session_key[32]; uint8_t nonce[12]; // Step1: 向安全芯片发起会话密钥协商 // 内部使用设备唯一密钥外部无法读取 secure_chip_generate_session_key(session_key); // Step2: 用会话密钥解密模型文件的头部元数据 aes_gcm_decrypt(model_file_head, MODEL_HEAD_SIZE, session_key, nonce, model_meta); // Step3: 校验模型哈希防止篡改 if (sha256_verify(model_body, model_body_len, model_meta.digest) ! OK) { abort_loading(); // 防止模型被篡改 }3.2 安全启动确保设备跑的是你的代码安全启动的价值在于建立“信任链”。我从BootROM开始逐级验签一直验到文件系统挂载后的可执行文件。比如在i.MX平台上BootROM会校验U-Boot的签名U-Boot校验内核镜像和DTB内核再用IMA完整性度量架构或者dm-verity校验根文件系统。任何一个环节验签失败设备就拒绝启动。这样做的意义在于攻击者无法简单地替换你的解密驱动程序或模型加载器因为你所有代码都有签名。如果他想通过修改系统来获取模型必须找到签名绕过的方法或者走硬件漏洞这就大幅提高了破解门槛。实际开发时要注意安全启动会带来启动时间和后期调试效率的下降。产线上如果密钥没烧好板子就变砖。所以我们要有回退机制定义一个启动槽位A/B一个槽位跑正式版本另一个槽位保留可调试的恢复系统量产时密钥只烧进正式分区调试分区不烧密钥等调试完成后再永久关闭。3.3 运行时保护解密后的模型数据不能裸奔模型参数解密后加载进内存运行时的保护同样不能省略。如果使用Linux可以通过mlock()将存放模型数据的物理页锁定防止被换出到swap分区。因为Swap分区是写在Flash里的如果模型数据被交换出去攻击者就能从存储介质上读到明文。更主流的做法是利用内存保护单元把模型缓冲区设置成“仅内核可读”。以Cortex-A系列为例可以配置TZASCTrustZone地址空间控制器或者IOMMU把某段物理内存划为安全区域普通Linux用户态程序访问会直接触发异常。这样即使攻击者拿到root也无法通过devmem去读那段内存。运行时保护里容易被忽略的一点是“残留数据”。推理结束后内存缓冲区里往往还留有模型参数的片段。如果设备被回收、转售或者返修这些数据可能被下一个拿到设备的人读取。所以模型加载器在退出时要主动清零缓冲区或者定期对内存做安全擦除。这算是一个低成本但很实用的防护细节。# 检查模型缓冲区是否被换出到swap # 如果输出里有swap相关行说明模型数据有换出风险 grep -E ModelBuffer|RKNN|npu /proc/$(pidof app)/smaps | grep -i swap4. 模型参数校准设备端算法保护的另一块拼图4.1 边缘设备上的merton模型参数校准到底是什么如果你去查“Merton模型”首先会看到金融信用风险定价的内容但在这个标题的场景里它指的不是那个。在边缘推理设备的生产和部署现场我们经常说“给模型做参数校准”核心意思是模型从训练环境到具体设备总会因为硬件差异、数据分布漂移等原因出现偏差需要通过一组已知样本重新标定或调整部分参数。举个例子传感器类的设备每一台硬件之间的偏置电压、温度曲线都略有不同。如果不做校准同一个模型在不同的机器上输出差异会很明显。更常见的是量化感知校准训练好的FP32模型在转成INT8时会选取一组校准图片来统计每层激活值的分布再决定量化参数scale、zero point。这套量化参数本质上也是模型参数的组成部分直接影响推理精度。在一个完整的产品周期里这种“merton模型参数校准”往往发生在产线出厂或者现场更换传感器之后。校准过程通常由一套上位机软件或设备端自校准脚本完成生成一组与设备绑定的校准参数文件然后和基座模型一起部署。值得强调的是这组校准参数同样属于核心算法资产大概率也需要被保护。4.2 校准过程本身可能泄露参数信息这里有个很多人没意识到的问题校准过程往往会暴露模型的敏感信息。比如校准工具需要读取模型中间层的输出分布Tensor统计如果你直接把模型开放成可调试模式攻击者通过上位机软件发送一套精心构造的校准数据就能以“校准”的名义诱导设备输出中间层特征图从而反向推断模型结构。还有一种情况更隐蔽。自校准脚本会从设备端上传校准数据到上位机如果这个通道没有做双向认证和传输加密攻击者可以截获这些数据。这些数据表面上看只是一些传感器读数但随着多条数据的累积结合模型的输入输出对应关系攻击者就可以做模型窃取攻击Model Extraction Attack慢慢逼近你的模型能力边界。所以安全的做法是校准模式归校准模式正常推理模式归正常推理模式两者要彻底隔离。设备进入校准模式必须验签上位机证书校准过程中不能开放任意层的原始张量输出只能输出最终评估指标。反馈给上位机的数据最小化只给损失值、准确率这类汇总指标不给中间特征。4.3 可校验的校准包设计与防回滚校准参数文件也需要和模型参数同等级保护否则攻击者可以“再造”一个精度更差但能跑的校准包让设备在违规工况下误判间接破坏你的算法口碑。我在项目里一般建议校准包采用JSON或Protobuf结构里面除了校准参数还要带上设备ID、生成时间、模型版本号然后用设备私钥签名或者用安全芯片做MAC计算。当设备启动时先校验校准包签名再校验校准包里的模型版本号是否和当前基座模型匹配。版本号不匹配就拒绝加载防止攻击者用旧版校准包覆盖新版也就是防回滚。防回滚这一点容易被遗漏但实际攻击成本极低——攻击者只要保留一份旧版校准包就能覆盖掉你现场修复了bug的新版校准包导致设备行为回退到有漏洞的状态。在产线端校准包的生成流程最好和加密芯片绑定。每个设备在校准完毕后将校准包的摘要写入安全芯片的OTP区。下次设备启动时安全芯片检查当前校准包摘要和OTP区记录是否一致起到“设备-校准包”绑定的效果。5. 一次典型攻击演练从Flash Dump到模型失窃5.1 攻击者视角的完整流程为了验证防护方案的有效性我们做过一次内部的攻击演练。用一个没有做任何安全加固的开发板当靶机跑一个典型的YOLOv5s检测模型权重文件明文存储在根文件系统的/opt/models/目录下。攻击者只用了三步就拿到了完整模型第一步拆机。把设备外壳拆开找到板上的SPI Nor Flash。用热风枪吹下来放入编程器读出整个Flash镜像。这里有个细节如果Flash是焊在板子上的攻击者也可以在PCB背面的走线上飞线直接在板读取不需要拆芯片。第二步解析镜像。用binwalk找到文件系统偏移再用unsquashfs或者debugfs把根文件系统提取出来。因为系统里没有加密措施模型文件直接以原样出现在目录里。执行完这两步模型参数已经到手。第三步格式转换与复用。把拿到的权重文件拷贝到开发环境确认一下模型输入尺寸、预处理方式然后转换到目标NPU平台重新封包进仿制设备。整个过程不到一小时而且不需要知道模型的具体训练细节。5.2 加入安全方案后的对比效果换上我们前面讲的完整防护方案之后同一位置的攻击路径变成了这样SPI Flash直接读取拿到的是经过AES-256-GCM加密的密文没有密钥无法解密。尝试从代码里找密钥但代码启用了安全启动和代码加密strings搜不出明文密钥。想通过JTAG/SWD口调试但量产固件已经永久熔断调试口。攻击者如果想绕过安全启动需要先破解BootROM的签名校验这通常意味着要制作电压毛刺、激光切割等物理手段成本已经超过直接自己训练模型的成本。整个破解时间从“一小时”变成了“数周甚至数月”而且成功率大幅下降。加密芯片SMEC98SP在这里起到的作用是即使攻击者测量SPI总线看到的也是加密芯片参与协商后的临时会话密钥密文无法反推出设备根密钥。5.3 边界条件没有绝对安全只有对抗难度必须承认的是没有绝对不可破解的防护。安全方案的目标从来不是让攻击者“完全做不到”而是让攻击的性价比低于“自己开发”。如果你的模型资产价值上百万攻击者花五十万去破解也值了但绝大多数边缘设备的模型资产攻击者只要评估破解成本和自己撸训练数据的成本差不多就会放弃。所以我给团队的定位是方案设计要“以攻为守”每做一个安全特性就站在攻击者视角问一句“这个我能绕吗”。绕过去太简单说明设计有漏洞绕过去的成本高于收益这个点就可以闭环了。加密芯片在其中是提高成本的重要一环但不是唯一一环。要结合安全启动、密钥管理、运行时隔离等多个层次整体设计才有意义。6. 常见问题与排查实录6.1 模型参数已经加密了为什么还是被抄走这个问题的排查顺序我一般这样走先确认密钥是不是存在同样的Flash里再确认代码和密钥是否分离最后确认加密芯片和主控之间的通信协议是不是只做了单次加密而可重放。很多自研“加密”方案被攻破问题都出在这三个地方尤其是密钥和密文放在同一存储介质里的低级错误。还有一个高频问题只加密了模型主体文件但配套的配置、预处理参数、类别名字文件全部明文。这等于模型没被直接拿走但攻击者把“配方”全拿走了结合开放社区里的开源模型也能拼出接近的效果。模型保护的边界要覆盖到所有与算法相关的文件而不是只保护一个“看起来最重要”的大文件。6.2 加密之后推理性能和启动时间变差了性能问题的根因通常是“让加密芯片扛了不该扛的活儿”。我之前遇到一款设备启动时要解密50MB的模型文件开发者把每个4KB块都调一遍安全芯片的AES接口启动时间从2秒涨到15秒。后来改成启动时只让安全芯片协商一个会话密钥后续批量解密全部走主控的硬件Crypto引擎启动时间恢复到2.5秒。推理阶段的性能下降可能是运行时内存保护引起的。比如用MPU把模型缓冲区设置为不可缓存Non-cacheable推理时CPU/GPU访问内存的速度会明显下降。这里要精细配置把需要高频访问的计算图部分放在可缓存的安全区域只对真正需要保密的权重数据设置更强的隔离或者使用带安全特性的DMA通道。6.3 固件升级后设备启动失败报签名错误这个问题的根因十有八九是签名密钥不匹配。最常见的情况是开发环境有两套密钥——一套开发密钥、一套生产密钥产线烧录时用了生产密钥但固件升级包是用开发密钥签的设备验签自然不过。解决方法是建立密钥管理的版本控制流程对签名密钥的生成、备份、替换进行文档化并且在升级工具里加入签名校验的预检查。另一个容易踩坑的是安全芯片OTP区只能写一次。开发阶段如果反复往OTP里写测试密钥到量产时OTP空间可能不够或者已经烧死了正式密钥。所以建议开发板上保留“调试模式”和“量产模式”两套流程调试阶段完全不碰OTP量产阶段才通过专门的烧录工装烧入正式密钥。6.4 现场设备返修怎么保证模型参数不泄露返修是容易被忽略的安全缺口。设备返修到工厂工程师第一件事就是接调试口或者重新烧录固件。如果此时模型参数还是旧的明文状态维修人员就能看到、复制。建议返修流程制度化返修设备收到后先执行“数据擦除”指令由安全芯片配合把模型区域和密钥区域全部清零再进入维修流程。还有一个实操细节是设备报废或二手回收时的数据销毁。很多团队只用文件系统rm命令删模型文件但Flash上仍然留有数据残留工具可以恢复。要配合安全芯片做全片擦除或者对模型区域重复写入随机数。这虽然不会直接影响“抄板”但能避免设备二手流出后模型被倒卖。7. 最后一点实操体会做边缘推理设备的算法保护我最大的体会是不要迷信单颗芯片也不要迷信单一加密手段。真正的安全边界是存储加密、启动校验、运行时隔离、物理防护、产线管理这五件事同时做对才能让攻击成本高到让一般人放弃。SMEC98SP这类防抄板加密芯片的价值在于给整套体系提供了一个可靠的信任根但整个方案的设计思路才是核心。还有一个容易被低估的点模型参数保护和业务连续性之间要平衡。设计安全方案时就要考虑产线烧录、售后升级、返修调试等真实场景否则安全特性上线后工程师一天到晚处理“设备变砖”的客诉团队很快就会把安全功能关掉。我自己在项目里坚持的原则是每加一个安全机制必须同步更新对应的产线工具和售后手册让安全真正落在流程里而不是只落在代码里。如果你正准备给手里的边缘设备做算法保护建议先别急着选加密芯片拿一块目标板子把自己想象成攻击者先从Flash dump、调试口、串口日志这几条最容易走通的路试一遍。把你发现的裸奔点全部列出来再对照前面几节的方案逐条打补丁你会发现模型参数保护的门槛没有想象中那么高但一定要成体系地做。