揭示AUTOSAR中隐藏的漏洞

AUTOSAR是一个普遍采用的软件框架,用于各种汽车零部件,如ABS, ECU,自动照明、环境控制、充电控制器、信息娱乐系统等。AUTOSAR的创建目的是促进汽车零部件之间形成标准接口,可以在不同制造商之间互通。

因此,任何配备微控制器(MCU)的汽车零部件都应符合AUTOSAR的规定。

AUTOSAR标准不仅管理用于模块间通信的数据格式,还规定了这些模块的标准API。在汽车行业内使用的AUTOSAR平台有两个版本:Classic和Adaptive。

Adaptive平台是为高性能设备量身定制的,例如信息娱乐系统或高级驾驶辅助系统(ADAS),这些设备通常在Linux或QNX等资源丰富的操作系统上运行。另一方面,Classic平台部署于运行在微控制器单元裸板(MCU)上的低性能设备中,包括ABS, EBD, 安全气囊控制单元、车身控制模块、传输控制模块等系统。

虽然AUTOSAR是一个稳健而可靠的开发框架,但它并非没有潜在的错误和漏洞。在对AUTOSAR文件进行内部分析时,我们偶然发现了一个特别有趣的漏洞,这个漏洞可能会带来很大的安全风险。代码中的缺陷并不是由于AUTOSAR本身造成的,而是对AUTOSAR使用不当的结果。

在本文中,我们打算深入研究和剖析这个具体的案例。

AUTOSAR Classic固件开发

在大多数情况下,固件是利用两家领先的AUTOSAR软件提供商(Vector和Elektrobit)提供的工具链开发的。

Vector和Elektrobit都提供了配置工具和SDK,其中包括标准AUTOSAR模块的预构建实现,如MicroSAR OS运行时、CAN接口、NVM API、诊断模块、加密和内存接口等。这种被称为基本软件(Basic Software,简称BSW)的SDK是以中间件方式执行,因此不能在目标硬件上独立运行。

除了BSW之外,还有一套被称为微控制器抽象层(Microcontroller Abstraction Layer,简称MCAL)的驱动程序和库,用于对硬件的访问。每个打算将其MCU用于汽车行业的硬件制造商都提供了适用于其MCU的AUTOSAR MCAL。例如,有来自博世、恩智浦、瑞萨和英飞凌的MCAL。MCAL驱动程序和库也需要遵循AUTOSAR标准,以确保BSW可以与任何硬件制造商的MCAL一起使用。

新固件的开发通常从配置工具开始。在这里,开发人员构建要使用的硬件平台,为他们的项目选择所需的MCAL和BSW模块,然后在所有模块之间建立连接。例如,开发人员可以指定BSW中的CanIf模块应该使用哪个MCAL的CAN接口。一旦配置阶段完成,配置工具就会生成源代码,这些源代码本质上是MCAL和BSW的一个子集。

生成源代码之后,可以使用任何编译器或集成开发环境(IDE)对其进行编译,然后再将其安装到目标设备上。由配置工具输出的源代码已经包含了设备以默认行为操作所必需的一切。因此,开发人员可能不需要对所生成的代码进行任何修改。在BSW层之上的任何自定义代码往往都是最小化了的,通常占固件总大小的10%以下。

基于AUTOSAR的固件漏洞

在我们进行红队渗透测试的过程中,我们获得了基于AUTOSAR的固件进行安全评估。从攻击者和渗透测试者的角度来看,基于AUTOSAR的文件的潜在攻击点非常有限。该模块的源代码非常可靠,始终经过代码审查和漏洞分析。

关于常规漏洞和通用缺陷枚举(CWE),发现它们的可能性相当小。没有动态内存分配,所有变量要么是全局的,要么是堆栈上的,从而消除了发现double-free或use-after-free等漏洞的机会。汽车代码不执行字符串操作,而只关注二进制解析。因此,通过sprintf, sscanf, strcpy等操作遇到堆栈溢出的可能性在这里是不存在的。

当涉及到潜在的竞态条件漏洞时,AUTOSAR Classic不允许动态任务初始化或动态创建的同步原语。任务和同步事件列表是在配置阶段预先确定的。因此,考虑到静态的、预先配置的任务资源和事件集,自动生成的代码不太可能包含死锁或竞态条件。

因此,我们必须深入研究AUTOSAR框架,了解它的用法和对API的潜在使用不当,特别关注用户如何以可能导致漏洞的方式调用它。

我们在NvM模块中遇到了一组函数:NvM_ReadBlock, NvM_WriteBlock和NvM_RestoreBlockDefaults,这组函数通常用于在NVM中加载和存储设备设置(如EEPROM, NAND, NOR内存等)。

通过对NVRAM管理器规范中的函数原型进行研究:

很明显,这些函数缺少缓冲区大小检查,仅使用块ID来确定在配置阶段配置的特殊块表中的数据大小。换句话说,用户有责任包含在写入时验证保存在NvM块中的数据大小是否合适的代码。同样,当从NvM块中读取数据时,用户有责任提供足够大的缓冲区,因为NvM_ReadBlock只是根据NvM块的大小简单地覆盖缓冲区。

