AUTOSAR E2E + SecOC 通信安全(CAN E2E and SecOC)

系统架构L7别名 CAN E2E · End-to-End Protection · SecOC · Secure Onboard Communication · AUTOSAR Crypto Stack · E2E Profile · 通信安全 · 总线安全

本质 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. 为什么必须做通信安全 —— 两类失效完全正交

车上的总线物理层 + 链路层都没安全保证:

Mermaid diagram
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 等级 + 总线类型 + 消息布局

ProfileCRCCounterDataID适用
P018-bit4-bitimplicit老 CAN ECU,ASIL B
P028-bit4-bitnibble explicit老 CAN,变长消息
P0432-bit16-bitexplicitEthernet / SOMEIP,大数据
P0516-bit8-bitexplicit 16-bitCAN-FD 主流 ASIL D
P0632-bit8-bitexplicitEthernet ASIL D
P0764-bit32-bitexplicitEthernet 大消息 + 强保护
P1116-bit4-bitnibbleCAN-FD,带宽紧
P2216-bit4-bitinverted nibbleCAN-FD,P11 升级版

2.1 怎么选

选择主要看总线类型 + ASIL 等级两个维度——总线决定带宽预算(CAN classic 8 bytes 紧、CAN-FD 64 bytes 宽、Ethernet 几乎不限),ASIL 等级决定 CRC 强度和 Counter/DataID 宽度。下面这棵决策树覆盖 95% 项目场景。

Mermaid diagram

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 宽度推荐 polynomialHamming distance
80x2FHD=4 (data ≤ 119 bits)
160x755BHD=6 (data ≤ 135 bits)
320xF4ACFB13HD=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注入方式优劣
P01implicit(直接拼 buffer 头)简单,但要求两端都同意 buffer 布局
P02nibble explicitDataID 一半用 implicit 一半占用 nibble
P05/P06/P07explicit 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 单调。

Mermaid diagram

关键字段:

  • 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 怎么叠加 ——避免冗余

两套机制用在同一份消息时,常见架构:

Mermaid diagram

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 / DiagnosticSecOC 即可(无 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 verify0.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 帧丢失",攻击者趁机 stucktolerance ≤ 通信周期 × 安全裕度
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

Cross-references