TMS BOOK · ACADEMY 讲义

网络安全与 OTA 安全基础

大纲的完整展开版——讲师授课蓝本 / 学员自学材料

K2-04 网络安全与 OTA 安全基础

课程代码 K2-04 · 板块 K 控制、软件与标定 / 控制器硬件与安全 时长 约 4.0 小时(7 讲) 前置 K2-02 通信基础;体系外前置(需自备):建议了解 K2-03 功能安全基本概念 本讲义定位 讲师授课蓝本 / 学员自学讲义,是 K2-04 大纲的完整展开版


引言:四份都写着「已经有防护了」的交付物,各自漏掉一整类攻击——而每一份单独看都挑不出毛病

热管理域控接上总线、又通了远程升级之后,最难判的那一类问题,从来不是「有没有做防护」。四个场合最能说明它长什么样。

第一个场合在风险分析的评审桌上。一条关键测量报文——比如送给冷却策略用的电池温度——在攻击路径分析里被点了名。缓解那一栏填的是「该报文已有端到端保护(循环冗余校验+滚动计数)」,据此把这条路径的风险降了一档;评审通过,这条报文没有进入报文认证的名单。⚠ 那张表里没有一个字是假的:端到端保护确实在,滚动计数确实在跳,台架上确实验得过。错的是那一栏所回答的问题——循环冗余校验的对手是线束上的噪声,它是一个公开算法,任何人都能改完报文再原样算一遍;滚动计数是明文的,能读就能续。⇒ 对一个能构造报文的人,这两样加起来是零防护,而它们在分析表上被当成了缓解证据。这条报文从此不会再被任何人复查,因为表格显示它「已缓解」。

第二个场合在方案评审。某车型审出两条互不相干的攻击路径:路径 A 是诊断口的诊断安全访问(Security Access)种子—密钥算法全车系通用、可以从刷写工具里逆向出来,攻击者进入扩展会话之后改写温度阈值标定,甚至直接覆写控制器「看到」的温度输入;路径 B 是有人物理搭线接到内部总线上,直接注入一条伪造的电池温度报文,诱导冷却系统误判。方案里写了一条缓解:「已改为一车一密,并加了失败次数限制」,两条路径的风险一起降了档。⇒ 一车一密确实是路径 A 的正解,而它对路径 B 的缓解基本是零——攻击者根本没走诊断口,他连诊断会话都不需要进。缓解与路径不对位,是这一层最常见、也最不容易在评审现场被看出来的错:两条路径都写着「已缓解」,读起来毫无破绽。

第三个场合在救火的时候。某次灰度放量之后现场出了问题,云端要把旧软件版本重新下发给已经升级的那批车。刷不进去——车端的刷写准入里写着一条判据:「版本号必须比车上这一版更大才准刷」。于是只剩下本地分区切换这一条路,而已经切过分区、或者已经跑过数据结构迁移的那批车救不回来。事后为了让回退能做,有人把防降级这道闸整个关掉了;而这道闸当初立起来,防的正是「把车降级到一个含已知漏洞的旧版本」。⇒ 两个方向相反的动作,同一个根因:三件同名的东西被当成了一件

第四个场合在立项会。「热管理又不联网,也没有个人隐私数据,攻击价值低,威胁分析与风险评估(TARA)可以简做。」⇒ 这句话有两处站不住。其一,本域在影响严重度上并不轻:伪造电池温度可以诱导冷却误判并通向热失控链,误开阀可以把电池过冷,除霜与除雾被关会直接丧失视野,而重放一条远程预热指令是可复现的能量耗尽攻击。其二,也是更要紧的一处——「不直接联网」说的是暴露路径的形状,不是暴露的大小:热管理域控的暴露多数是经由网关与远程通信终端的二跳,⇒ 本域要回答的主问题从来不是「我会不会被直接攻击」,而是「当某个联网件已经被攻破、攻击者已经站在内网上时,我还挡不挡得住」。按第一种问法做出来的分析,会把整门功课判成不必要。

四个场合是四种不同的错,却错在同一个位置:没有人逐条回答「这个机制挡的是谁、挡的是哪一条路径的哪一步、它挡不住的又是什么」。这门课要给的就是这一整套判断,以及把每一条判断落成一件可被别人独立复核的交付物的做法。

本课有两根钉子,从第 1 讲一直敲到第 7 讲。

钉子①:功能安全与网络安全的分界线,画在「对手是谁」上。功能安全的对手是随机硬件失效与系统性缺陷,它服从统计规律,所以可以用失效率、诊断覆盖率这类量去度量、去做定量论证;网络安全的对手是有意图、会学习、会专挑最弱一环的人,世上没有「攻击率」这种可度量的量,能评的只有攻击可行性(所需时间、专业知识、对目标的了解、设备与机会窗口)。由此推出一条全课反复用的判据:一套体系里的机制,⛔ 不得拿来当另一套体系的证据。⇒ 本课每一讲收尾都落回同一个动作:把一句「我们这里已经有 X 了」改写成「X 挡的是谁、挡的是哪一个动作、挡不住的是什么」。

钉子②:每一条缓解都必须钉在具体的「攻击路径 × 这条路径的哪一步」上;说不出它挡的是哪一步,它就不是缓解,只是一个让人安心的功能。这也是 TARA 的产出形态——它交出来的不是一个风险分数,而是一张路径—缓解对应表,表里每一行都能被独立复核。第二个场合里的两条路径正是这张表的原型:路径 A 与路径 B 互不相干,⇒ 换掉诊断凭据对路径 B 基本零缓解;只有当 OBD 座与内部总线之间设有安全网关、且网关的解锁本身要鉴权时,诊断侧的凭据才间接影响注入路径,而此时缓解的主体也是网关的报文过滤策略,不是凭据本身。同一条判据在后面几讲会反复兑现:安全启动挡「本地固件被改」,⛔ 不挡「总线上被伪造的报文」,也 ⛔ 不挡「一个带合法签名的坏包」;传输链路加密挡「链路上被看被改」,⛔ 不挡「源头就是坏包」;入侵检测探测到攻击 ⛔ 不等于挡住了攻击——它产出的是证据,不是缓解。

