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

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

本质与导读

本质 CAN/CAN-FD/Ethernet 是裸的、不可信传输:位翻转、丢帧、错发、重放、伪造都会让接收方用错数据去控扭矩、刹车、电池。AUTOSAR 在同一条消息上分两层解决:E2E 用 CRC+Counter+DataID 把 ISO 26262-6 §D.2.4 列的十类通信 fault 变成 detected fault(功能安全),SecOC 用 AES-128 CMAC+Freshness Value 防有意伪造与重放(cybersecurity)。两层的威胁模型、算法、密钥体系完全正交——E2E 挡不住会算 CRC 的攻击者,SecOC 挡不住发送端自己的 SW bug,ASIL D 网联车两个都要。

主线坐标:横轨 · 诊断 / 通信(跨站) · ↑ 全景主线

1. 为什么必须做通信安全 —— fault model 是十类,不是"CRC 抓错码"

车载总线的物理层 + 链路层对应用层数据没有端到端保证:CAN 链路层 CRC 只覆盖"导线上"这一段,帧一进 Gateway 被解包重组,CRC 就被剥掉重算;COM/PduR/RTE 这些软件层的拷贝、路由、缓存,每一步都可能引入链路层 CRC 看不见的错。所以通信保护必须在应用层两端闭合,这就是"End-to-End"三个字的含义。

通信链 5 类 fault — f1-f4 偶然 (E2E 防) vs f5 恶意 (SecOC 防)

上图是工程直觉版的五类压缩视图;标准的完整 fault model 在 ISO 26262-6:2018 Annex D §D.2.4 "Exchange of information",一共十类,AUTOSAR E2E 规范(FO PRS E2E Protocol R23-11,以 Profile 5 的 Table 6.45 为口径)对每一类都给出了对应的检测机制:

ISO 26262-6 §D.2.4 faultE2E 检测机制工程场景举例
Repetition(重复)Counter发送端 ISR 卡死重发旧帧
Loss(丢失)Counter总线过载、仲裁失败丢帧
Delay(延迟)Counter + timeout网关排队、队列溢出
Insertion(插入)DataID + CRC错误 PDU 被路由进本信号槽
Masquerade(冒充)DataID + CRC错误 ECU 发出格式正确的消息
Incorrect addressing(错寻址)DataID路由表配置错误
Incorrect sequence(乱序)Counter多路径路由、重传乱序
Corruption(损坏)CRCEMI 位翻转、DMA 拷贝错
Asymmetric information(各接收端收到不同内容)CRC多播时某一端收到损坏副本
Subset reception / blocking(部分接收 / 通道被堵)Counter(loss / timeout)某接收端持续收不到
关键认知:masquerade 在两…

关键认知:masquerade 在两边都出现,但含义不同。E2E DataID 抓的是"无意冒充"——发送端 SW bug 把消息 A 的内容装进消息 B 的格式;它对有意冒充完全无效,因为攻击者可以把 CRC、Counter、DataID 全部算对。防"会算 CRC 的对手"是 SecOC 的工作(§7),这也是 ISO 26262(随机/系统性 fault)与 ISO/SAE 21434(恶意攻击)的分界线。


2. E2E Profile 全景 —— R23-11 一共 14 个

AUTOSAR R23-11 的 E2E Protocol 规范定义 10 个数据 Profile(1/2/4/5/6/7/8/11/22/44)+ 4 个 method Profile(4m/7m/8m/44m)——后四个是给 SOME/IP client/server 方法调用加的变体,在数据字段外多带 Message Type(request/response)和 Message Result(OK/ERROR)两个字段。信号类通信只需要看前十个,按"CRC 强度 / Counter 宽度 / DataID 传输方式 / 头开销"区分:

ProfileCRCCounterData ID线上开销定位
P018-bit(0x1D)4-bit16-bit 隐式(mode 3 为 12-bit 半显式)≈ 1.5-2 Blegacy,规范明言新项目改用 P11
P028-bit(0x2F)4-bitDataIDList:16 个 8-bit 值按 Counter 轮换≈ 1.5 Blegacy CAN
P0432-bit(0xF4ACFB13)16-bit32-bit 显式12 B(含 16-bit Length)Ethernet/SOME/IP,数据 ≤ 4 KB
P0516-bit(0x1021)8-bit16-bit 隐式3 BCAN-FD 定长消息,ASIL D 主流
P0616-bit(0x1021)8-bit16-bit 隐式5 B(含 16-bit Length)CAN-FD/FlexRay 变长消息
P0764-bit(ECMA)32-bit32-bit 显式20 B(含 32-bit Length)Ethernet 大 PDU
P0832-bit(0xF4ACFB13)32-bit32-bit 显式16 B(含 32-bit Length)Ethernet,长计数需求
P118-bit(0x1D)4-bit16-bit 隐式或 12-bit nibble 半显式≈ 2 BCAN classic,P01 的现代替代
P228-bit(0x2F)4-bitDataIDList(同 P02)≈ 1.5 BCAN classic,P02 的现代替代
P4432-bit(0xF4ACFB13)16-bit32-bit 显式12 BP04 的大数据版,数据 ≤ 64 KB

