AutoSAR SecOC小小科普

news2024/12/26 23:53:53

目录

1.为什么要提SecOC

2.SecOC基本原理

2.1 参与到MAC计算的数据有哪些

2.2 新鲜度值如何管理

3.SecOC与各模块关联关系

 


1.为什么要提SecOC

在车载网络技术里,大家基本都是从CAN开始入门。在CAN DBC里,我们总能看到有些报文除了自带有效payload外,还携带Checksum和Rolling counter等信号。例如,标准CAN报文Byte0用于存放checksum,Byte7低4位用于存放Rolling Counter,如下:

Rolling counter一般是一个循环单调递增计数器,例如在0~15循环递增,可以用于分析发送方是否出现死机、报文是否丢帧等问题;Checksum主要对有效信号和counter进行计算得到一个校验值,用于确认有效信号是否完整。

但是我们回过头来想,该机制不仅仅可以针对板端之间的报文级别进行保护,在同一中ECU中不同功能安全等级任务进行数据交互时,也可以进行针对信号级别的数据进行保护。

因此该机制在AUTOSAR中得到了进一步升华,那就是我们做功能安全必须考虑的E2E(End to End) Transformer,该模块保证了即使在QM等级通信栈的数据传输也是安全可靠,如下图所示:

但是随着汽车信息安全在车控类ECU的普及,E2E机制出现了一些小小的漏洞,例如,

  • 如何证明接收到的报文的身份有效性?
  • 如何以公认的方式来证明checksum计算机制没有后门或者漏洞?
  • 如何保证在CanFD组包中没有受E2E保护的信号的数据完整性?

这些问题可以在后续SecOC(Secure Onboard Communication)讲解中得到答案。

2.SecOC基本原理

首先给出AutoSAR E2E和SecOC各自的用法:

  •  E2E:面向功能安全(Safety),用于保护与功能安全相关的数据传输,颗粒度可以到信号Signal级别;
  • SecOC:面向信息安全(Security),为PDU级别的关键数据提供数据完整性和身份的认证机制。

SecOC针对PDU级别的数据完整性和身份认证,在文档中是使用MAC验证的的对称身份方法,其原理如下图:

发送方将待认证数据(I-PDU)、SecoOC内部Data ID结合新鲜度值(Freshness),使用对称密钥计算得到一个MAC值,然后将原始数据、截断后的FV、截断后的MAC组成一个完整报文后发送给接收方;

接收方接收到完整报文后,首先判断新鲜度值是否满足条件,满足后将原始数据结合内部维护对应PUD-ID、新鲜度值使用相同密钥进行MAC计算,最后根据配置截断MAC值,与接收到的MAC进行比较,从而确认接收报文的完整性和身份有效性。

下图为DBC中带SecOC属性的报文示例:

在上述过程中,我们可以发现,SecOC能够有效保证数据安全最关键的步骤有如下几方面:

  • 参与到MAC计算的数据有哪些?
  • MAC计算使用什么算法?
  • 报文新鲜度值管理方式

2.1 参与到MAC计算的数据有哪些

根据文档说明,参与到MAC计算的数据包括:SecOC DataID、原始真实数据(Authentic I-PDU data)、完整的新鲜度值,如下图:

  • Data ID表示的是对应的PDU ID,例如上图示例SCP_Data ID 683;
  • Authentic I-PDU data表示真实原始数据;
  • Freshness表示当前报文的新鲜度值,主要用于防止报文的重放攻击; 

最关键的在于报文新鲜度值的管理,很多时候我们遇到SecOC报文校验失败的问题都来源于报文新鲜度值的问题。

2.2 新鲜度值如何管理

新鲜度值提出的目的主要为了防止重放攻击、判断是否出现丢帧等情况,常见的表达方式有基于计数(Freshness Counter,和rolling counter很类似)、基于时间戳(Timestamp)。

在实际工程应用时,常见的SecOC通讯场景多为域间的通信,如下:

这就存在一个问题:如何保证新鲜度值在初始状态是统一的?

为此,SecOC提出了新鲜度值同步报文的概念。一般来讲,发送新鲜度值同步报文的节点叫做 FvM Master ECU, 接收新鲜度值同步报文的节点叫FvM Slave ECU。Slave接收到同步报文后会根据报文内容更新各种新鲜度值计数器值,从而保证后续新鲜度值的基准是统一且有身份认证的。

新鲜度值同步报文的格式如下:

这里面有两个非常关键的计数器,Trip Counter和Reset Counter,先记住它,验证码其实就是使用同样密钥和对称算法进行的MAC计算,整体报文在DBC layout如下图所示:

因此,我们在分析SecOC相关问题时,首先确认Master ECU(多为网关)是否发送了同步报文,确认Master和Slave完成握手同步后再分析是否是MAC、密钥、FvM计数等问题。

在了解同步报文作用之后,我们来看看新鲜度值到底长什么样。

在SecOC文档里,Freshness Value Management建议由SWC进行实现,但在我们实际遇到的基础软件包里,大多都集成了FvM这个模块,并且普遍推荐基于计数的方式(其他两种方式暂不在本文范围内),因此首先来看看新鲜度值在SecOC文档如何定义的。