接下来是本课最容易被读反的一句话,现在就把它摆出来拆开。这句话是:「这条报文已经算了消息认证码(或者:已经带了滚动计数与循环冗余校验),所以它防重放了」。⚠ 它之所以要在引言里点破,是因为读者读反之后会做的两个动作都非常具体、都会落进交付物:① 在风险分析的缓解栏里填上「该报文已有端到端保护/已有认证」,据此把这条攻击路径降档,于是这条报文不进报文认证的名单——正是第一个场合;② 真去做了报文认证,但实现上把新鲜度值明文附在报文里、而不纳入认证码的计算范围——代码跑得通、台架验得过、总线上看得见计数在跳,而抗重放能力等于零

为什么它是反的:认证码回答的是「这串字节是不是持有密钥的那一方产生的、有没有被改过」,它不回答「这是不是现在这一刻发出来的」。攻击者根本不需要密钥——把一条认证码完全正确的合法旧报文原样录下来、原样再发一遍,接收端逐字节校验会完全通过。挡住它的唯一办法,是把「本次、这一刻」这件事也纳入被认证的内容:⇒ MAC_trunc = f_K(DataID ‖ msg ‖ FV),三个成分各挡一件事——DataID 挡「把甲报文的合法认证码搬到乙报文上」,msg 挡篡改,新鲜度值 FV 挡重放。而 FV 一旦不进 f_K 的输入,攻击者就可以拿一条旧的 (msg, MAC) 配上一个新的 FV,认证码照样验得过,那道闸门形同虚设。这一层第 4 讲会正面立成规矩。

同一个失败模式还有第二层:「我们的报文有滚动计数(RollingCounter),所以有抗重放」。滚动计数是功能安全端到端保护里的成分,配它的校验是循环冗余校验——公开算法、无密钥,攻击者改完计数原样重算一遍即可。⇒「有 RollingCounter」⛔ 不等于「有抗重放」,正如「有循环冗余校验」⛔ 不等于「有完整性保护」。★ 判据只有一句:这个防重放的成分,有没有被一把攻击者拿不到的密钥保护住?答不出,就当它不存在。

第三层是升级侧最贵的一条:「版本号必须更大才准刷」被当成通用的刷写准入判据——第三个场合的那句。它会造出两个方向相反的错误动作:写进车端准入 ⇒ 合法的灰度回退被堵死;发现堵死之后把防降级整个关掉 ⇒ 车可以被降级到含已知漏洞的旧版本。★ 正解是把同名不同物的东西分开:这道闸的判据量是安全版本号 SVN(只在修复安全漏洞时递增、单调增、存放在安全存储里),⛔ 不是每次发布都会变的产品版本号;而「回滚」这个词在本课下辖三个不同的东西——失败回滚(断电或传输中断时靠双分区切换、本地自动完成,⛔ 不过下载包的版本比对闸门,因为它并没有在刷一个新包)、授权降级回退(云端重新下发旧版本,需一份单独签名的授权、且受 SVN 约束)、防回滚机制(它就是那道闸本身)。三者混谈,就会写出上面那句判据。第 6 讲会把这两件事并起来讲透。

第四层就是第四个场合那句「攻击价值低,可以简做」,它的两处站不住之处已在上面拆过,⇒ 本课不再重复,只把结论钉在这里:暴露路径的形状 ⛔ 不能替代暴露程度的判断

本课有四组必须当堂消歧的同名异义,全课统一、⛔ 正文一律不写歧义形式,第 1 讲末会给出完整的约定表(含定义、单位与所属讲次),这里先把名字摆出来,免得你在前几段就读岔:①「安全」——功能安全(safety)与网络安全(security)是两套体系,⛔ 全课禁止裸写「安全」二字去指代其中任何一个;②「新鲜度」——K2-02 CAN/LIN/CAN-FD 通信与整车 EEA 集成 的信号年龄 age(单位 s,判的是数据陈不陈旧)与本课的新鲜度值 FV(计数或时基,判的是报文是不是被重放),两者名字相同、量纲不同、用途不同,⇒ 本课一律写全「新鲜度值 FV」;③「回滚」三义(失败回滚/授权降级回退/防回滚机制),⛔ 禁止裸写;④ 符号 K——本课 f_K 里的 K 是密钥,与 K7-02 软件定义热管理与 OTA 迭代 限幅式里作为标定参数的 K 不是同一个量,⇒ 本课凡引到那一侧一律改述,⛔ 不许同页出现两个 K。⚠ 还有一处要提前说明:风险分析里影响严重度的四类中,第一类在本课程体系中常被简写成「安全」,本讲义为免与上面那两个「安全」撞名,一律写作「安全(人身伤害)」类,括号 ⛔ 不省。

本课对数字有三条固定处理,先声明在这里,免得读到正文时以为是漏写。

第一类,可以给准确值的,只有协议定义的容量事实与位阶关系。前者只有一项:经典 CAN 的数据场上限为 8 字节(64 位)、CAN-FD 的数据场上限为 64 字节(来源为 CAN 的数据链路层与物理信令标准 ISO 11898-1,⚠ 版次与年份一律「以现行目录为准,引用前须核」;帧结构、位填充与最坏占用位数的本体在 K2-02 CAN/LIN/CAN-FD 通信与整车 EEA 集成,本课只引不重推)。这一项之所以要给,是因为它是本课唯一一道可以手算的判据的输入。后者是几条不带条款内容的位阶关系,见下文标准写法。⚠ 本课各处的枚举计数(资产载体七类与属性六项、入口七类加一条贯穿维度、通信侧威胁动作八类、防护机制八类、升级链路九段、密钥生命周期六段、生命周期七段、交叉点六格、事件响应五段),是本课自己组织出来的结构,⛔ 不是对外部世界的测量,也 ⛔ 不是任何标准的分类号;每一处都会标明它是本课程体系已给的,还是本课归纳的。

第二类,行业典型区间,本课几乎用不到——本课要判的量基本都随平台、总线与功能而变。⚠ 尤其是截断认证码长度与新鲜度低位位数:本课⛔ 不给位数区间(未取到相应规范原文),只给约束式;受保护报文在全部报文中的占比同样 ⛔ 不给,⇒ 因为给了比例它就会被当成配额去凑,而凑出来的名单回答不了「去掉这一条,哪条路径会敞开」这个问题。