2.1 怎么选

选择看总线类型 + 消息长度 + ASIL 等级三个维度:总线决定带宽预算(CAN classic 8 字节紧、CAN-FD 64 字节宽、Ethernet 几乎不限),消息定长还是变长决定要不要 Length 字段(P05 vs P06、P04 的 4 KB vs P44 的 64 KB),ASIL 等级决定 CRC 强度与 Counter 宽度的下限。

E2E Profile 选择决策树 — bus 类型 + ASIL 等级两维 (CAN classic → P11/P22, CAN-FD → P05/P06, Ethernet → P04/P07/P08)

CAN-FD 上的 ASIL D 定长消息默认 P05:16-bit CRC + 8-bit Counter,DataID 隐式不占线上字节,每帧只花 3 字节(隐式/显式 DataID 的机制与取舍见 §5)。CAN classic 新项目选 P11 而非 P01——两者线上布局兼容,但 P11 的接收端行为对齐 P04-P07 系的"新式" check 语义,且砍掉了 P01 已废弃的 DATAID_LOW/ALT 模式。


3. CRC —— 多项式选择的证据链

E2E 的 CRC 不是 CAN 链路层的 CRC:后者由 CAN 控制器硬件生成、只保护物理段,过 Gateway 就被剥掉重算;前者由发送端软件在应用数据上计算、接收端应用重新验证,覆盖"发送 SWC 封装到接收 SWC 解封"的整条路径,中间任何软件层(COM 拷贝错、DMA 搬运错、路由错)都在保护范围内。

3.1 五个多项式和它们的 Hamming distance

E2E 各 Profile 用的 CRC 例程全部来自 AUTOSAR CRC Library(CP SWS CRC Routines),多项式是有出处的选型而不是随手挑的:

CRC 例程多项式(normal form)Hamming distance用于 Profile
CRC-8 SAE J18500x1D规范未标注(legacy 沿用)P01 / P11
CRC-8H2F0x2FHD=4 至 119 bit 数据(Koopman 2004)P02 / P22
CRC-16 CCITT-FALSE0x1021HD=4 至 32751 bit(Koopman 数据)P05 / P06
CRC-32P40xF4ACFB13HD=6 至 4 KB(含 CRC),规范明标P04 / P08 / P44
CRC-64 ECMA0x42F0E1EBA9EA3693HD=4 至近 8 GB,规范明标P07

三个值得记住的细节:

  • 0x2F 就是 Koopman 记法的 0x97——Koopman & Chakravarty 2004 的结论是它在 ≤ 119 bit 数据上做到 HD=4 的最优 8-bit 多项式,完整覆盖 8 字节 CAN 帧(64 bit)。
  • 0xF4ACFB13(CRC-32P4)是专门为 E2E P04 选的:CRC Library 规范(SWS_Crc_00083)明写它对比 Ethernet CRC(0x04C11DB7)的优势是"HD=6 up to 4 kB"——这正好是 P04 的 MaxDataLength 上限(4096 字节),多项式与 Profile 数据上限是配套设计的。
  • P01 的 CRC-8 用 start=XOR=0x00,而 CRC Library 的 SAE8 例程用 0xFF/0xFF——E2E 库内部做两次额外 XOR 0xFF 来补偿。这是刻意的:让 E2E CRC 与链路层/其他用户的同多项式 CRC 结果不同,避免"两层 CRC 恰好都算对了错误数据"的共因。

HD=N 的含义:任意 N-1 个 bit 翻转 100% 检出。超出 HD 覆盖后,随机错误漏检概率趋近 (k 为 CRC 位宽)——16-bit CRC 约 ,这个残余概率会进 FMEDA 的通信 fault DC 论证。

3.2 CRC 不抓什么

