-
-
[原创]施耐德 M580 工业控制器固件安全分析与解密研究
-
发表于: 1天前 692
-
1 前言
施耐德Modicon M580 系列可编程自动化控制器(PAC)作为高端工业控制设备,广泛部署于电力、石化、水处理等关键基础设施领域。其采用 ePAC 架构,运行 VxWorks 实时操作系统,支持 EtherNet/IP、Modbus TCP 等主流工业协议。如下图为产品的设计架构

随着 OT 与 IT 网络融合加速,PLC 已成为攻击者重点目标。该设备固件中不仅包含操作系统内核与协议栈实现,还可能隐藏默认凭证、未公开接口或后门逻辑。因此,对固件进行深度解密与逆向分析,是评估设备真实安全水位的前提。
然而,施耐德自 V3.x 起对固件实施 AES-256 加密保护,V4.x 更引入数字签名机制,形成“加密+认证”双重防护。这是否意味着固件安全无懈可击?本文将从实战攻防视角出发,系统性还原从协议层突破 → 内存读取 → 密钥提取 → 算法逆向 → 跨版本解密的全链路攻击路径,揭示其固件保护机制中的设计缺陷。
2 攻击面识别:从协议私有功能码切入
施耐德M340、M580等系列工业控制器采用其自研的私有协议,内部统称为UMAS协议,该协议是基于Modbus协议进行的魔改,包含有很多私有设计的功能码字段,如下所示,其中有pu_ReadMemoryBlock、pu_WriteMemoryBlock、pu_ReadBOL、pu_WriteVarList操作等等。

关于协议相关的研究笔者在各大会议上均有分享,不再赘述。我们本次聚焦于固件分析,通过对私有协议分析,发现V3.X版本固件中存在物理内存读取功能码且没有任何身份验证,因此可以利用0x28功能码读取多有的控制器内存数据,经过分析内存数据中包含固件代码,解密固件的AES密钥,工程数据,密码哈希等等关键数据。

Dump出内存后构建了完整的内存布局图如下所示

根据特征进行分析发现了AES相关密钥及IV值,如下所示。

安全缺陷分析:
明文存储:密钥未经混淆或加密,直接暴露;
静态共享:所有同型号设备使用相同密钥,单点突破影响全系列;
无访问控制:0x28关键私有功能码未实施认证,任意网络可达设备均可读取。
至此,V3.x 固件解密的“钥匙”已被掌握。
3 V3.x 固件解密:算法逆向与流程还原
M580 V3.x 固件是以.ldx为结尾的压缩包文件,利用工具解压后可以得到如下所示的文件

核心固件文件以 .img 为扩展名,其结构如下

其中固件头标识为Magic: 27 05 19 56, Version: "vxWorks V03.20..."
通过逆向内存中代码段,我们识别出以下特征:
AES S-Box 查找表:标准 256 字节 S-Box 完整存在;
密钥长度 32 字节:对应 AES-256;
CBC 模式:解密前存在 IV 异或操作;
LZMA 头部:解密后数据以 5D 00 00 80 00... 开头,确认压缩算法为 LZMA。
完整的解密流程如下所示

跳过文件头:忽略前 0x40 字节;
AES-256-CBC 解密:使用提取的 Key 和 IV;
去除 PKCS7 填充:检测末尾 N 字节是否均为 0xN,若是则移除;
LZMA 解压:使用 lzma.decompress(..., format=lzma.FORMAT_ALONE);
切除头部 512 字节:获得最终固件文件镜像。
经过实验发现在V3.X的固件版本在LZMA 数据格式还是有细微差异,如下图所示

但所有版本的解密密钥及IV全部一致,经验证,该流程可成功解密 V3.10、V3.20、V3.99等多个版本固件。使用脚本编写解密SV3.99过渡固件版本的过程如下所示

解密后的文件二进制如下所示

4 V4.x 安全固件突破:跨版本密钥演进分析
施耐德在 V4.x 版本中引入了多项安全增强措施:
新加密密钥:更换了 AES 密钥和 IV
数字签名:引入 CMS/PKCS#7 签名机制
证书验证:使用 X.509 证书链验证固件完整性
新封装格式:采用 SEDP (Secure Encrypted Data Package) 格式
V4.x 固件采用 .sedp 扩展名,实际为 ZIP 压缩包,如下所示

解压后的文件如下所示