第三类,平台相关量一律不给数,本课有十二组:①加装报文认证之后本域总线负载率的增量与②本域现有的负载余量;③认证引入的端到端处理时延;④新鲜度值的接收窗口宽度与重同步周期;⑤诊断安全访问的尝试次数上限与锁定时长;⑥车云下行远控指令的时效窗口与幂等窗口;⑦安全启动引入的上电时间增量;⑧车端入侵检测的告警阈值与可接受误报率;⑨密钥轮换周期、证书有效期与授权凭据有效期;⑩受保护报文的条数与具体选择;⑪安全日志的容量、保存时长与上报带宽预算;⑫本域在四类影响严重度上的取值。这些一律写成「取决于⋯⋯,须按本项目实测或核算标定」,⚠ 这是合格答案,不是漏写;⛔ 一概禁止抄上一代平台。⚠ 另有一条纪律要连带记住:负载余量与处理时延是安全方案的选型输入,⛔ 不是验收输出——先看余量再定保护范围,⛔ 不许方案定死之后回头看放不放得下。⚠ 凡本课为讲清机理而代入的数(示例报文的数据长度、示例位数分配等),一律是教学假设值,不对应任何平台与任何型号,正文与图注都会写明,⛔ 禁止照抄取用。

本课凡是要「列一张表」的地方,一律先把全集画出来、写明是沿什么轴建的集,再逐格核射程,而不是顺着自己最熟的那条线索往下数。这不是讲究:沿单一线索枚举时漏掉的从来不是「少了一条」,而是整整一类不出现,而表面上那张表还是齐的。全课有七处这样的全集:

全集 建集的轴 最容易整类漏掉的那一格
一 · 资产 载体 × 受保护属性(二维) 密钥与证书等信任根材料(它根本不是一个接口);车端持久化数据与日志
二 · 攻击面(入口) 攻击者要到达资产必须经过的接口 本地物理接口;可移动介质与服务工具;云端与后台系统
三 · 通信侧威胁动作 攻击者能对一条报文做的动作 整张表——它与功能安全的通信失效模型形态几乎相同,于是被整体误判为「已经覆盖过了」
四 · 防护机制 它挡在攻击链的哪一步 组织与流程整整一类(它在代码与电路图上都不出现);密钥生命周期里「使用」以外的那一半
五 · 升级链路环节 从签发前到生效之后逐段串 两头都漏:签发之前、生效之后
六 · 生命周期阶段 从概念到报废逐段串 换主与二手车;停产后的维护期;报废与拆解(⚠ 这三段是本课补的,见 7.7;产线写入那一段整段不出现的问题在密钥生命周期那一侧,见 5.7)
七 · 两套体系的交叉点 它们在哪些地方必须同时成立 认证失败时的处置分歧;两套度量不可互推

⚠ 表里第一列的编号只是本讲义的行文顺序,⛔ 不是任何标准的分类号。举三个已经踩实的例子说明它为什么值得这么麻烦。其一,资产若沿「车上看得见的接口」往下数,必然漏掉密钥材料(它不是接口)与安全日志(它不在控制通路上、丢了车照跑)——而后者是网络安全事件响应唯一的证据链,被篡改或被静默覆盖就丧失取证能力。其二,防护机制若按「硬件的/软件的」分,会整类漏掉组织与流程那一层,而型式认证要看的证据恰恰主要落在那一层。其三,攻击者能力若只按「远程/本地」两分,会漏掉长期占有这一档——车主本人、二手车买家、拆解件;解锁性能、改除霜与热保护策略、绕过里程与保修判定,动机真实存在,而他有的是时间和物理占有。

本课有一批判据是本课归纳的,⛔ 不是任何标准、手册或行业公认的既有分类,引用时请连同这句一起带走:本域的诉求排序是真实性/新鲜度(时效)/可用性 ≫ 机密性(电池温度不是秘密,伪造它才是问题——这条直接解释了为什么车上主流做法是给报文加认证码而不是加密,也解释了为什么「我们做了加密」填不进「防篡改」那一栏);入口全集里补的本地物理接口、可移动介质与服务工具、云端与后台系统三类;「供应链是一条贯穿维度而不是并列的一类入口」这条性质;攻击者能力的三档划分;生命周期里补的换主与二手车、停产后的维护期、报废与拆解三段(⚠ 以 7.7 为准;产线写入那一段 ⛔ 不在这三段之内,它是密钥生命周期六段里的「注入」,见 5.7);两套体系六格交叉点的建集及其中「认证失败时两条并行处置、⛔ 不合并成同一个标志位」这条正解;以及「本域的暴露是二跳」这条形状判断。

本课涉及的外部规范,一律只写标准号与去向,⛔ 不写条款内容、⛔ 不写限值与等级号、⛔ 不写分档评分表、⛔ 不写实施日期。ISO/SAE 21434 是工程过程标准(组织怎么管、项目怎么做、供应链怎么分责),⛔ 它不是任何市场的型式批准凭证,本课只取它的方法骨架与位阶关系;攻击可行性各要素的分档、风险组合矩阵与保障等级的分级方法,本课未取到原文,⛔ 一律不写。UN R155/R156 与它们要求的网络安全管理体系(CSMS)、软件更新管理体系(SUMS)证书,本课只写一条位阶关系:证书是型式批准的前提条件(无证书不受理申请),⛔ 有效期、监督周期、换证与附件条款一概不写。中国对应的强制性国标是 GB 44495(整车信息安全)与 GB 44496(软件升级),本课只给两条性质事实:它们是强制性的,且分别对应两个不同的对象(⇒「过了其中一项就等于软件升级也过了」是判档错误的起点);⚠ 发布与分档实施的时点一律不写,请按现行目录与修改单原文核——⛔ 本课一个具体日期都不给。诊断服务标识按 ISO 14229 的现行版本核,本课只按名点到「诊断安全访问/写数据标识/输入输出控制/例程控制」这几类动作,⛔ 不写子功能、参数格式、否定响应码与会话定时。⚠ 以上各标准的版次与年份,正文统一附「以现行目录为准,引用前须核」。

全课七讲,顺序就是把一条抱怨或一个疑问走成一张可被独立复核的路径—缓解对应表的顺序。

第 1 讲 分界与方法:把两套体系按失效模型分开(钉子①),把 ISO/SAE 21434 的位阶摆正;讲 TARA 的五个环节及其顺序不可跳(不先定资产就定不出损害,不先画路径就评不出可行性),讲清「风险 = 攻击可行性 × 影响严重度」是定性组合(查表)不是算术相乘——当成乘法会造出一个不存在的中间数,并据此排序;再讲本域的「安全(人身伤害)」类为什么不为零、CAN 的三条先天弱点各自催生哪一种攻击动作、以及二跳暴露这条形状;最后交出全课通用的术语与符号约定表。