CRC 只对数据内容的随机损坏有效,三类 fault 它天然放过:重放(旧帧的 CRC 依然自洽)、错发(错误发送端把格式算对)、系统性同位错(每帧同一 bit 错,CRC 每次都"验证通过"错的数据)。前两类靠 Counter 和 DataID 兜(§4/§5),最后一类靠应用层 plausibility(如扭矩指令与车速的合理性交叉核验,见 转矩安全)。


4. Counter 与 timeout —— 时域 fault

每次发送请求 Counter +1,到最大值绕回。以 P05 为例(PRS_E2E_00397):8-bit Counter 从 0 计到 0xFF 后回 0,0xFF 不是保留值,就是普通计数——这点和某些私有协议"0xFF=invalid"的习惯不同,移植时容易踩。

接收端 check 函数比较本帧与上帧的 Counter 增量,判定结果落到规范的 check status 枚举(E2E_PXXSTATUS_*):

Counter 增量Check status含义
+1OK正常
+2 ~ +MaxDeltaCounterOKSOMELOST中间丢了帧,但在容忍度内
0(同一帧又来一遍)REPEATED重复/stuck
超过 MaxDeltaCounter 或倒退WRONGSEQUENCE丢帧超限、乱序或重放
周期到了但没有新数据NONEWDATA发送端停发(timeout 的来源)

两个工程要点:MaxDeltaCounter 是安全参数不是舒适参数——它定义"最多容忍连续丢几帧",直接进 FTTI 预算(§9.3);timeout 检测不是独立机制,E2E Supervision 靠周期性非阻塞读 + NONEWDATA 状态实现,应用侧必须有周期任务去调 check,不调就没有 timeout 检测。8-bit Counter 在 100 Hz 消息上的绕回周期是 256 帧 = 2.56 s,远大于任何合理的 MaxDeltaCounter,绕回混叠在实践中不构成风险;4-bit Counter(P11/P22)只有 15 步,MaxDeltaCounter 必须配得更紧。


5. DataID —— 抓 masquerade,隐式还是显式是个真取舍

DataID 是每条 E2E 保护消息的系统级唯一编号,由 OEM 在整车信号数据库层面统一分配。它的作用机制:计算 CRC 时把 DataID 拼进数据,接收端用自己配置的预期 DataID 重算——如果收到的其实是别的消息(错发、错路由、插入),CRC 必然对不上。

5.1 三种注入方式

不同 Profile 的 DataID 处理方式不同,这决定带宽开销与故障表现:

方式Profile机制
隐式(implicit)P05 / P06 / P01(mode 0/1/2)/ P11DataID 不上线,只在 CRC 计算时拼在用户数据之后(PRS_E2E_00399);零字节开销
显式(explicit)P04 / P07 / P08 / P4432-bit DataID 作为 E2E header 字段随帧传输,接收端先比对再算 CRC
DataIDListP02 / P2216 个 8-bit DataID 按 Counter 值轮换选用,给 4-bit Counter 变相扩展了时序保护

5.2 隐式 vs 显式的真实取舍

旧口径"ASIL D 一律显式"不成立——P05 的隐式 DataID 正是 CAN-FD ASIL D 的主流配置,安全强度上两者等价(都进 CRC,masquerade 检出率相同)。真正的差别在工程性:

  • 隐式省带宽但故障表现隐蔽:两端 DataID 配置不一致(信号数据库版本漂移、ECU 升级后 ID 重分配)时,不会有"DataID mismatch"这种明确报错,而是 100% CRC fail——现象和总线损坏一模一样,排障时容易往硬件方向跑偏(见 §10 G2)。
  • 显式占 4 字节但 debug 友好:总线 trace 里直接可读,Ethernet 带宽也不心疼,所以 P04/P07/P08/P44 全是显式。

6. E2E state machine —— 单帧 check 不等于可用性判定

check 函数只回答"这一帧对不对",但应用不能拿单帧结果直接做安全决策——总线上偶发一帧 CRC 错太正常了(EMI 瞬态),一帧就切 fail-safe 会把假阳性变成可用性事故。规范为此在 check 之上定义了 E2E state machine(E2E_SM):在一个滑动接收窗口内统计 check 结果,给应用一个经过资格审查的状态。

状态集合(PRS §6.19):DEINIT → NODATA →(收到首批有效数据)INIT →(窗口内 OK 数达标)VALID ⇄(窗口内错误数超限)INVALID。应用只允许在 VALID 状态消费数据;INIT 阶段(如刚上电、发送端刚复位)数据不可用但也不算故障。

