AUTOSAR E2E + SecOC 通信安全(CAN E2E and SecOC)
本质 CAN/CAN-FD/Ethernet 是裸的、不可信的传输层——任何位翻转、ECU 错发、消息重放、恶意伪造都会让接收方用错的数据控制扭矩、刹车、电池。AUTOSAR 用两套机制分工解决:E2E 解 functional safety 侧(防止偶然故障——bit flip / lost message / wrong sender),SecOC 解 cybersecurity 侧(防止恶意攻击——伪造、重放、篡改)。两套都跑在同一份消息上,但目的、算法、密钥管理完全不同。本页拆 E2E 8 种 Profile 各自的 CRC + Counter + DataID 设计,SecOC 的 Freshness + MAC 流程,以及 ASIL D 项目里 E2E 和 SecOC 怎么叠加才不冗余。
学习目标
读完本页后,你应该能够:
- 区分 E2E(防偶然 fault)和 SecOC(防恶意攻击)的不同目的
- 列出 AUTOSAR E2E 8 种 Profile 的差异 + ASIL B/C/D 各推荐哪个
- 解释 CRC + Counter + DataID 三件套各自抓什么 fault
- 说出 SecOC Freshness Counter / MAC / Crypto Stack 的工作流程
- 设计 ASIL D 主驱 ECU 接收 VCU 扭矩指令的 E2E 实施
- 判断 E2E 和 SecOC 在同一消息上叠加 vs 互斥的边界
- 识别通信安全 5 个反模式
1. 为什么必须做通信安全 —— 两类失效完全正交
车上的总线物理层 + 链路层都没安全保证:
| Fault 类型 | 触发源 | 防护 |
|---|---|---|
| f1 Bit flip(EMI / 老化) | 偶然 | E2E CRC |
| f2 消息丢/迟 | 偶然(总线拥塞) | E2E Counter + Timeout |
| f3 错发(发送端 SW bug) | 偶然 | E2E DataID |
| f4 Stuck 重发老消息 | 偶然(发送端 ISR 卡死) | E2E Counter |
| f5 伪造 / 重放 / 篡改 | 恶意 | SecOC |
关键认知:E2E 解 ISO 26262 的"功能安全"问题(防偶然),SecOC 解 ISO 21434 的"cybersecurity"问题(防恶意)。两套机制目的不同,不能互相替代。
2. E2E 8 种 Profile —— 选谁?
AUTOSAR R23-11 定义 8 种 E2E Profile,按"CRC 强度 / Counter 类型 / DataID 注入方式"区分。实际项目按 ASIL 等级 + 总线类型 + 消息布局选。
| Profile | CRC | Counter | DataID | 适用 |
|---|---|---|---|---|
| P01 | 8-bit | 4-bit | implicit | 老 CAN ECU,ASIL B |
| P02 | 8-bit | 4-bit | nibble explicit | 老 CAN,变长消息 |
| P04 | 32-bit | 16-bit | explicit | Ethernet / SOMEIP,大数据 |
| P05 | 16-bit | 8-bit | explicit 16-bit | CAN-FD 主流 ASIL D |
| P06 | 32-bit | 8-bit | explicit | Ethernet ASIL D |
| P07 | 64-bit | 32-bit | explicit | Ethernet 大消息 + 强保护 |
| P11 | 16-bit | 4-bit | nibble | CAN-FD,带宽紧 |
| P22 | 16-bit | 4-bit | inverted nibble | CAN-FD,P11 升级版 |
2.1 怎么选
选择主要看总线类型 + ASIL 等级两个维度——总线决定带宽预算(CAN classic 8 bytes 紧、CAN-FD 64 bytes 宽、Ethernet 几乎不限),ASIL 等级决定 CRC 强度和 Counter/DataID 宽度。下面这棵决策树覆盖 95% 项目场景。
ASIL D 主驱 + CAN-FD 默认选 P05 —— 16-bit CRC + 8-bit Counter + 16-bit DataID,保护强度够,带宽开销可接受(每帧 +5 bytes)。
3. CRC —— 抓 bit flip
E2E 的 CRC 不是 CAN 链路层的 CRC ——后者只覆盖物理传输,前者覆盖"发送端封装到接收端解封"的整条端到端路径。链路层 CRC 在 ECU 内部转发时(Gateway / Router)就被剥掉重新算了,不能算端到端保护。
3.1 CRC 多项式选择
E2E 用的多项式都是经过验证的,8/16/32-bit 各对应不同 polynomial:
| CRC 宽度 | 推荐 polynomial | Hamming distance |
|---|---|---|
| 8 | 0x2F | HD=4 (data ≤ 119 bits) |
| 16 | 0x755B | HD=6 (data ≤ 135 bits) |
| 32 | 0xF4ACFB13 | HD=6 (data ≤ 32768 bits) |
Hamming distance HD=N 意味着任意 N-1 个 bit 翻转都能 100% 检测出来。HD=6 对汽车级足够(总线 BER 极低,N=6 概率 < )。
3.2 CRC 不抓什么
CRC 只抓 bit-level 的 random fault ——它抓不住:
- 系统性 bit 错(发送端总在某 bit 错,CRC 还能对上)
- 消息重放(老消息 CRC 还有效)
- 错的发送端发出格式正确的消息
后两者要 Counter + DataID 兜。
4. Counter —— 抓丢失 / 重放 / stuck
每发一帧,Counter +1(到 max 后绕回 0)。接收端检查相邻两帧的 Counter 增量,没增 / 大跳 / 停滞都视为 fault。
| Counter 行为 | 含义 | 反应 |
|---|---|---|
| 比上一次 +1 | 正常 | OK |
| 比上一次 +2 ~ +N(可配 N) | 中间丢了 N-1 帧 | tolerate(消息允许丢一些)或 fault |
| Counter 没变 | stuck(发送端 ISR 卡) | fault |
| Counter 倒退 | 重放或乱序 | fault |
| Counter 大跳(> N) | 通信链严重故障 | fault |
实际 Profile 里 Counter 是 4-bit 或 8-bit,P05 用 8-bit 最常见(允许丢 ≤ 7 帧不报错,8-bit 绕回周期 256 帧 ≈ 2.5 秒 @ 100Hz 频率,够用)。
5. DataID —— 抓"错的发送端发对的格式"
DataID 是给每个 E2E 保护消息分配的唯一全局 ID(2 bytes 或更宽),计算 CRC 时把 DataID 拼进去。这样:
- 接收端用预期 DataID 重新算 CRC
- 如果发送端"误把消息 A 的内容包装成消息 B 的格式"发出,接收端 B 算 CRC 时 DataID 不匹配,CRC 不过
5.1 DataID 注入三种方式
DataID 怎么塞进消息有三种风格——决定带宽开销 + 维护风险。implicit 不占字节但易错(buffer 布局变了 CRC 全错),explicit 占 2-4 字节但稳。ASIL D 项目几乎全用 explicit,带宽贵也认了。
| Profile | 注入方式 | 优劣 |
|---|---|---|
| P01 | implicit(直接拼 buffer 头) | 简单,但要求两端都同意 buffer 布局 |
| P02 | nibble explicit | DataID 一半用 implicit 一半占用 nibble |
| P05/P06/P07 | explicit 16/32-bit | 显式占字节,带宽贵但最稳 |
ASIL D 推荐 explicit —— implicit 容易在 ECU 升级时悄悄破坏(buffer 布局变了 CRC 全错)。
6. SecOC —— 防恶意攻击
E2E 抓得住偶然 fault 但抓不住有心人:攻击者完全可以伪造一份合法 CRC + 单调 Counter + 正确 DataID 的消息。SecOC 就是给消息加密签 + 时戳防重放。
6.1 SecOC 基本流程
SecOC 在每帧追加两类字段:MAC(消息认证码,证明消息是合法 sender 用 shared key 算出来的)+ Freshness Counter(全局单调时戳,防重放)。算法核心是 HMAC-SHA-256 截断,关键是密钥不能被攻击者拿到。流程上 sender 算 MAC 附帧后,receiver 用同一 key 重算并验证 Freshness 单调。
关键字段:
- MAC(Message Authentication Code)—— 用 shared key + payload + Freshness Counter 算 HMAC-SHA-256,截取低 24-64 bit 附在帧后
- Freshness Counter / Freshness Value —— 全局单调时钟或计数器(各方同步),防重放
- Truncated —— MAC 完整 256-bit 太大,实际只附 24-64 bit(截断不影响 collision 不可行性)
6.2 Crypto Stack(CSM/CSMS)
AUTOSAR Crypto Stack 把 MAC 算法、密钥存储、随机数生成抽象成 service:
| Layer | 职责 |
|---|---|
| CSM(Crypto Service Manager) | 上层 API: SecOC 调 CSM 算 MAC |
| CryIf(Crypto Interface) | 路由 |
| Crypto Driver | 实际算法实现(软件 / HW Crypto Engine) |
| HSM(Hardware Security Module) | 安全密钥存储 + 加速 |
ASIL D 项目密钥存 HSM(Infineon AURIX HSM / NXP CSEc),不让 MCU SW 接触明文 key,防止固件漏洞泄露。
7. E2E 和 SecOC 怎么叠加 ——避免冗余
两套机制用在同一份消息时,常见架构:
E2E 先包(应用层最近),SecOC 再包(传输层附近)。原因:
- E2E 的 CRC 算的是"应用数据完整性"
- SecOC 的 MAC 算的是"E2E 包装后的完整性 + 真实性"
- 这样 SecOC 失效不影响 E2E 工作(E2E 仍解功能安全),反过来不影响
7.1 是否两个都要做
判据:E2E 看 ASIL,SecOC 看攻击面。任何 ASIL B 以上消息都要 E2E,任何"攻击者能物理或远程接触到总线"的场景都要 SecOC。网联车默认两条路径都开,纯内部 ECU 通信视攻击面决定。
| 场景 | 需要 |
|---|---|
| 内部 ECU 通信(主驱 ↔ VCU) | 两个都要 —— ASIL D + 网联车默认配 |
| 内部 ECU,无 OTA / 无网关 | E2E 即可(攻击面小) |
| 仅 OBD / Diagnostic | SecOC 即可(无 ASIL 安全要求,只防攻) |
| OTA 软件包传输 | SecOC + 数字签名(不是 E2E 范畴) |
8. ASIL D 主驱接收扭矩指令的 E2E 实施例
VCU → 主驱 inverter 的扭矩指令,典型 P05 配置:
Frame layout (CAN-FD 16 bytes):
[0..3] Torque request (signed int32, 0.01 Nm/LSB)
[4..7] Status flags + reserved
[8] Counter (8-bit, increments per frame)
[9..10] CRC-16 (computed over [0..7] + DataID + Counter)
[11..14] SecOC truncated MAC (32-bit)
[15] SecOC truncated Freshness Counter
Sender (VCU):
every 10ms:
increment Counter
compute CRC over (Torque + Status + DataID_VCU_Torque(0x1234) + Counter)
compute MAC over above + Freshness
transmit
Receiver (Inverter):
on frame:
1. Verify SecOC MAC + Freshness monotonic
2. Verify E2E CRC matches
3. Verify Counter incremented (allow gap ≤ 7)
4. Verify Torque in plausible range
5. If all pass: forward to FOC
else: enter fail-safe (use last valid for ≤ 100ms, then 0 torque)
每一层失败都进 fail-safe,不要"三战两胜"逻辑 —— 只要一层挂就当不可信。
9. 反应时间和 FTTI
通信安全的反应时间和硬件 SM 不同——它的"反应"指"接收端发现问题到放弃这条消息进入降级"的时间,本身在 ms 级。整体 FTTI 由消息频率 + 允许丢失帧数共同决定,而不是单帧验证速度。
| 检查 | 反应时间 | 说明 |
|---|---|---|
| 链路层 CRC | 自动(CAN 控制器内置) | 帧粒度 |
| E2E CRC + Counter | < 1 ms(软件) | 收到帧立即查 |
| SecOC MAC verify | 0.1-2 ms(软件 / HW Crypto) | HSM 加速时 < 0.1 ms |
| Timeout(消息 N ms 没到) | 配置(典型 100 ms) | 触发降级 |
通信链 FTTI 由消息频率 + tolerance 决定:扭矩指令 100 Hz,allow tolerance 5 帧,FTTI = 50 ms。
10. 安全反模式(5 个常见错)
E2E + SecOC 的实施细节多,最常踩的 5 个反模式都是"形式上做了但没真正起作用" —— CRC 算了但不是端到端、Counter 配了但 tolerance 太宽、SecOC 接了但 key 存的不安全。识别这几条比堆更多 SM 类型重要。
| 反模式 | 表现 | 修法 |
|---|---|---|
| 用 CAN 链路层 CRC 当 E2E | 跨 Gateway 转发时 CRC 重新算了,端到端无保护 | E2E CRC 必须在应用层独立算 |
| DataID implicit 但 ECU 升级改了 buffer | 升级后 CRC 全错,以为是硬件故障 | ASIL D 用 explicit DataID |
| Counter tolerance 设太大 | "允许 50 帧丢失",攻击者趁机 stuck | tolerance ≤ 通信周期 × 安全裕度 |
| SecOC key 存 MCU flash | 固件漏洞泄露 key,攻击者直接伪造 | 必须用 HSM 存 key |
| E2E 失败时降级到 last valid"保持几秒" | 卡死的发送端让接收端用过期数据 N 秒 | 失败立即进 fail-safe(典型 100 ms 后归零) |
核心要点
- E2E ≠ SecOC —— E2E 防偶然 fault(ISO 26262),SecOC 防恶意攻击(ISO/SAE 21434),不能互相替代
- E2E 三件套:CRC(抓 bit flip)+ Counter(抓丢/重放/stuck)+ DataID(抓错发送端) —— 缺一不可
- CAN-FD ASIL D 默认 Profile P05(16-bit CRC + 8-bit Counter + 16-bit explicit DataID)
- E2E 的 CRC 不是链路层 CRC,链路层在 Gateway 转发时被剥掉,真端到端必须应用层算
- SecOC 用 HMAC-SHA-256 截断 + Freshness Counter 防伪造重放,密钥必须存 HSM
- E2E 在内,SecOC 在外:E2E 解功能安全,SecOC 解 cybersecurity,两层独立工作互不干扰
- ASIL D 网联车 ECU 通信:两个都要做;离线 ECU 仅 E2E 即可;OTA 包用数字签名不是 E2E
- 5 反模式戒除:链路层 CRC 当 E2E / DataID implicit / Counter tolerance 大 / key 存 flash / 失败保留 last valid