第 2 讲 资产、攻击面与威胁动作三个全集:用载体 × 受保护属性二维法建资产集,点出两类最容易被整类漏掉的资产;讲清标定参数为什么是本域性价比最高的攻击目标(改一个数就改物理行为、改动量小到日常不可察觉、且它本来就有合法的写入通路);建七类入口的攻击面全集并说明供应链为什么是贯穿维度而 ⛔ 不是其中的第八类;把云端签发系统被攻破立为签名机制的射程边界(它发出来的是带合法签名的坏包,⛔ 车端任何验签都判不出);把通信侧八类威胁动作与功能安全那张形态相同的表并排对照;最后讲为什么只做黑盒渗透会漏掉两整类。

第 3 讲 入口侧的第一道缓解:安全网关(诊断防火墙)的三条职责,与两种让它等于不存在的失效形态;「诊断安全访问不是总线门禁」这条判据;它要成立必须同时满足的四条工程要求;诊断侧最该被限权的三类动作,尤其是覆写输入那一类——它能让控制器「看到」一个假温度,而不改任何标定、不发任何伪造报文,⇒ 最容易被漏;再讲车云下行远控链路(入口全集里的第四类 ④,也是本讲要讲的第三条入口)的四段与逐段三问,以及为什么时效窗口是必需项不是优化项;最后立撤销通路——⛔ 只发不撤的授权体系等于一批永久后门。

第 4 讲 报文认证与抗重放:消息认证码成立的三个前提(⚠ 其中「双方对 msg 到底是哪些字节有完全一致的定义」最容易出错,现场表现却像「密钥不对」);三成分各挡一件事的完整构成;上面那条新鲜度值必须进入认证码计算范围的规矩,以及滚动计数为什么不算;计数器型与时间型两种形态的代价;失同步与重同步的四问(★ 含一个鸡生蛋的坑);失同步期间放行还是丢弃——两套体系的第一个真实冲突点,必须逐信号写死;截断长度的容量硬约束与负载率重算;哪些报文该加,判据是「伪造它能造成什么」而不是「它重不重要」;最后讲接收端合理性校验为什么是补充不是替代。

第 5 讲 信任根、安全启动与密钥管理:信任根是一条链,链的起点必须落在不可改写的硬件里;硬件安全模块与安全元件提供的三样东西(⛔ 不只是加密加速,少了受保护的密钥存储那一样,密钥就躺在主核可读的内存里);安全启动的三条射程线;安全存储保护的静态资产,以及防回滚计数器为什么必须单调增;密钥按生命周期六段建集(★ 产线注入才是信任根真正的起点);一车一密解决的是横向扩散;对称与非对称在车上的分工判据;调试口处置为什么是信任根的一部分(⛔「我们会记得关」不是机制);最后是安全启动的上电时间代价与三种折中各自的射程。

第 6 讲 升级链路:按九段建集并逐段追问「上一段给出的保证,在这一段还成不成立」;传输链路加密 ⛔ 不等于固件真实性;签名验证的三问(验谁的签名、验什么范围、什么时候验);SVN 与产品版本号的分家;三种「回滚」各受哪道闸管;授权降级要同时成立的三条;差分包的双端校验,以及标定集为什么必须整块原子替换——半套参数每一个单独看都在合法范围内,范围检查天然抓不到;刷写期间的访问控制(两套体系的第二个真实冲突点);最后立「生效是一道独立的闸,校验通过 ⛔ 不等于已生效」。

第 7 讲 网络安全运营、响应与准入:入侵检测在车上探测什么、以及它⛔ 不阻断(产出是证据与告警,不是缓解);车端与云端的分工与四条现实约束;漏洞管理的五类输入(⛔ 只数「我们自己测出来的」必漏时效性最强的两类);事件响应五段与热管理侧要预先备好的三样;认证失败时的两条并行处置——两套体系分歧最尖锐的一处,⛔ 不合并成同一个标志位(合并之后,一次持续攻击会被功能安全的自愈与去抖逻辑平滑成「偶发通信抖动」而无人知晓);两套度量为什么不可互推;退役与二手车这一格;最后是型式认证准入链的位阶与去向,以及「合规不是额外的文档工作,它决定的是前六讲产物的证据形态」。其后的典型案例把两条互不相干的攻击路径与各自的缓解摆成一张完整的对应表,动手做则用三小题把四条学习目标各自验收一遍。

最后把边界摆出来,写清楚是为了让你知道哪些东西不在这里找——本课对它们一律只给类型与去向,⛔ 不给限值、⛔ 不给等级号、⛔ 不给条款内容:总线协议本体、帧结构与负载率算式、通信矩阵与失效语义在 K2-02 CAN/LIN/CAN-FD 通信与整车 EEA 集成;诊断服务分层、故障码与去抖在 K5-01 OBD/UDS 诊断与故障码(DTC)设计;功能安全的危害分析、等级与故障容错时间间隔、共因失效清单在 K2-03 功能安全(ISO 26262)在热管理中的应用;预期功能安全与模型可信域的论证方法在 K2-05 预期功能安全(SOTIF/ISO 21448)与 AI 件安全论证在热管理的落法;信号合理性校验的方法本体在 K1-01 热管理传感器信号处理与故障诊断;软件版本与配置管理、发布件构成与依赖清单基线在 K4-04 软件版本、配置与变量管理;双分区机制本体、刷写窗口的热安全准入与执行器状态约束、灰度放量的节奏与触发授权降级回退的门限(⚠ 三义中的第二义,⛔ 不是失败回滚)、差分包体积与刷写时间的权衡在 K7-02 软件定义热管理与 OTA 迭代;采集口径与带宽存储预算在 K7-04 车队数据回流的车端实现:信号表定义、事件抓帧与带宽/存储预算;型式批准与备案的判定规则、办理路径、证书有效期与召回联动在 M4-08 车用软件更新的准入与合规(R155/R156·GB 44495/44496·OTA 备案与召回)

⇒ 于是本课自己承担的只有七块,正好对应七讲: 两套体系的分界判据与 TARA 的方法与产出形态; 资产、攻击面与威胁动作三个全集的建集方法与结果; 入口侧第一道缓解的设计与失效形态; 报文认证与抗重放的完整构成及其工程代价; 信任根、安全启动与密钥全生命周期; 升级链路「包对不对、能不能刷」这一层的密码学闸门与版本语义; 运营、响应与准入链的定位。本课能给你的不是一份能直接抄的方案模板,是那一整套「这条缓解算不算数、它挡的到底是哪一步」的判据——学扎实之后,上面那些相邻课你会用同一副眼光去读。