窗口参数(WindowSizeValid / MinOkStateValid / MaxErrorStateValid 等)不是随手配的,规范直接给出了它与故障检出时间 tFD 的关系(PRS §6.19 配置提示):

即从 VALID 掉到 INVALID 的最坏耗时 =(WindowSizeValid − MinOkStateValid + 1)× 消息周期(窗口从全 OK 滑到 OkCount < MinOkStateValid 需移出 WS−MO+1 帧)。这行公式必须出现在 FTTI 预算表里——E2E_SM 配置吃掉的检测时间与硬件 SM 的 DTI 是同一性质的预算项(§9.3 有算例)。规范也允许 disableEndToEndStateMachine=TRUE 直接把裸 check 结果交给应用,此时窗口逻辑要应用自己写,安全论证责任也跟着走。


7. SecOC —— 防"会算 CRC 的对手"

E2E 的三件套对攻击者是透明的:CRC 多项式、Counter 规则、DataID 分配全在公开规范和泄露的 DBC 里,OBD 口注入或蜂窝栈渗透后伪造一帧"E2E 完全合法"的扭矩指令没有任何门槛。SecOC(CP SWS Secure Onboard Communication)的答案是在消息上加密码学认证:没有密钥就造不出合法的 MAC,重放旧帧会被 Freshness Value 拒绝。

7.1 Secured I-PDU 怎么构造

发送路径六步(SWS_SecOC_00031):准备缓冲 → 构造认证输入 → 算 Authenticator → 拼 Secured I-PDU → Freshness 计数递增 → 发送。其中两步是理解 SecOC 的关键:

  • 认证输入 DataToAuthenticator = SecOC DataId(16-bit)‖ Authentic I-PDU ‖ 完整 Freshness Value(SWS_SecOC_00034,DataId 与 FV 按 Big Endian 编码)。注意进 MAC 的是完整 FV(如 64-bit),不是线上截断值——这是防重放强度的来源。
  • 截断(SWS_SecOC_00036):算出的 MAC(如 CMAC 的 128-bit 输出)截取最高若干位随帧传输。截断不削弱密钥安全性,只把"单帧盲猜成功率"从 放宽到 (n 为截断位数,见 §11 C2 的数字)。

SecOC 流程 — sender 用 payload + shared key + Freshness Value 算 MAC,截断附帧,receiver 重建 FV 验证 MAC

7.2 三个标准 SecOC Profile

算法与截断长度不是自由发挥,规范给了三个标准配置(SWS_SecOC_00192/00193/00194),MAC 算法统一是 AES-128 CMAC(NIST SP 800-38B)——不是 HMAC-SHA-256;车规选 CMAC 是因为 HSM 的 AES 硬件引擎可以直接复用,单帧延迟和面积都占优:

SecOC Profile截断 MAC截断 FV定位
Profile 1(24Bit-CMAC-8Bit-FV)24 bit(MAC 最高位)8 bit(FV 最低位)通用默认,4 字节总开销
Profile 2(24Bit-CMAC-No-FV)24 bit0(不用 FV)无法建立同步 freshness 时的降级——不防重放
Profile 3(JASPAR)28 bit4 bitCAN 专用,FV 全长 64-bit,配 JASPAR 计数器体系

7.3 Freshness Value —— SecOC 真正的工程难点

MAC 本身是成熟密码学,SecOC 项目翻车几乎都翻在 freshness 同步上。规范采纳的 JASPAR 方案把 64-bit FV 拆成四段拼接:Trip Counter(点火周期计数,≤ 24 bit)‖ Reset Counter(周期性递增,≤ 24 bit)‖ Message Counter(每帧 +1,≤ 48 bit)‖ Reset Flag(≤ 2 bit,取 Reset Counter 低位),四段总长 ≤ 64 bit。FV 管理由 Freshness Value Manager(FvM)承担,master ECU 通过同步消息广播 TripCnt/ResetCnt,各节点本地维护 MsgCnt。

线上只传 FV 的低几位(Profile 1 是 8 bit),接收端用本地计数器重建完整 FV:取"比本地值大的最小候选"代入 MAC 验证,失败则在 SecOCAuthenticationVerifyAttempts 配置的次数内尝试相邻候选——验证失败递增的 verify attempt counter 正是 SecOC_GetRxFreshness 的入参,FvM 据它给出下一个 FV 候选,达上限才丢帧(SWS_SecOC_00239/00241);SecOCAuthenticationBuildAttempts 管的是 freshness 查询、CSM 返回 E_BUSY 这类可恢复错误的重建重试,两个参数配混,FV 失步容忍行为就偏离设计预期。这个设计的隐含约束:接收端失步超过截断窗口(8 bit → 256 帧)就再也重建不出正确 FV,合法帧全部验证失败,必须靠同步消息恢复(§10 G5)。