在11.4.1.1章节,新鲜度值结构定义如下:

新鲜度值长度总计为8个Bytes,在该结构里定义了多种计数器,将标准里的示例总结如下(如有不同,请参考自家定义的用法),如下表所示:

  • Trip Counter:同步计数器,由Master ECU自增,Slave ECU仍需保存和维护;该计数器一般是IG-ON或者FvM初始化自增1,主要表征一个上电周期,很利于问题分析;
  • Reset Counter:重置计数器,也是由Master ECU周期自增1,一般这个周期为秒级;
  • Message Counter:消息计数器,发送方每次成功发送报文后自增1;
  • Reset Flag:与Reset Counter低位同步。

根据之前对新鲜度值同步报文的介绍,Trip Counter和Reset Counter均是由Master ECU同步给Slave,但是Slave仍要保持上述两值到NvM中,以便比较Master ECU给过来的值是否符合逻辑(实车时经常发现Mater ECU Trip Counter小于Slave的情况)。

Message Counter又分为MsgCntUpper和MsgCntLower,其中比较关键的是MsgCntLower,因为它要与Reset Flag作为被截断的Fv,参与到最终安全PDU的组包当中。

新鲜度值最终是需要参与到SecOC模块构建发送PDU、校验接收安全PDU,因此针对报文的新鲜度值构建过程就尤为重要,以构建发送消息为例:

在新鲜度值同步成功之后(重置周期内),正常情况下,TripCnt和ResetCnt都会保持不变,此时用于发送的安全PDU构建新鲜度值,就只会有一个变化,就是MsgCnt会自增1,发送出去的新鲜度值(假设14bitMsgCnt低位+2bit重置低位)会出现每次自增4的现象。

在达到重置周期后,TripCnt不变,ResetCnt自增1,那么新鲜度值会出现如下现象:

3.SecOC与各模块关联关系

SecOC作为一个信息安全校验模块,其在基础软件层次结构如下:

以接收安全PDU为例:CAN报文经由CanIf传到PduR层,再有PduR路由至SecOC模块,SecOC从FvM获取目标CAN报文新鲜度值后构建待校验数据,再调用Crypto Stack相关接口,经由CSM->CryIf->Crypto Driver,将数据进行MAC计算,最终比较MAC值,如不一致直接丢弃。

作为科普,到这个程度已经差不多了,如果要深入到相关开发,那就必须仔细研究FvM的机制,例如Master、Slave ECU对于FvM的处理机制,对于新鲜度值同步报文的处理方式,例如Slave没有收到Master的同步报文应该如何处理?Master同步报文的计数器比Slave的存的计数器值还小该如何处理?接收的安全PDU的MsgCnt出现了异常是直接丢弃还是需要继续做逻辑处理?

这些问题后面有时间再具体详谈吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2054805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AWS 消息队列服务 SQS

AWS 消息队列服务 SQS 引言什么是 SQSSQS 访问策略 Access Policy示例:如何为 DataLake Subscription 配置 SQS 引言 应用系统需要处理海量数据,数据发送方和数据消费方是通过什么方式来无缝集成消费数据的,AWS 提供 SQS 消息队列服务来解决…

42000 Star图标工具Mermaid!

Mermaid:用文本构建图表世界 - 精选真开源,释放新价值。 概览 Mermaid.js 是一个创新的开源工具,专为简化图表创建流程而设计。它通过一种简洁的文本描述语言,使得用户能够快速地生成流程图、序列图、甘特图等图表,而…

【威锋网-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

JavaEE过滤器的创建与使用过滤器的使用场景

过滤器 Filter也称之为过滤器,过滤器是javaEE规范肿定义的一种技术,可以让请求到达目标servlet之前,先进入到过滤器中,在过滤器中统一进行一些拦截处理,当处理完成后,可以继续向后执行,到达目标servlet,如果配置了多个过滤器,也可以进入下一个过滤器 创建过滤器 创…

一键更换Linux优质的软件源和docker源 —— 筑梦之路

一个非常牛逼的开源项目:https://github.com/SuperManito/LinuxMirrors.git LinuxMirrors 使换源更简单 - LinuxMirrors 支持的操作系统 系统名称适配版本Debian8.0 ~ 13Ubuntu14.04 ~ 24Kali Linux2.0 ~ 2024Linux Mint19.0 ~ 21 / LMDE 6DeepinallArmbianallP…

Redis7基础篇(一)