因此,这样的API调用可能会导致越界(Out of Bounds, 简称OOB)读取或写入。根据作为NvM_DstPtr/NvM_SrcPtr传递的缓冲区类型,可能会出现各种问题:

  • 如果用户提供了一个小的堆栈变量,但读取了一个大的NvM块,NvM_ReadBlock将在堆栈变量之外写入数据,这会导致堆栈损坏,并可能为远程代码执行(Remote Code Execution,简称RCE)打开大门。
  • 如果提供的变量是全局变量,NvM_ReadBlock将覆盖邻近的全局变量。这可能会导致代码中出现未定义的行为。
  • 如果用户为NvM_WriteBlock提供了一个小的堆栈或全局变量,将导致NvM_WriteBlock读取变量外的数据,并将随机数据存储到NVM中。

利用这种方法,我们发现了一个有趣的由于AUTOSAR API使用不当导致缓冲区溢出漏洞的案例。

发现基于AUTOSAR的漏洞

让我们看一下我们遇到的漏洞的简化版本:

NvM_ReadBlock将从NVM读取0x110字节,然后将其写入myVar的位置。虽然NvM_ReadBlock会准确地写入myVar的值,但之后它仍将继续用不可预测的值覆盖邻近的全局变量。

在我们发现的案例中,NvM_ReadBlock被设置为在堆栈上执行越界写入操作,这可能会覆盖函数的返回地址。

在这个具体案例中,对易受攻击函数的调用被MCU复杂的自定义工作流程所掩盖。然而,它仍然是可触发的,并且确实导致了执行崩溃。

缓解威胁

代码生成之后,管理源代码中与NvM API一起使用的变量大小就完全是开发人员的责任了。因此,AUTOSAR开发人员应当尽一切努力在配置器中对齐变量和NVM块的大小。AUTOSAR开发人员还应当避免修改生成的代码,除非他们完全理解有关NVM块大小的约束。

此外,没有NVM函数可以提供NVM块的大小来执行如下检查:assert(sizeof(myVar) == NvM_BlockSize(Block_ID));这是因为块大小被硬编码到NvM模块配置中,并被视为内部数据。

即使在使用AUTOSAR这样的标准化框架时,在某些情况下,也可能无意中引入重大的内存漏洞。为了减少这种情况,强烈建议采用持续的质量保证措施和定期的渗透测试。

总结

虽然AUTOSAR为汽车软件开发提供了一个稳健而标准的框架,但由于使用不当,特别是在NvM API的变量管理中,仍然可能出现潜在的漏洞。随着汽车技术越来越复杂,有必要通过持续的质量保证和定期的渗透测试来加强软件安全性。这些实践,加上对正在使用的框架的深刻理解,可以帮助开发人员降低潜在的安全风险,并提高汽车系统的整体安全性。

“原创内容,转载请标明出处”

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

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

相关文章

CGAL的无限制的Delaunay图

本章描述了构建L∞距离下线段Delaunay图的算法和几何特征。这些特征还包括绘制L∞距离下线段Delaunay图对偶(即L∞距离下线段Voronoi图)边缘的方法。L∞算法和特征依赖于欧几里得(或L2)距离下的线段Delaunay图算法和特征。L∞度量…

redis 面试问题 (更新中 ing)

reids 是做什么的 为什么那么快 有哪些使用场景 1.数据缓存 2.计数器 3.限时 4.限流 5.分布式锁 6.队列 7.发布 订阅 redis有哪些 数据结构 常用的 string 对字符串 、整数、浮点数list 链表 ,字符串set 不重复集合 ,交集、并集 差集hash 无序散列…

月报总结|Moonbeam 12月份大事一览

一转眼已经到年底啦。本月,Moonbeam基金会发布四个最新战略重点:跨链解决方案、游戏、真实世界资产(RWA)、新兴市场。其中在新兴市场方面,紧锣密鼓地推出与巴西公司Grupo RO的战略合作。 用户教育方面,为了…

大创项目推荐 深度学习人脸表情识别算法 - opencv python 机器视觉

文章目录 0 前言1 技术介绍1.1 技术概括1.2 目前表情识别实现技术 2 实现效果3 深度学习表情识别实现过程3.1 网络架构3.2 数据3.3 实现流程3.4 部分实现代码 4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习人脸表情识别系…

如何使用Python3 Boto3删除AWS CloudFormation的栈(Stacks)