7.4 Crypto Stack 与密钥管理

SecOC 自己不碰密钥,MAC 计算逐层下沉:

职责
SecOC挂在 PduR 侧:Authentic I-PDU 进,Secured I-PDU 出;验证失败状态上报(可送 IdsM 做入侵统计)
CSM(Crypto Service Manager)统一密码服务 API,SecOC 调它算 CMAC
CryIf(Crypto Interface)把 job 路由到具体 driver
Crypto Driver / HSM真正执行 AES;密钥槽在 HSM 内部,明文 key 永不出 HSM

ASIL/CAL 项目的密钥纪律:per-vehicle(至少 per-ECU-pair)密钥,产线 EOL 经安全通道注入 HSM 密钥槽(Infineon AURIX HSM、NXP S32K3 HSE,均 EVITA Full 级)。反面教材是 Toyota RAV4 Prime 的 SecOC 密钥提取(icanhack.nl 公开分析,详见 ISO/SAE 21434 深度):key provisioning 实施缺陷让攻击者从量产 ECU 拿到了密钥——SecOC 的强度上限永远是密钥管理,不是 MAC 位数


8. E2E 和 SecOC 怎么叠加

同一条消息同时要 E2E 和 SecOC 时,包裹顺序是固定的:E2E 先包(RTE 边界,离应用最近),SecOC 后包(PduR 之下,离总线最近)。发送时 E2EXf transformer 先给应用数据加 E2E header,产出的整块数据作为 Authentic I-PDU 交给 SecOC 加 MAC;接收方向反过来,SecOC 先验。

E2E + SecOC 嵌套层叠 — APP 在内 → E2E (CRC + Counter + DataID, ISO 26262) → SecOC (MAC + Freshness, ISO 21434) → PHY 帧 在外

这个顺序保证了两层故障解耦:SecOC 验证失败的帧被直接丢弃,上层 E2E 看到的只是"少了一帧"(loss),由 Counter/timeout 按十类 fault 之一正常处理——SecOC 的任何行为(误拒、密钥失效、FvM 失步)对 E2E 而言都退化成它本来就要防的 loss fault,安全论证不用给 SecOC 分配 safety 需求。这也是为什么 E2E 库按 ASIL D 开发,SecOC 通常按 QM 开发:只要 FFI(freedom from interference)论证清楚"SecOC 最坏只造成丢帧",QM 的 SecOC 不污染 ASIL D 数据流。

8.1 部署判据

E2E 看 ASIL,SecOC 看攻击面(TARA 结论,ISO/SAE 21434 风险评估 + UN R155 威胁目录):

场景配置
网联车 ASIL 消息(VCU ↔ 主驱扭矩链)E2E + SecOC 都要
无外联攻击面的内部 ASIL 消息E2E 即可(TARA 论证攻击可行性低)
非安全但可被注入利用的消息(如车门/灯控)SecOC 即可
OTA 软件包数字签名 + Secure Boot 的范畴,不是 E2E/SecOC(见 ISO 21434 深度)

9. 端到端 worked design —— VCU→主驱扭矩指令(CAN-FD,P05 + SecOC Profile 1)

本节把前八节的机制拼成一条完整设计链:需求分配 → 帧布局 → E2E/SecOC 参数 → FTTI 预算 → 失效注入验收,所有参数可逐项复核。

9.1 需求与平台

场景:VCU 每 10 ms 向主驱逆变器发扭矩指令。Safety Goal 为"避免意外扭矩"(ASIL D),整车 FTTI 50-100 ms(与 转矩安全 口径一致),本例给通信链分配 tFD + 反应 ≤ 100 ms。TARA 判定该消息经蜂窝-网关路径可达,SecOC 必配。平台:两端 MCU 均为 Infineon AURIX TC397(HSM 为 EVITA Full 级,AES-128 硬件引擎),CAN-FD 仲裁段 500 kbit/s、数据段 2 Mbit/s。

9.2 帧布局与总线负载

