核心定位:信息安全防护不是单一技术,而是多层防御体系。本文深度拆解汽车信息安全的五大防护技术:SecOC报文加密、安全网关、安全启动、入侵检测系统、密钥管理,用真实工程案例说明"为什么一个128位MAC可以阻挡千万次CAN攻击尝试"。
那个被破解的诊断服务 | 从27服务漏洞看防护需求
2020年:某豪华品牌的安全危机
2020年,安全研究人员发现某欧洲豪华品牌ECU的UDS 27服务(种子密钥解锁)存在弱点:
政击流程:
Step 1:请求种子
发送:27 01
响应:67 01 AB CD EF 12(4字节种子)
Step 2:破解密钥算法
算法太简单:key = (seed XOR 0x12345678) + 0xABCD
研究人员通过逆向工程发现了算法
Step 3:发送破解后的密钥
发送:27 02 [calculated_key]
响应:67 02(解锁成功!)
Step 4:随意操作ECU
可以写VIN码、修改里程、刷写固件...
根本原因:
- 密钥算法过于简单,容易被逆向
- 未限制解锁尝试次数
- 种子长度仅为4字节(只有42亿种组合)
后果:
- 所有搭载该ECU的车型都可被轻易解锁
- 需要OTA更新所有车辆的ECU固件
- 这个案例揭示:单纯的种子密钥算法已经不够用,必须引入加密认证机制。
防护技术1:SecOC报文加密与认证
什么是SecOC?
SecOC = Secure Onboard Communication
(安全车载通信)
SecOC是AUTOSAR定义的CAN总线安全通信协议,通过在CAN报文中增加MAC(Message Authentication Code,消息认证码)和新鲜度值(Freshness Value),实现三大安全目标:
- 认证性(Authentication):确认报文来自合法节点
- 完整性(Integrity):确保报文未被篡改
- 新鲜性(Freshness):防止重放攻击
SecOC报文结构
普通CAN报文:
+--------+-------------+
| CAN ID | Data (8) |
+--------+-------------+
| 0x245 | 01 23 45 67 |
| | 89 AB CD EF |
+--------+-------------+
SecOC加密后:
+--------+------------------+---------+-----------+
| CAN ID | Payload (5 bytes)| FV (1) | MAC (2) |
+--------+------------------+---------+-----------+
| 0x245 | 01 23 45 67 89 | 3A | BC DE |
+--------+------------------+---------+-----------+
↑ ↑ ↑
原始数据 新鲜度值 认证码
关键字段说明:
1. Freshness Value(FV,新鲜度值)
- 作用:保证每条报文的唯一性,防止重放攻击
- 实现:通常为递增计数器或时间戳
- 长度:1-8字节(具体看CAN剩余带宽)
示例:
第1次发送:FV = 0x00
第2次发送:FV = 0x01
第3次发送:FV = 0x02
...
第256次发送:FV = 0xFF
第257次发送:FV = 0x00(循环)
防重放原理:
- 攻击者录制FV=0x05的报文
- 当前系统已到FV=0x10
- 重放旧报文时,接收方检测FV过旧,丢弃报文
2. MAC(Message Authentication Code)
- 作用:验证报文的认证性和完整性
- 算法:通常使用CMAC-AES128或HMAC-SHA256
- 长度:2-16字节(通常2-4字节平衡安全与带宽)
MAC计算公式:
MAC = CMAC-AES128(
Key, // 共享密钥(128位)
CAN_ID || Payload || FV // 要保护的数据
)
取前24位(3字节)作为MAC放入报文
安全强度分析:
- 24位MAC:暴力破解需要1677万次尝试
- 32位MAC:暴力破解需要42.9亿次尝试
- 假设CAN总线每秒发送1000次,破觥32位MAC需要497天
SecOC工作流程
发送方:
1. 准备原始数据:
Payload = [01 23 45 67 89]
2. 获取新鲜度值:
FV = FreshnessCounter++ // 当前FV=0x3A
3. 计算MAC:
Input = CAN_ID || Payload || FV
= 0x245 || 01 23 45 67 89 || 3A
MAC = CMAC-AES128(SharedKey, Input)
= BC DE 7F ...(取16字节)
取前2字节:MAC_truncated = BC DE
4. 组装SecOC报文:
SecOC_Message = Payload || FV || MAC_truncated
= 01 23 45 67 89 3A BC DE
5. 发送到CAN总线
接收方:
1. 接收SecOC报文:
Received = 01 23 45 67 89 3A BC DE
2. 解析字段:
Payload = 01 23 45 67 89
FV = 3A
MAC_rx = BC DE
3. 验证FV新鲜度:
if (FV <= LastAcceptedFV) {
丢弃报文; // 可能是重放攻击
}
4. 重新计算MAC:
Input = CAN_ID || Payload || FV
MAC_calc = CMAC-AES128(SharedKey, Input)
= BC DE 7F ...
MAC_calc_truncated = BC DE
5. 比对MAC:
if (MAC_calc_truncated == MAC_rx) {
接受报文; // 认证通过
LastAcceptedFV = FV;
} else {
丢弃报文; // 认证失败,可能被篡改
}
SecOC在实际车型中的应用
大众MEB平台(ID.3、ID.4等):
- 关键ECU之间的通信已采用SecOC
- 加密报文包括:动力系统控制、诊断指令
- MAC长度:3字节(24位)
宝马G20:
- ADAS域控与底盘域控之间的通信采用SecOC
- 防止转向、制动指令被伪造
特斯拉Model 3/Y(部分关键报文):
- 网关与BMS之间的高压控制指令
- 防止黑客通过IVI中控屏攻入后控制高压系统
SecOC的挑战与权衡
挑战1:带宽占用
- 原始8字节报文 → 加寅后可能增加3-4字节
- 增幅37.5-50%的带宽消耗
- CAN总线负载本就已经40-50%,加密后可能超载
解决方案:
- 选择性加密:仅对关键安全报文加密(10-20%的报文)
- CAN-FD升级:从CAN升级到CAN-FD(5Mbps),带宽提升5倍
挑战2:实时性影响
- AES-128加密计算耗时:约50-100μs
- 关键安全功能要求<10ms响应
- 对于高频报文(如每10ms一次),加密可能影响实时性
解决方案:
- 使用硬件加密引擎(HSM),加快计算速度
- 高频低延迟报文仅加MAC,不加密载荷
挑战3:密钥管理复杂度
- 每个加密通道都需要一个共享密钥
- 一辆车可能有50+个ECU,需要管理数百个密钥
- 密钥更新、吹销、存储都是挑战
解决方案:
- 在HSM中安全存储密钥
- 定期通过OTA更新密钥
防护技术2:安全网关与防火墙
什么是安全网关?
安全网关(Security Gateway)是车内网络的“边境守卫”,位于不同安全域之间,负责:
- 报文过滤:阻挡非法报文
- 访问控制:基于黑白名单管理通信
- 协议转换:CAN、CAN-FD、以太网之间的转换
- 入侵检测:检测异常通信模式
车内网络分区架构
现代智能车辆通常将网络分为多个安全域:
╔════════════════════════╗
║ 外部网络(互联网) ║
║ 4G/5G、Wi-Fi、蓝牙 ║
╠════════════════════════╣
│
[防火墙/IDS]
│
╔════════════════════════╗
║ 娱乐域(低安全) ║
║ IVI、诊断接口 ║
╠════════════════════════╣
│
[安全网关] ← 最关键
│
╔════════════════════════╗
║ 关键安全域(高安全) ║
║ 动力、底盘、ADAS ║
╠════════════════════════╣
安全网关的四大防护机制
机制1:黑白名单过滤
白名单模式:仅允许预定义的报文通过
// 白名单配置示例
const WhiteList[] = {
{CAN_ID: 0x100, Direction: InfotainmentToPowertrain, Allow: false},
{CAN_ID: 0x245, Direction: PowertrainToInfotainment, Allow: true},
{CAN_ID: 0x3A0, Direction: Bidirectional, Allow: true},
};
// 网关过滤逻辑
if (IsInWhiteList(ReceivedMessage)) {
ForwardMessage(); // 转发
} else {
DropMessage(); // 丢弃
LogSecurityEvent(); // 记录安全事件
}
黑名单模式:阻挡已知危险报文
// 黑名单配置示例
const BlackList[] = {
{CAN_ID: 0x7DF, Reason: "UDS诊断请求"},
{CAN_ID: 0x000, Reason: "洪水攻击常用ID"},
};
if (IsInBlackList(ReceivedMessage)) {
DropMessage();
TriggerAlert(); // 触发告警
}
机制2:报文频率限制
目的:防止洪水攻击(DoS Attack)
// 频率限制配置
const RateLimitConfig[] = {
{CAN_ID: 0x100, MaxRate: 100}, // 最多100帧/秒
{CAN_ID: 0x245, MaxRate: 50}, // 最多50帧/秒
};
// 频率检测逻辑
if (GetMessageRate(CAN_ID) > MaxRate) {
DropMessage();
LogAnomaly("Rate Limit Exceeded");
}
实际效果:
- 正常情况:某报文每100ms发送一次(10Hz)
- 攻击场景:攻击者每1ms发送一次(1000Hz)
- 网关行为:识别异常,丢弃超出限制的报文
机制3:深度包检测(DPI)
目的:检测报文载荷中的异常数据
// 检测转向角度是否合理
if (CAN_ID == STEERING_ANGLE_ID) {
int16_t angle = ParseSteeringAngle(Data);
if (angle < -540 || angle > 540) {
// 转向角度超出物理极限(±540°)
DropMessage();
LogAnomaly("Invalid Steering Angle");
}
}
// 检测车速是否合理
if (CAN_ID == VEHICLE_SPEED_ID) {
uint16_t speed = ParseVehicleSpeed(Data);
if (speed > 300) { // 300 km/h
// 车速超出合理范围
DropMessage();
}
}
机制4:异常行为检测
目的:检测与正常模式不符的通信行为
示例1:检测新CAN ID
// 学习模式:记录正常运行时的所有CAN ID
LearnedIDs = {0x100, 0x245, 0x3A0, ...};
// 检测模式:检测未见过的ID
if (!IsInLearnedIDs([ReceivedMessage.ID](http://ReceivedMessage.ID))) {
LogAnomaly("Unknown CAN ID Detected");
// 可选:丢弃或仅记录
}
示例2:检测时序异常
// 正常时序:车辆启动时的报文顺序
NormalSequence = [
BMS_Wakeup, // 步骤1:BMS唤醒
VCU_Init, // 步骤2:VCU初始化
Motor_Ready, // 步骤3:电机就绪
];
// 检测异常:如果先收到Motor_Ready,再Motor收到BMS_Wakeup
if (OutOfSequence(ReceivedMessages)) {
LogAnomaly("Abnormal Message Sequence");
}
防护技术3:安全启动(Secure Boot)
什么是安全启动?
安全启动确保ECU在启动时仅运行经过验证的合法固件,防止恶意固件被加载。
为什么需要安全启动?
- 防止攻击者植入后门固件
- 防止固件降级攻击(刷入旧版本漏洞固件)
- 防止供应链攻击(生产环节植入恶意代码)
安全启动流程
步骤1:上电,硬件初始化
↓
步骤2:Bootloader启动(固化在ROM中,不可篡改)
↓
步骤3:读取应用固件及其数字签名
Firmware_Image + Digital_Signature
↓
步骤4:从HSM中读取公钥
Public_Key(存储在硬件安全模块中)
↓
步骤5:验证数字签名
if (RSA_Verify(Public_Key, Firmware_Image, Digital_Signature) == VALID) {
签名有效 → 继续
} else {
签名无效 → 停止启动,进入故障模式
}
↓
步骤6:验证固件版本(防降级)
if (Firmware_Version >= Minimum_Version) {
版本合法 → 继续
} else {
版本过低 → 拒绝启动
}
↓
步骤7:加载并执行应用固件
↓
ECU正常运行
数字签名原理
RSA签名与验证:
==== 签名过程(车企端)====
1. 计算固件Hash:
Hash = SHA-256(Firmware_Image)
2. 用私钥签名:
Signature = RSA_Sign(Private_Key, Hash)
3. 将签名附加到固件:
Signed_Firmware = Firmware_Image || Signature
==== 验证过程(ECU端)====
1. 分离固件和签名:
Firmware_Image, Signature = Parse(Signed_Firmware)
2. 计算固件Hash:
Hash_calc = SHA-256(Firmware_Image)
3. 用公钥验证签名:
Hash_decrypted = RSA_Decrypt(Public_Key, Signature)
4. 比对Hash:
if (Hash_calc == Hash_decrypted) {
签名有效,固件可信
} else {
签名无效,固件被篡改
}
安全启动在实际车型中的应用
特斯拉:
- 所有ECU均采用安全启动
- 使用RSA-2048或更高强度签名
- OTA更新包也必须经过签名验证
大众MEB平台:
- 域控制器采用安全启动
- 支持防降级机制(版本回滚保护)
蔚来ET7:
- ADAM超算平台采用安全启动
- 支持多级验证(Bootloader→OS→Application)
大家不知道的隐藏知识
1. 为什么SecOC的FV不能简单用时间戳?
问题:
- CAN总线上没有全局同步时钟
- 每个ECU的本地时钟可能存在漂移(每小时差距数秒)
- 如果用绝对时间戳,可能导致合法报文被误判为重放
解决方案:
- 使用相对FV:递增计数器,不依赖绝对时间
- 发送方和接收方各自维护计数器
- 允许一定的FV窗口(如±10),容忍报文乱序
2. HSM(硬件安全模块)究竟是什么?
HSM是集成在MCU内部的专用安全协处理器,负责:
- 密钥存储:密钥存储在HSM内部,软件无法直接读取
- 加密计算:加速AES、RSA等加密算法
- 安全启动:存储公钥和Bootloader
- 防篡改:检测物理攻击(如电压攻击、时钟攻击)
主流HSM芯片:
- Infineon AURIX TC3xx:集成HSM,支持AES-256、RSA-2048
- NXP S32K3xx:集成HSE(Hardware Security Engine)
- Renesas RH850:集成ICUMHA安全模块
3. 为什么特斯拉被黑客攻破后,不立即开启SecOC?
原因1:已交付车辆无法升级硬件
- 老款ECU可能不支持HSM
- 无法通过OTA增加硬件加密引擎
原因2:CAN总线带宽不足
- Model 3/Y的CAN总线负载已达50%
- 全部开启SecOC可能导致带宽超载
解决方案:
- 仅对关键报文开启SecOC(如高压控制、诊断指令)
- 新车型采用CAN-FD,从设计之初就考虑SecOC
关键要点总结
✅ SecOC三大目标:认证性、完整性、新鲜性
✅ FV+MAC机制:FV防重放,MAC防篡改,两者缺一不可
✅ 安全网关:边界防护的关键,五大机制多层防御
✅ 安全启动:防止恶意固件,根系统防线
✅ HSM不可或缺:硬件安全是软件安全的基础
✅ 平衡艺术:安全、性能、成本三方权衡
✅ 分层防御:单一技术无法全面防护,必须多层组合
作业:
- 计算:如果你公司车型的CAN总线有50个关键报文需要加密,采用24位MAC,会增加多少带宽消耗?
- 设计:为你公司车型设计一个安全网关的黑白名单策略
- 研究:Bootloader如何存储在ROM中并确保不可篡改