文章目录 小结问题及解决有关Json文件的输入和输出使用Python3及正则表达式查找字符串包含某个子字符串使用Python3 Boto3删除AWS CloudFormation的栈(Stacks) 参考 小结 本文记录了使用Python3的Boto3包删除AWS CloudFormation的栈(Stacks&…

Git从远程仓库拉取指定的分支

一、git clone 命令获取 使用git管理代码版本的时候&#xff0c;本地分支默认与远程同名分支建立追踪关系。文章开始也提到git clone <url>命令默认将整个远程版本库克隆到本地&#xff0c;但是git clone -b <分支名称>命令可以将指定的某一个远程分支拉取到我们本…

优雅地展示20w单细胞热图|非Doheatmap 超大数据集 细胞数太多

单细胞超大数据集的热图怎么画&#xff1f;昨天刚做完展示20万单细胞的热图要这么画吗&#xff1f; 今天就有人发消息问我为啥他画出来的热图有问题。 问题起源 昨天分享完 20万单细胞的热图要这么画吗&#xff1f;&#xff0c;就有人问为啥他的数据会出错。我们先来看下他的…

imgaug库指南(一):从入门到精通的【图像增强】之旅

文章目录 引言imgaug简介安装和导入imgaug代码示例imgaug的强大之处和用途小结结尾 引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和…

(JAVA)-反射

什么是反射&#xff1f; 反射允许对成员变量&#xff0c;成员方法和构造方法的信息进行编程访问。 说简单点就是反射能将类里面的构造方法&#xff0c;成员变量,修饰符,返回值&#xff0c;注解&#xff0c;类型&#xff0c;甚至异常等类里面的所有东西都能够获取出来。 关于C…

团子杂记:SAP PS or 项目管理软件(PMIS )? PPM/P6

众所周知SAP的PS模块在项目型企业的SAP应用中扮演着核心角色&#xff0c;整个项目端到端的业务执行、财务核算、控制及分析都是通过PS作为主线&#xff0c;依赖于PS中的项目对象&#xff08;如WBS元素、网络活动等&#xff09;实现的。 在实施SAP的过程中&#xff0c;可以看到…

Nest 框架:解锁企业级 Web 应用开发的秘密武器(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

RKE安装k8s及部署高可用rancher之证书私有证书但是内置的ssl不放到外置的LB中 4层负载均衡

先决条件# Kubernetes 集群 参考RKE安装k8s及部署高可用rancher之证书在外面的LB&#xff08;nginx中&#xff09;-CSDN博客CLI 工具Ingress Controller&#xff08;仅适用于托管 Kubernetes&#xff09; 创建集群k8s [rootnginx locale]# cat rancher-cluster.yml nodes:- …

网络安全—模拟ARP欺骗

文章目录 网络拓扑安装使用编辑数据包客户机攻击机验证 仅做实验用途&#xff0c;禁止做违法犯罪的事情&#xff0c;后果自负。当然现在的计算机多无法被欺骗了&#xff0c;开了防火墙ARP欺骗根本无效。 网络拓扑 均使用Windows Server 2003系统 相关配置可以点击观看这篇文章…

【iOS安全】JS 调用Objective-C中WKWebview Handler的三种方式

有三种实现途径 1. WKScriptMessageHandler OC部分&#xff1a;注册并实现Handler 将OC中的方法"nativeMethod"注册为JavaScript Message Handler&#xff0c;从而WebView中的JavaScript代码可以调用该方法 // Register in Objective-C code - (void)setupWKWebVi…

算法通关村番外篇-数组实现队列

大家好我是苏麟 , 今天来用数组实现一下队列 . 数组实现队列 顺序存储结构存储的队列称为顺序队列&#xff0c;内部使用一个一维数组存储&#xff0c;用一个队头指针 front 指向队列头部节点(即使用int类型front来表示队头元素的下标)&#xff0c;用一个队尾指针rear(有的地方…

WiFi7: EMLSR 操作之三 – 运行时

non-AP 必须在EMLSR link(s)上侦听。侦听包括CCA和接收initial Control frame。 侦听时处于awake状态&#xff0c;但不限制active或者PS模式 group addressed 帧必须缓存initial control frame遵守以下规则&#xff1a; > 以non-HT(DUP)格式发送&#xff0c;6Mbps/12Mbp…

vue3中pdf打印问题处理

1 get请求参数问题 之前的请求是post得不到参数&#xff0c;今天发现的问题很奇怪&#xff0c;从前端进入网关&#xff0c;网关居然得不到参数。 前端代码 const print () > {let linkUrlStr proxy.$tool.getUrlStr(proxy.$api.invOrder.psiInvOrder.printSalOutstock,{a…

【Java】面向对象程序设计 期末复习总结

语法基础 数组自带长度属性 length&#xff0c;可以在遍历的时候使用&#xff1a; int []ages new int[10];for (int i 0; i < ages.length; i)System.out.println(ages[i]); 数组可以使用增强式for语句进行只读式遍历&#xff1a; int[] years new int[10];for (int ye…

Git(3):Git环境常用命令

1 获取本地仓库 要使用Git对我们的代码进行版本控制&#xff0c;首先需要获得本地仓库 &#xff08;1&#xff09;在电脑的任意位置创建一个空目录&#xff08;例如test&#xff09;作为我们的本地Git仓库 &#xff08;2&#xff09;进入这个目录中&#xff0c;点击右键打开…

Go 语言教程

发现一篇特别好的教程入门篇&#xff0c;记录下来&#xff1a; Go从入门到精通(持续更新) - 知乎 Go官网&#xff1a; iThe Go Programming Languageg gitee上面的一些开源项目 后台管理框架 - Go - 后台管理框架 - 开源软件 - Gitee.com