E2E 选 P05(定长消息、3 字节开销),SecOC 选 Profile 1(24-bit CMAC + 8-bit 截断 FV,4 字节开销),应用数据 8 字节,合计 15 字节,取 CAN-FD DLC=16:

CAN-FD frame, DLC = 16, ID 0x105 (示例)
  [0..1]   E2E CRC-16 (0x1021, 小端, 覆盖 payload + 隐式 DataID 0x0C05)
  [2]      E2E Counter (8-bit, 每帧 +1, 0xFF 后绕回)
  [3..4]   TorqueReq   (int16, 0.1 Nm/LSB → ±3276 Nm 量程)
  [5..6]   TorqueGradLimit (int16, 0.1 Nm/ms/LSB)
  [7]      DriveMode + 状态位
  [8..10]  应用保留
  [11]     SecOC truncated FV  (64-bit FV 的低 8 bit)
  [12..14] SecOC truncated MAC (AES-128 CMAC 的高 24 bit)
  [15]     pad

发送端顺序: E2E_P05Protect() → SecOC (CMAC over DataId|bytes[0..10]|FV64) → CanIf
接收端顺序: SecOC 验证(重建 FV, 失败丢帧) → E2E_P05Check() → E2E_SM → 应用

单帧线上时间估算:仲裁段约 30 bit @ 500 kbit/s = 60 μs,数据段(16 字节数据 + CRC 场 + 控制位,含填充)约 160 bit @ 2 Mbit/s = 80 μs,ACK/EOF 约 30 μs——合计 ≈ 170 μs,100 Hz 下占总线 ≈ 1.7%。对比:同样的保护若留在 CAN classic(8 字节),E2E+SecOC 的 7 字节开销只给应用剩 1 字节,这条消息根本装不下——见 §11 C1。

9.3 E2E 参数与 FTTI 预算

E2E 配置:DataID = 0x0C05(隐式),MaxDeltaCounter = 2(容忍单帧丢失);E2E_SM 配置 WindowSizeValid = 10、MinOkStateValid = 7、MaxErrorStateValid = 2。套 §6 的规范公式:

预算项机制时间
单帧验证SecOC CMAC(HSM 硬件 AES,2 个 block)+ E2E check每帧 μs 级,不进 ms 预算(具体值以 HSM firmware 实测为准)
故障检出 tFDE2E_SM 从 VALID 掉 INVALID≤ 40 ms
反应INVALID → 扭矩指令冻结判定 → 斜坡降扭到 0≤ 40 ms(斜坡由 TorqueGradLimit 域定义)
合计≤ 80 ms < 100 ms

发送端停发(NONEWDATA 路径)的检出由同一窗口覆盖,但走的是另一条转移条件:NONEWDATA 不计入 E2E_SM 的错误计数——PRS_E2E_00466 规定 ErrorCount 只统计 ERROR、OkCount 只统计 OK,其余状态两边都不进。10 ms 周期任务连续读不到新数据时,是窗口里的 OK 帧被 NONEWDATA 挤出、OkCount 跌破 MinOkStateValid 才触发 INVALID:本配置下需 WindowSizeValid − MinOkStateValid + 1 = 4 帧 NONEWDATA(规范时长口径 (10 − 7 + 1) × 10 ms = 40 ms)。所以控制 timeout 检出延迟的参数是 MinOkStateValid 而非 MaxErrorStateValid——想压缩停发检出时间去调 MaxErrorStateValid 是无效的。不需要单独的 timeout 定时器,但周期任务必须无条件调 check(§10 G4)。

9.4 SecOC 参数

FV 64-bit 按 JASPAR 四段划分(一种典型配置,各段长度项目可调):TripCnt 16 bit ‖ ResetCnt 22 bit ‖ MsgCnt 24 bit ‖ ResetFlag 2 bit。截断 FV 8 bit 意味着接收端可容忍 < 256 帧的失步窗口(2.56 s @ 100 Hz),超出必须等 FvM 同步消息(TripCnt/ResetCnt 广播,典型 1 s 周期)恢复;SecOCAuthenticationVerifyAttempts = 2,验证失败帧丢弃并向 IdsM 上报计数。密钥:per-vehicle 128-bit,EOL 注入 TC397 HSM 密钥槽,诊断读不出、软件摸不到。

9.5 失效注入验收(DV)