PackageMetadata.json 关键字段如下所示
{
"schemaName": "Data Package",
"dataPackage": {
"category": "Firmware",
"productInfo": {
"vendorName": "Schneider Electric",
"productName": "BME P58 1020 Unity CPU",
"version": "04.01.36"
},
"items": [{
"files": {
"file": [
{"name": "M580.img", "hashValue": {"type": "SHA_256", "value": "047DE8AE..."}},
{"name": "M580.cms", "hashValue": {"type": "SHA_256", "value": "DC14E5F0..."}}
]
}
}]
}
}
M580.cms 文件采用 CMS (Cryptographic Message Syntax) / PKCS#7 格式:

证书链结构如下所示

由于工控设备的长生命周期决定了厂商必须要考虑老版本的升级问题,在研究过程中发现如果老旧设备要升级至V4.X固件版本,必须要先升级至V3.99固件版本,因此V3.99作为过渡版本,其解密后的固件镜像中必然包含了V4.x的加密密钥,否则无法作为衔接版本继续升级至较高版本。
基于此经验,先利用之前的分析的V3.X固件解密的思路将V3.99固件解密后进行分析,从字符串中搜索类似于AES密钥的字符串,发现内置了V4.X版本的AES密钥和IV值,因此提取出这些信息后即可解密V4.X的固件,整体的解密思路如下流程所示。

整体的V4.X固件解密流程如下所示

利用该思路编写对应的工具,针对2025年后半年发布的最新固件进行解密,过程如下所示

解密后的固件文件如下所示,包含了主固件镜像、固件升级 RTP 程序、HTTP 代理服务、控制系统服务器、Web 管理界面等。

至此最新版本的M580系列PLC加密固件已经完美解密,可以继续后面的安全分析工作。再次复盘整个解密过程,发现该产品设计中的如下几个缺陷:
密钥硬编码:所有同版本设备共享相同密钥
明文存储:密钥未经保护存储于可读取内存
过渡版本泄露:V3.99 同时包含新旧密钥
协议漏洞:私有功能码缺乏认证机制
向后兼容陷阱:升级路径设计导致密钥链泄露
也正是由于工业场景的复杂及对高可用高可靠的严苛要求,才加剧了所有工控厂商在设计时将主要精力投入至业务功能,安全设计及测试投入不足才造就了工控系统及设备普遍脆弱的局面。
5 安全影响及防护建议
本研究发现施耐德过渡固件版本包含敏感密钥信息的漏洞影响施耐德 M580 全系列产品:
BMEP58xxxx 系列 CPU 模块
BMEH58xxxx 系列热备 CPU
BMEP58xxxx 系列安全 CPU
覆盖固件版本:V3.x - V4.x 全版本
潜在的攻击场景包括但不限于:
1)固件逆向分析及漏洞挖掘
攻击者获取固件 → 解密 → 逆向分析 → 发现 0-day 漏洞 → 武器化利用
2)后门植入
解密固件 → 植入恶意代码 → 重新打包 → 社会工程诱导升级 → 控制设备
3)知识产权窃取
解密固件 → 提取细节内容实现 → 开发兼容设备 → 商业竞争
基于此特提出如下的防护建议:
工控厂商层面
密钥管理改进:
采用设备级唯一密钥
使用硬件安全模块(HSM)保护密钥
实施密钥分层管理
固件保护增强
采用白盒加密技术保护密钥
实施代码混淆和反调试机制
使用安全启动验证固件完整性
升级路径重设计
避免在过渡版本中暴露新密钥
使用密钥交换协议动态协商密钥
实施固件版本隔离机制
业主用户层面
网络隔离
将 PLC 设备部署于独立 VLAN
实施严格的防火墙策略
禁止 PLC 直接暴露于互联网
访问控制
启用设备内置的访问控制功能
定期更换默认密码
实施最小权限原则
监控审计
部署工控入侵检测系统
监控异常 Modbus 流量
记录所有固件升级操作
固件管理
仅从官方渠道获取固件
验证固件数字签名
建立固件版本基线
6 总结
本文分析了施耐德M580工业控制器固件保护机制,完整还原了从 V3.x 到 V4.x 的加密体系演进过程。主要研究成果包括:
密钥提取:从设备内存中提取 AES-256 加密密钥和初始化向量
算法逆向:完整还原 AES-256-CBC + LZMA 加密压缩方案
跨版本攻击:发现过渡版本 V3.99 中的密钥泄露问题,实现 V4.x 固件解密
工具开发:实现支持全版本的自动化固件解密工具
本研究再次印证:固件加密若缺乏密钥保护、协议认证与安全启动支撑,仅是“纸面安全”。呼吁工控厂商在设计阶段即融入纵深防御、内嵌安全的理念,共同筑牢工业控制系统安全底座。
[内核课程]《Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。