第 1 讲 两套体系的分界:功能安全给得出的证据,网络安全给不出来

这门课的第一件事不是列攻击手段,而是把一条线画清楚:网络安全与功能安全的分界,不在「哪一套更严」,而在两者的对手根本不是同一种东西。这条线一旦画歪,后面每一讲都会歪——你会拿着一套为噪声设计的机制去应付一个会思考的人,而且所有的评审记录都显示「我们已经做了」。所以本讲先把分界、方法与本域的暴露形状交代清楚,再在最后钉死四组最容易读混的术语。读完本讲,你应该能做三件事:说出两套体系各自的度量与证据形态、说出威胁分析与风险评估(TARA)交出来的产出物长什么样、以及判断一条「我们这里已经有 X 了」到底算不算一条缓解。

1.1 分界不在「哪个更严」,而在失效模型

两套体系问的是两个不同的问题。功能安全问的是:它会不会自己坏、坏了会怎样、我能不能查出来;网络安全问的是:有人想搞它的时候能不能得手、得手要花多大代价

问题不同,能拿出来的证据形态就完全不同。功能安全的对象是随机硬件失效与系统性缺陷——随机失效服从统计规律,所以可以用失效率、诊断覆盖率这类量做定量论证,一个数摆在那里,评审可以核。网络安全的对象是有意图、会学习、会挑最弱一环的攻击者:他不服从任何分布,他不会平均地攻击你的每一条路径,他会专挑你没设防的那一步。世上没有「攻击率」这种可度量的量,所以这一侧只能评攻击可行性——它是一个定性量,由四个要素撑起来:所需时间专业知识对目标的了解设备与机会窗口。与它配对的是影响严重度的四类:安全(人身伤害)财务运营隐私(⚠ 第一类的括注全课一律写「人身伤害」、⛔ 不省括号,见引言的钉死;车辆本身的损坏 ⛔ 不计入第一类,它落在「财务」与「运营」两类)。

⚠ 本课只给这四个要素与四类影响的名称。它们各自的分档规则、分值与组合方式属于 ISO/SAE 21434 的附录内容,本课未取到原文 ⇒ 只写去向,⛔ 不写任何档位、分值或等级号;版次与年份一律以现行目录为准、引用前须核。

由这条分界推出本课反复要用的一条判据:一套体系里的机制,⛔ 不得拿来当另一套体系的证据。

最典型的违反形态就在通信上。一条报文带了循环冗余校验(CRC)与滚动计数——这是功能安全端到端保护的成分,它对付的是信道噪声导致的随机位翻转,在那个语境里它是充分的。但换一个对手:校验算法是公开的,攻击者改完数据原样重算一遍即可;滚动计数在总线上是明文,可读、可续。⇒ 对一个能构造报文的人,这两样加起来是零防护。⛔ 所以「这条报文已经有端到端保护了」这句话不能填进网络安全侧的缓解栏——它答的不是同一个问题。这条错话的完整形态与它会让人做出的两个具体错误动作,第 4 讲会正面拆开。

图1 功能安全与网络安全两栏对照示意图:左右各一条自上而下的四格判据链,逐行标出失效对象、度量、典型机制、证据形态,两栏之间的四条连线上各压一个禁止符号,图底一条横带写出互套后果的具体例。本图为示意,⛔ 不得据图取值。
图1 两套体系的分界画在失效模型上——从图上逐行读出:对手不同、度量不同、机制不同、证据形态也不同,因此任何一行都⛔ 不能横着搬到对面去当证据;图上没有任何一条把左右两栏接通的实线。本图为概念对照示意,无坐标轴、无量纲,⛔ 不得据图取值。

这一讲往后每一节的收尾动作都是同一个:把一句「我们这里已经有 X 了」,改写成「X 挡的是谁、挡的是哪一个动作、挡不住的是什么」。改不出来的,那就不是一条缓解。

1.2 ISO/SAE 21434 是工程过程标准,⛔ 不是任何市场的准入凭证

这是位阶层面最常见的一处混淆:把过程标准证书放进同一栏。

ISO/SAE 21434 给的是工程过程要求——组织怎么管、项目怎么做、供应链怎么分责。它是可以作为体系审核输入的东西,它本身不是任何市场的型式批准凭证。而网络安全管理体系(CSMS)回答的是另一个问题:这个组织有没有能力持续管住网络安全;它的证书由主管机关或技术服务机构签发。两者的签发主体不同、举证形态也不同:一边是「我们的流程符合这套要求」,一边是「有人给我们发了一张证」。

⇒ 读者最常见的那句「我们按 21434 做了,所以合规了」是错的。过程符合性只能当体系审核的输入,⛔ 不能替代证书。

位阶关系本身可以给一条:CSMS 证书与软件升级管理体系(SUMS)证书是型式批准的前提条件——无证书不受理申请。国内对应的是两件强制性国标:GB 44495(整车信息安全)与 GB 44496(软件升级)。⚠ 请注意这是两个不同的对象,⛔ 不是一件事的两个名字——「过了 44495 就等于软件升级也过了」正是判档错误最常见的起点。

⛔ 本课在标准这一层只写到上面这些位阶关系为止:不写条款内容、不写网络安全保障等级的分级方法、不写评分表;发布与分档实施的时点一个具体日期都不写,须按现行目录与修改单原文核。适用性判档、证书申请流程、备案口径与召回联动,全部归 M4-08 车用软件更新的准入与合规(R155/R156·GB 44495/44496·OTA 备案与召回);本课第 7 讲只把这条准入链的概览与定位收口一次。

1.3 TARA 的环节顺序⛔ 不可跳,它的产出不是一个分数

威胁分析与风险评估(TARA)的环节顺序是固定的五步:资产识别 → 损害场景 → 威胁场景 → 攻击路径 → 攻击可行性与风险确定。每一步的输出物都是一张可核对的清单:资产清单、损害清单、威胁清单、路径图、风险判定。

顺序为什么不可跳,理由很直白:不先定资产,就定不出损害——你说不出「坏的是什么」,就说不出「坏了会怎样」;不先画路径,就评不出可行性——攻击可行性评的是「沿这条路径走一趟要花多少时间、需要什么设备与什么机会窗口」,没有路径,那四个要素无处安放。