十类 fault 每类都要有注入用例(restbus 仿真,如 CANoe 故障注入):篡改 payload 单 bit(corruption)、重发旧帧(repetition/replay)、按周期删帧(loss)、换 ID 发同格式帧(masquerade)、Counter 跳变(sequence)、停发(blocking)。验收判据统一:每类 fault 被检出 + 逆变器进入降扭/安全态的总时间 < 100 ms,并留 trace 作为 safety case 的验证证据(ISO 26262-4/-6 验证条款对接)。


10. Gotcha 链(7 条高频工程坑)

这 7 条覆盖 E2E/SecOC 项目量产前后最常见的返工来源——共同规律是"机制都上了,但配置或集成让它没真正起作用"。

G1 — 拿链路层 CRC 当端到端保护:CAN 控制器的 CRC 在每个 Gateway/Router 解包点被剥掉重算,跨段路径上软件层的任何数据损坏它都看不见。E2E CRC 必须由两端应用层(RTE/E2EXf)计算。修法:安全分析里把"链路层 CRC"归为单段机制,端到端 DC 只允许引 E2E。

G2 — 隐式 DataID 配置漂移,现象像总线坏了:P05/P06/P11 的 DataID 不上线,两端信号数据库版本不一致(ECU 单独升级、ID 重分配)时唯一症状是 100% CRC fail——排障常被引向线束/收发器方向,烧掉数天。修法:联调期先查两端 DataID/数据库版本一致性再动示波器;量产 OTA 流程把信号数据库版本纳入兼容性门。

G3 — E2E_SM/MaxDeltaCounter 配置吃穿 FTTI:WindowSizeValid 与 MinOkStateValid 拉太开(想压假阳性)会让 tFD =(WindowSizeValid − MinOkStateValid + 1)× 周期悄悄超出通信链的 FTTI 份额,SPFM 表上 DC 还是漂亮的。修法:E2E_SM 参数必须出现在 FTTI 预算表里正着算(§9.3),不允许只做"稳定性调参"。

G4 — 只处理 ERROR,不处理 NONEWDATA/REPEATED:发送端整体挂死(ISR 卡死、任务饿死)时 CRC/Counter 都不再更新,check 返回的是 NONEWDATA 或 REPEATED 而不是 ERROR——只对 ERROR 分支做 fail-safe 的应用会一直消费最后一帧旧数据修法:按规范用 E2E_SM 的状态(非 VALID 即不可用)做消费判定,不要自己挑 status 枚举分支。

G5 — 截断 FV 失步变成可用性事故:总线风暴、接收 ECU 长时间 bus-off 或休眠唤醒后,本地 FV 落后超过截断窗口(8 bit → 256 帧),重建永远失败,合法帧全部被拒——安全层面表现为持续 loss,整条功能降级。修法:FvM 同步消息周期、VerifyAttempts、唤醒后的 FV 恢复流程要按"最坏失步时长"设计并注入验证;把"SecOC 拒帧率"做成量产监控量。

G6 — 密钥管理毁掉整个 SecOC:全车队共用一把 key、key 存 MCU flash 明文、产线注入通道不设防——任何一条成立,单台车被攻破 = 全车队的 MAC 可伪造(RAV4 Prime 密钥提取是公开案例)。修法:per-vehicle key + HSM 密钥槽 + EOL 安全注入,三者缺一不可;密钥轮换路径在 SOP 前打通。

G7 — Gateway 上 check + 重新 protect,端到端断链:网关把 E2E 校验通过的数据解出来再重新打包保护,看似"每段都有保护",实际网关内部的 RAM/软件错误落在两段之间的裸区——端到端论证不成立。修法:用规范的 Forward 功能(E2E_PXXForward,专为 signal-service translation 设计,可透传 E2E 状态)或让 DataID/保护域全程贯通,不在中途终结保护。


11. Corner 分析(3 条边界)

这 3 条是方案评审和 OEM 安全评估里常被追问、但日常开发容易绕开不想的边界。

C1 — CAN classic 上 E2E + SecOC 装不下:8 字节 payload 里,P11 约 2 字节 + SecOC Profile 1 的 4 字节 = 6 字节开销,应用只剩 2 字节;若消息本身 ≥ 3 字节就无解。实践出路:用 Profile 2(免 FV,省 1 字节但放弃防重放)、把认证信息放到独立 PDU(增加时序耦合与丢帧模式)、或者迁 CAN-FD——SecOC 是很多平台从 CAN classic 迁 CAN-FD 的隐性推手,带宽账要在网络架构定义阶段算,不能等到集成期。