redis十大数据类型 目录 redis十大数据类型 redis键key 数据类型命令 redis字符串string 分布式锁 ​编辑 ​编辑​编辑应用场景 ​编辑​编辑 reids列表list 应用场景 redis哈希hash 应用场景 redis集合set 应用场景 redis有序集合zset(sorted set集…

【设计模式】观察者模式和订阅发布模式

观察者模式 观察者模式包含观察目标和观察者两类对象。一个目标可以有任意数目的与之相依赖的观察者。一旦观察目标的状态发生改变,所有的观察者都将得到通知。 当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新,解决…

《机器学习》逻辑回归 梯度下降、混淆矩阵、随机种子、正则化惩罚 No.6

一、混淆矩阵 1、什么是混淆矩阵? 混淆矩阵是用于评估分类模型在不同类别上的预测准确性的工具。它提供了模型预测结果与真实结果之间的对应关系,帮助我们分析和理解模型的分类性能。 假设,要对15个人预测是否患病,使用1表示患病…

生产环境中MapReduce的最佳实践

目录 MapReduce跑的慢的原因 MapReduce常用调优参数 1. MapTask相关参数 2. ReduceTask相关参数 3. 总体调优参数 4. 其他重要参数 调优策略 MapReduce数据倾斜问题 1. 数据预处理 2. 自定义Partitioner 3. 调整Reduce任务数 4. 小文件问题处理 5. 二次排序 6. 使用…

【python与java的区别-03(集合、字典)】

一、Set python: 集合(set)是一个无序的不重复元素序列。 集合中的元素不会重复,并且可以进行交集、并集、差集等常见的集合操作。 可以使用大括号 { } 创建集合,元素之间用逗号 , 分隔, 或者也可以使用 set() 函数…

【解释器模式】设计模式系列:构建动态语言解释器与复杂表达式处理(深入理解并实现)

文章目录 深入理解并实现解释器模式1. 引言1.1 解释器模式的定义1.2 模式的主要优点和缺点1.3 适用场景1.4 实际应用案例简介 2. 解释器模式的基本概念2.1 模式的核心思想2.2 模式的角色2.3 模式的动态行为分析 3. 解释器模式的工作原理3.1 如何构建表达式树3.2 如何通过递归遍…

可达鸭举牌网页版本在线生成源码html5

源码介绍 可达鸭举牌网页版本,在线生成源码,点击分享即可制作DIY自己的举牌文字网页,需要GIF动图的自行用GIF图片录制工具录制下来。 PS:上传到服务器运行或者本地nginx运行,不要双击index.html,如果本地双击HTML&…

【3】AT32F437 OpenHarmony轻量系统第一个程序:点灯

在搭建好AT32F437 OpenHarmony 轻量系统之后,当然要尝试点一下灯了。 编写点灯程序 笔者在适配OpenHarmony轻量系统的时候,只对源码的device和vendor目录进行了修改,AT32的app目录笔者放置在了vendor/tree/master/artery/AT-START-F437/app…

什么是网络安全?网络安全防范技术包括哪些?

一、引言 在当今数字化的时代,网络已经成为人们生活和工作中不可或缺的一部分。然而,随着网络的普及和应用的广泛,网络安全问题也日益凸显。从个人隐私泄露到企业关键信息被盗,从网络欺诈到大规模的网络攻击,网络安全…

在国产芯片上实现YOLOv5/v8图像AI识别-【2.5】yolov8使用C++部署在RK3588更多内容见视频

本专栏主要是提供一种国产化图像识别的解决方案,专栏中实现了YOLOv5/v8在国产化芯片上的使用部署,并可以实现网页端实时查看。根据自己的具体需求可以直接产品化部署使用。 B站配套视频:https://www.bilibili.com/video/BV1or421T74f 背景…

ubuntu 安装两个nginx实例时的坑,非默认nginx实例配置修改总也不生效的问题

一、问题 由于工作需求xx云服务器上安装了两个nginx实例,突然有一天需要在非默认nginx上增加一个子站点,根据网上教程和原来的记录修改vi nginx.conf 后保存载总也不生效? 怎么破? 二、过程记录 假如:非默认nginx安装在…

HanLP分词的使用与注意事项

1 概述 HanLP是一个自然语言处理工具包&#xff0c;它提供的主要功能如下&#xff1a; 分词转化为拼音繁转简、简转繁提取关键词提取短语提取词语自动摘要依存文法分析 下面将介绍其分词功能的使用。 2 依赖 下面是依赖的jar包。 <dependency><groupId>com.ha…

使用SSH协议远程连接Ubuntu

1.切换到root用户 sudo -i 2.安装openssh-server apt update apt install openssh-server 3.启动ssh服务 service ssh start 4.查看ssh状态 &#xff08;q键: 退出&#xff09; service ssh status 5.检查ssh服务是否启动成功 ps -e | grep ssh 6.开机自启动 systemctl enable …

基于STM32F103的FreeRTOS系列(九)·任务创建函数的使用·静态方法和动态方法

目录 1. 前期准备 1.1 中断文件修改 1.2 SysTick文件修改 1.3 任务创建函数API 2. 任务创建&#xff08;静态方法&#xff09; 2.1 创建两个任务函数 2.2 静态创建开始任务函数 2.3 创建开始任务的任务函数 2.4 补充 2.5 代码 3. 任务创建&#xff08;动…

【python基础】—利用pandas读取或写入mysql表数据

文章目录 一、read_sql()二、to_sql()三、连接数据库方式—MySQL1、用sqlalchemy包构建数据库链接2、用DBAPI构建数据库链接 四、容易遇到的问题 一、read_sql() 功能 将 SQL 查询/数据库表读入 DataFrame。 语法 读取数据库&#xff08;通过SQL语句或表名&#xff09; pand…