这套方法最常见的退化形态,就是跳过前面的环节直接给一个分数。分数没有可复核的依据,评审时只能靠资历争论谁的判断更对。而 TARA 真正的产出物是一张路径—缓解对应表:表里每一行都能被单独质疑、单独验证——「这条路径你说被挡住了,挡在哪一步?」是一个可以当场核的问题,「这个域控风险等级为什么是这一档」不是。

⚠ 还有一条容易被忽略的:TARA 不是一次性的文档动作。它的输入会变——资产会增、接口会改、软件版本会升、供应链构成会换供应商。所以它必须挂在变更管理上,否则第一版签发之后就再没有更新过,而车却一直在变。这条与 K4-04 软件版本、配置与变量管理 的变更影响分析同源,本课只写到「必须有这个接口」为止。

图2 威胁分析与风险评估五环节链示意图:资产识别、损害场景、威胁场景、攻击路径、攻击可行性与风险确定自左向右排开,每个环节下方挂一个输出物框,链上四处反向箭头各打叉,链末接一张三列表头示意而非分数框。本图为示意,⛔ 不得据图取值。
图2 从图上读出两条判断:① 五个环节是有向的,⛔ 不能从中间开始,跳过哪一步就丢掉哪一步的依据;② 这套方法交出来的是一张可逐行独立复核的路径—缓解对应表,⛔ 不是一个分数。本图为概念流程示意,无时间轴、无量纲,表体三行刻意留空由本项目填写,⛔ 不给任何风险等级号、分值或分档规则,⛔ 不得据图取值。

1.4 「风险 = 攻击可行性 × 影响严重度」是查表,⛔ 不是算术相乘

这个式子写成乘号,但它是定性组合:两个定性分档的量按附表组合成一个风险等级,中间⛔ 不存在一个可以比大小的乘积

查表意味着两件事:离散非线性。两个参数各降一档,未必换来风险等级降一级;而某些组合会一次跨两级。把它当乘法去理解,会造出两种后果,且第二种更贵:

  • 第一种是造出一个不存在的中间数,然后拿这个数给全域控的风险排序——那个数在方法里根本没有定义;
  • 第二种是论证造假的入口:一旦人相信它是乘积,就会去挑「哪个参数最容易降」下手。攻击可行性看起来比影响严重度好动手(多写两句「需要专用设备」「需要长时间物理占有」,可行性就低了),于是所有的努力都花在把可行性论证得更低,而不是花在真的加一道闸上。风险等级降了,车没变。

⚠ 另一个同源的易错点:拿一个「平均风险」去描述整个域控。风险是危害/损害场景的属性——「伪造电池温度诱导冷却误判」有一个风险,「诊断口越权改标定」有另一个风险,一个域控没有「平均风险」这回事。这与 K2-03 功能安全(ISO 26262)在热管理中的应用 里「等级是危害事件的属性、不是零件的属性」是同一条判据在两套体系里的两次落地,形态完全一样。

⛔ 组合表里的具体格子本课不写(未取到原文,只写去向)。本课能给你的是这个式子的性质判断:它是定性组合式,不是精确数值相乘——这一条本身就足以挡住上面两种错误动作。

1.5 热管理域的「安全」这一格不为零,这是本域最容易被整体评低的地方

在四类影响里,热管理域主要落在「安全(人身伤害)」「运营」两类,「隐私」这一类在本域通常很弱,财务居中。

这一格最常被填成零,理由听起来也很顺:「热管理又不联网、又没有个人数据,攻击价值低」。但把这一格的典型落点摆出来就会发现它不为零:

  • 伪造电池温度可以诱导冷却误判——温度被报低,冷却不介入,这条链的终点是热失控;
  • 误开阀可以把电池过冷,低温下的可用功率与充电能力都被吃掉,极端情形还会牵出析锂这类不可逆损伤;
  • 除霜与除雾被关掉是最直接的一条:它不经过任何中间环节,直接丧失视野。

按引言钉死的括注口径,这三条要再分一次。第一类只收人身伤害那一层后果:伪造电池温度那一条的终点是热失控、除霜除雾那一条的终点是丧失视野,两条都直接落在第一类。而误开阀导致的过冷本身——可用功率与充电能力被吃掉、析锂这类车辆的不可逆损伤——⛔ 不计入第一类,它落在「财务」与「运营」两类;⚠ 但若过冷继续发展到析锂之后的内短路与热失控,那条链的终点仍然回到第一类。⇒ 判据是看这条链的终点有没有落在人身伤害上,⛔ 不是看它有没有损坏车辆。★ 这一分不是文字游戏:把车辆损坏一并塞进第一类,会让「第一类不为零」这个真结论建立在一个错口径上,评审只要指出「这是财务损失不是人身伤害」,整条论证就一起被推翻。

⚠ 这一格填零的后果会一路传导下去,而且传导得非常快:严重度低 ⇒ 风险低 ⇒ 不做缓解 ⇒ 这条攻击路径上一道闸都不设。四步之后,你已经把一条真实存在的路径从工程范围里删掉了,而删除动作发生在第一张表的一个格子里,事后没人会回头看它。

⛔ 本课不给任何评分数字——分档规则与组合表属于未取到原文的内容,且具体取值取决于本项目的整车架构与场景库。本课能给的是上面这组定性对应

★ 由这一格再往下推,可以得到一条本课归纳的本域特征(⛔ 它不是既有分类,用之前请按本项目复核):热管理域的诉求排序是 真实性 / 新鲜度(时效)/ 可用性 ≫ 机密性。理由就在上面那三条落点里——电池温度不是秘密,伪造它才是问题

这条排序解释了两件后面会反复用到的事:其一,车上主流做法是给关键报文加认证码而不是加密——加密解决的是「别人看得见」,而本域真正怕的是「别人写得进」;其二,「我们做了加密」这句话⛔ 不能填进「防篡改」那一栏,它挡的不是这一类动作。⚠ 这里的「新鲜度」说的是资产的受保护属性;作为一个具体的量时,本课一律写全为「新鲜度值 FV」,见 1.9。资产与受保护属性的完整二维建集在第 2 讲。

1.6 CAN 的三条先天弱点,各自催生一种不同的攻击动作

CAN 的弱点常被笼统地说成「不安全」,那句话没有可操作性。把它拆成三条,并且each 条对上它催生的攻击动作,才知道加一条缓解能消掉哪一类、消不掉哪一类:

先天弱点 它意味着什么 催生的攻击动作
无发送方认证 标识符只说「这是哪一类报文」,⛔ 不说「这是谁发的」 伪装(冒充发送方)
无带密钥的完整性保护 循环冗余校验是公开算法,改完数据原样重算即可 篡改与注入
广播式,且任一节点可发任意标识符 总线上的每一帧对每个节点都可见、都可发 窃听与拒绝服务

⚠ 这三条是协议设计年代的产物——那个年代的威胁模型里根本没有「攻击者」这一项,设计目标是在电磁环境恶劣的车上把数据可靠地送到。所以它们不是实现缺陷:⛔ 靠配置、标定、换供应商或换一款收发器都改不掉,只能在协议之上另加一层。

第二条要单独说一句,因为它是本课最高发的误读源:循环冗余校验挡的是信道噪声导致的随机位翻转。它没有密钥,任何人都能算——攻击者把数据改成他要的样子,再把校验值重算一遍写回去,接收端会完全通过。⇒ ⛔ 不得把「CAN 有循环冗余校验」当作完整性保护;同理,⛔ 也不得把「总线上有错误计数与总线关闭机制」当成网络安全机制——那一整套的对手同样是噪声与硬件故障。

⚠ 还有一个反方向的易错点:把 LIN 与车载以太的弱点当成与 CAN 相同的一套。它们的威胁面与可用机制并不一样(可用的保护层次、寻址方式、拓扑与谁能听到谁,都不同)。本课只在 CAN 上把机理讲透,其余总线只给类型与去向,⛔ 不做搬运。

CAN 的帧结构、错误界定、位填充这些本体在 K2-02 CAN/LIN/CAN-FD 通信与整车 EEA 集成,本课只引不重讲;引用协议事实时按 ISO 11898-1 现行版本核(版次与年份以现行目录为准)。

图3 CAN 数据帧字段条示意图:仲裁场(标识符)、控制场、数据场、循环冗余校验场、应答场依次排开,字段只给名称与相对次序;字段条下方三条引线各指向一个弱点框与它催生的攻击动作,图右一个加粗提示框写出「有循环冗余校验 ≠ 有完整性保护」。本图为示意,⛔ 不得据图取值。
图3 要在帧上读出的那个判断是:这条帧里没有任何一个字段绑定发送方身份——标识符只说这是哪一类报文,⛔ 不说这是谁发的;三条弱点与三种攻击动作一一对应、⛔ 不交叉连线。本图为示意,字段条只给名称与相对次序,⛔ 不给位数与帧结构细节,⛔ 不得据图取值或按格宽推断任何字段长度。

1.7 本域的暴露形状是「二跳」:主问题不是会不会被打,而是被打进内网之后挡不挡得住

把攻击路径画完整之后会看到一个稳定的形状:打到热管理域控的路径,几乎都要先经过一个联网件——远程通信终端、信息娱乐主机、网关。热管理域控多数不直接连外网,它往往不是攻击的第一落点,而是第二落点。这就是「二跳」。

⚠ 这个形状是本课归纳的一条路径判断(⛔ 它不是既有分类;具体到某个平台,暴露形状要按该平台的电子电气架构重画)。⛔ 本课不给「多少比例的攻击经由二跳」这类数字——没有可核来源,给了就是编。

它值钱的地方在于:它直接决定缓解的选型

  • 如果你假设「内网是可信的」,那么把边界守住就够了——网关、端口关闭、诊断防火墙,做完可以收工;
  • 一旦你承认「内网可能已经被攻破」,边界防护就只挡住了第一跳,而本域的威胁从第二跳才开始。这时报文级认证就不是可选项,因为攻击者已经站在你的总线上,他发出来的帧在物理层与链路层上和真的一模一样。

⇒ 这也是本课把安全板载通信单独拿出一讲(第 4 讲)来讲的理由:它不是一个「有余力就加」的增强项,而是二跳这个形状逼出来的必需项。

⇒ 因此本域做 TARA 时,要回答的主问题从来不是「我会不会被直接攻击」,而是:当某个联网件已经被攻破、攻击者已经在内网上时,我还挡不挡得住

⚠ 这里有一个听起来很有道理的错误对策:拿「我们域控没有对外接口」当作不做报文认证的理由。那句话本身是对的——域控确实没有对外接口。但它回答的不是同一个问题:没有对外接口说的是「我不是第一落点」,而报文认证要防的是「第二落点」。这正是本课钉子②的形态——说不清它挡的是哪一步。

图4 热管理域控暴露路径三层拓扑示意图:外层为车外无线与车云链路,中层为联网件与网关,内层为内部总线与热管理域控及其执行器;一条加粗箭头自外向内穿过并标出第一跳「攻破一个联网件」与第二跳「从内部总线打热管理域控」。本图为示意,⛔ 不得据图取值。
图4 要读出的判断是:边界防护挡的是第一跳,而本域的威胁从第二跳开始 ⇒ ⛔ 不能只靠边界防护,报文级认证不是可选项。层次划分与「二跳」这一路径形状是本课归纳的判断。本图为示意,⛔ 不代表任何具体车型的电子电气架构,⛔ 不得据图推断节点数、总线段数或连接关系,⛔ 不得据图取值。

1.8 每一条缓解都必须钉在「哪一条路径的哪一步」上

上面几节的判据,最后都收在同一张表上。路径—缓解对应表至少要有四列:

  1. 路径标识——这是哪一条攻击路径;
  2. 被挡的那一步——这条路径由若干步组成,这条缓解切断的是其中哪一步;
  3. 缓解措施——具体是什么机制;
  4. 它挡不住的是什么——残余风险的去处。

图 2 里画的是最小表头三列。真正落地时必须补上第四列,因为它是最容易被省掉、也最要紧的一列:钉子②的全部内容都在它上面。没有第四列,评审就退化成比谁列的措施多;有了第四列,每一行都能被独立质疑——「你说它挡不住 A,那 A 归谁管?」这是一个有答案的问题。

反过来说:说不出它挡的是哪一步的,就不是一条缓解,只是一个让人安心的功能。

本课的案例正好给了一个现成的反例,两条路径互不相干:路径 A 是从诊断口越权改写标定,路径 B 是物理接入内部总线注入伪造的电池温度报文。把诊断侧的凭据换成一车一密、提高算法强度、限制尝试次数并加失败延时——这些对路径 A 是实打实的缓解,但对路径 B 基本零缓解:攻击者根本没走诊断口,他直接接在总线上。⇒ 把「已换一车一密」填进路径 B 的缓解栏,就是一条假缓解;表看起来更满了,路径一点没窄。