C2 — 截断位数的数学:24-bit MAC 的单帧盲猜成功率是 ;以 100 帧/s 连续注入,期望约 s(近两天不间断攻击)才蒙中一帧,且每次失败都会被 IdsM 计数、接收端不提供任何"猜对了没有"的 oracle 反馈——对在线攻击够用。但要分清:截断保护的是单帧伪造概率,不是密钥;密钥一旦泄露(G6),24 bit 还是 128 bit 都无意义。反方向的取舍是带宽:28-bit MAC(Profile 3)在 CAN 上把 FV 压到 4 bit,失步窗口缩到 16 帧,同步消息要发得更勤。

C3 — safety 要可用,security 要拒绝,两者在拒帧上打架:SecOC 的正确行为(验证失败就丢)对 safety 链是主动制造 loss fault。fail-safe 功能(扭矩链)可以接受"拒帧 → E2E timeout → 降级",但 fail-operational 功能(转向冗余、AEB)不能接受 FV 失步导致的成片拒帧——此时"SecOC 误拒率"本身成为安全指标,FvM 的同步鲁棒性要按 safety 需求(而不只是 security 需求)做 DFA/注入验证。评审时问一句"FV 失步 2.56 s 会发生什么"就能暴露这类设计缺口。


核心要点

  • E2E ≠ SecOC:E2E 防 ISO 26262-6 §D.2.4 的十类偶然/系统性通信 fault,SecOC 防 ISO/SAE 21434 语境的恶意伪造重放;E2E 挡不住会算 CRC 的攻击者,SecOC 挡不住发送端自己的 bug,不能互相替代
  • R23-11 有 14 个 E2E Profile(10 数据 + 4 method):CAN classic 新项目用 P11/P22(P01/P02 是 legacy),CAN-FD 定长 ASIL D 主流是 P05(3 字节开销,DataID 隐式),Ethernet 用 P04/P44/P07/P08(DataID 显式)
  • CRC 多项式有证据链:0x2F = Koopman 0x97(HD=4 至 119 bit),CRC-32P4 0xF4ACFB13 规范明标 HD=6 至 4 KB 且与 P04 的 MaxDataLength 配套;E2E CRC 与链路层 CRC 刻意错开 start/XOR 防共因
  • 隐式 DataID 与显式安全强度等价,取舍在工程性:隐式省带宽但配置漂移时表现为 100% CRC fail(像硬件坏),显式占 4 字节但 trace 可读
  • E2E_SM 才是可用性判定:应用只在 VALID 消费数据;tFD =(WindowSizeValid − MinOkStateValid + 1)× 周期,必须进 FTTI 预算
  • SecOC 标准算法是 AES-128 CMAC(NIST SP 800-38B),三个标准 Profile:24-bit MAC + 8-bit FV(默认)/ 24-bit 无 FV(不防重放)/ JASPAR 28+4;认证输入 = DataId ‖ 数据 ‖ 完整 FV
  • Freshness 是 SecOC 真正的工程难点:JASPAR 四段计数器拼 64-bit FV,线上只传低 8 bit,失步超 256 帧合法帧全拒——同步与恢复路径要按 safety 标准设计
  • 叠加顺序固定:E2E 内(RTE 边界)、SecOC 外(PduR 下);SecOC 一切失效对 E2E 退化为 loss,E2E 库 ASIL D、SecOC 可 QM + FFI
  • worked design 记忆锚:P05 + SecOC Profile 1 在 CAN-FD 16 字节帧里 = 8 字节应用 + 3 字节 E2E + 4 字节 SecOC,100 Hz 占总线 1.7%,tFD 40 ms + 反应 40 ms < FTTI 100 ms
  • 7 Gotcha:链路层 CRC 冒充端到端 / 隐式 DataID 漂移 / SM 参数吃穿 FTTI / 漏处理 NONEWDATA / FV 失步全拒帧 / 密钥管理垮掉全盘 / Gateway 断开端到端

Engineering Objects

引用此页的结构化 Engineeri…

引用此页的结构化 Engineering Object(v2.0 Copilot 自动生成,不要手动编辑此段)。

  • diagnostic · diagnostic_can_bus_health — CAN Bus Health Monitor
  • mechanism · mechanism_e2e_protection — E2E (End-to-End) Protection Profile
  • mechanism · mechanism_secoc — SecOC (Secure Onboard Communication)
  • mitigation · mitigation_can_fail_silent — CAN Fail-Silent Mode
  • mitigation · mitigation_comm_timeout_safe — Communication Timeout Safe State

Cross-references