⚠ 唯一让诊断侧凭据间接影响路径 B 的情形是:OBD 座与内部总线之间设有安全网关,且网关解锁本身要鉴权。⚠ 但即使在这种情形下,缓解的主体也是网关的报文过滤策略,而不是凭据本身——第 2 列该填的是「网关拦下了任意应用帧」,不是「凭据换了」。这两条路径的完整拆解与各自的缓解,在本课典型案例详解节里逐行给出。

⛔ 表里不写风险接受准则(多低算可以接受、谁来签字)——那属于组织决策与体系文件,去向 M4-08 车用软件更新的准入与合规(R155/R156·GB 44495/44496·OTA 备案与召回)。本课给的是这张表的列定义与填法

1.9 本课的术语约定:四组同名异义,全课兑现

本课与相邻课之间有四组词,表面读数一模一样、含义完全不同。它们在这里钉死,全课兑现;⛔ 正文中禁止出现不带限定的写法。

① 「安全」——功能安全(safety)与网络安全(security)是两个词。 ⛔ 全课禁止裸写「安全」二字:凡是指体系的地方,一律写全「功能安全」或「网络安全」。⚠ 由专名构成的固定术语(安全网关、安全启动、安全存储、安全访问、安全板载通信、安全版本号)不在此列——它们指的是某一个具体机制,⛔ 不是那两套体系之一,读的时候不要把它们回填成体系名。

② 「新鲜度」——三义:K2-02 CAN/LIN/CAN-FD 通信与整车 EEA 集成 的信号年龄 age、本课的新鲜度值 FV、本课建资产集时的受保护属性「新鲜度(时效)」,三者⛔ 不是同一个东西。

名称 是什么 单位 判什么
信号年龄 age(K2-02 CAN/LIN/CAN-FD 通信与整车 EEA 集成 这个数据距离它被产生已经过去多久 s 数据陈不陈旧
新鲜度值 FV(本课,安全板载通信) 计数器型或时间型的一个值,随报文一同被认证 计数(无量纲)或时基 这条报文是不是被重放的
新鲜度(时效)(本课,受保护属性) 建资产集时的一项受保护属性,⛔ 不是一个可读出的量 无(定性) 这份资产还算不算数(第 2 讲逐格问的那一栏)

⚠ 这一组是跨课撞名,也是最危险的一组:读完 K2-02 CAN/LIN/CAN-FD 通信与整车 EEA 集成 再读本课,很容易由前者推出「我们已经有信号年龄监控了,所以有抗重放」。⛔ 不要这样写——信号年龄监控的对手是「数据卡住不更新」,它没有密钥,攻击者重放一条旧报文时可以让年龄看起来完全正常。⇒ 本课一律写全「新鲜度值 FV」,⛔ 不裸写「新鲜度」;作为受保护属性时写「新鲜度(时效)」。这条判据的完整展开在第 4 讲。

③ 「回滚」——本课下辖三个不同的东西,⛔ 正文禁止裸写。

  • 失败回滚:断电或传输中断时靠双分区切换、本地自动完成的恢复。⚠ 它不过下载包的版本比对闸门,因为它根本没有在刷新包;
  • 授权降级回退:云端重新下发旧版本,需要一份单独签名的降级授权,且受安全版本号 SVN 约束;
  • 防回滚机制(anti-rollback):它是那道闸本身。

三者混谈会直接写出一条堵死灰度回退的准入判据,第 6 讲会把这条错话与它的两个相反方向的错误动作一起拆开。

④ 符号 K——本课 f_K 里的 K 是密钥。 K7-02 软件定义热管理与 OTA 迭代 的限幅式里也有一个 K,那是标定参数,与本课的 K 不是同一个量。⇒ 若正文需要引用 K7-02 软件定义热管理与 OTA 迭代 那一式,把标定参数写成 K_标定,或者改述而不引式;⛔ 不许同一页上出现两个含义的 K。

与 ④ 同族、必须一起记住的还有符号 f:本课 f_K 里的 f 是带密钥的认证函数(下标 K 是密钥,第 4 讲);而 K2-02 CAN/LIN/CAN-FD 通信与整车 EEA 集成 的负载率式 ρ_bus = Σ(L_i × f_i) / R_baud 里的 f_i 是报文发送频率(下标 i 是报文序号,量纲 1/s,第 4 讲 4.7 只引不重推)。两者靠下标区分得开,但同一张汇总表里会同时出现 ⇒ 本课凡引到负载率式一律写全 f_i 并注明「报文发送频率」,⛔ 不裸写 f,也 ⛔ 不把认证函数简写成 f。

⚠ 这四组的通病是同一个:只在约定处声明一次,后文照旧简写。声明本身不产生任何保护——两个量只要在正文里长得一样,读者就会把它们当同一个用,而式子照样算得出一个数来,没有任何东西会报错。所以本课的处置是:后文一律写全,⛔ 不做「上文已说明」式的简写。

本讲小结:网络安全与功能安全的分界画在失效模型上——一边的对手是随机失效与系统性缺陷、可以定量论证,另一边的对手是有意图的人、只能评攻击可行性 ⇒ 两套体系的机制⛔ 不可互相充当证据。ISO/SAE 21434 是工程过程标准,⛔ 不是准入凭证;准入凭证是证书,位阶不同。TARA 的五个环节顺序不可跳,它交出来的是一张路径—缓解对应表而不是一个分数;风险那个式子是查表、⛔ 不是相乘。热管理域的「安全」这一格不为零,本域的诉求排序是真实性 / 新鲜度(时效)/ 可用性 ≫ 机密性。CAN 的三条先天弱点各催生一种攻击动作,且⛔ 靠配置改不掉。本域的暴露形状是二跳 ⇒ 主问题是「攻击者已经在内网上时我还挡不挡得住」。⭐ 全课统一的收尾动作只有一句:把「我们这里已经有 X 了」改写成「X 挡的是谁、挡的是哪一个动作、挡不住的是什么」——改不出来的,它就不是一条缓解。

后面还有 6 讲正文 · 关键公式 · 案例拆解 · 常见误区 · 动手做

会员专属

后续为会员深水区内容——四库数据与深度拆解。

查看会员方案