UDS统一诊断服务【三】安全访问0X27服务

本文详细介绍了UDS(UnifiedDiagnosticServices)的安全访问服务,包括安全访问的概念、应用场景、流程以及数据格式,强调了不同安全等级的使用和响应格式。作者还鼓励读者通过实践和深入学习网络安全来提升能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录
  • 前言
  • 一、安全访问简介
  • * 1.1 什么是安全访问
    
    • 1.2 常用的应用场景:
    • 1.3 安全访问流程
  • 二、数据格式
  • * 2.1 请求种子格式
    
    • 2.2 发送秘钥格式
    • 2.3 子功能
    • 2.4 肯定响应
    • 2.5 否定响应
  • 三、举个例子

前言

今天分享的是UDS的安全访问服务,希望能对你有所帮助


一、安全访问简介

1.1 什么是安全访问

SecurityAccess
安全访问,27服务,用来保护某些诊断服务的,提供一种保护机制。例如对于重要数据的上传或者下载过程不做任何限制,可能会对整车的安全造成极大的威胁,尤其是针对底盘域的控制器更是要在这方面做好全方位的安全防保护措施。

1.2 常用的应用场景:

  • 操控类,输入输出的控制,例程控制服务等,
  • 写入类,如烧录程序;产线写入重要的数据,如版本或标定信息,需要过27安全访问后,才进行数据的写入
  • 读取数据,在读取重要的数据时也需要过安全访问

1.3 安全访问流程

我们来看看官方文档ISO14299-1是如何介绍的
在这里插入图片描述

  • 客户端向服务端请求种子;
  • 服务端向客户端发送随机种子;
  • Client基于接收到来自Server的随机种子计算出对应的Key并发送给到Server;
  • Server接受来自Client算出来的Key并与内部算出的Key比较,如果一致则解锁成功,否则解锁不成功;

安全访问的流程

二、数据格式

2.1 请求种子格式

[SID] + [sub-function] + [data]
第一个字节是服务ID:0x27,第二个字节是子功能,请求种子的子功能为1,3,5等奇数。后面的securityAccessDataRecord是可选的数据,标准里给的示例是用来标识客户端的ID,实际应用中一般不会用到,可先不管。
在这里插入图片描述

2.2 发送秘钥格式

[SID] + [sub-function] + [securityKey]

这里的子功能就是2,4,6等偶数值了,而且两者Subfuntion还必须存在一个确定的定量关系:即 Subfuntion(Request Seed) +
1 = SubFunction(Send Key)

在这里插入图片描述

2.3 子功能

请求种子和发送秘钥的子功能被分成了一对对的组,每一组是一个安全等级,不同的安全等级可以用来验证不同的设备,或者执行不同安全等级要求的操作,
数字大小并不代表其等级的高低。

注意:同一时刻最多只能有一个安全等级是解锁的状态。因此从一个安全等级接收到另外一个等级的请求并且解锁成功后,之前的安全等级将被重新锁定,而由于切换安全等级致使先前解锁的状态被锁定后,其依赖于被锁定的等级的服务和功能也一并被关闭。
在这里插入图片描述
0X01:主机厂定义的安全级别的请求种子

0X02:主机厂定义的安全级别的发送秘钥

0X03、05、07~0X41:主机厂定义的不同安全等级的请求种子

0X04、06、08~0X42:主机厂定义的不同安全等级的发送秘钥

2.4 肯定响应

[SID + 0X40] + [sub-function] + [securitySeed]

肯定响应的SID:0x67(0x27+0x40),以及被请求的子功能。后面的种子是收到请求种子的时候,要在肯定响应里给出具体的种子,而如果收到的请求是发送密钥,则只是校验是否解锁成功,不需要后面的字节了。
在这里插入图片描述

2.5 否定响应

[0X7F] + [SID] + [NRC]

如果解锁失败,则可通过收到的NRC判断失败的原因,27服务常用的NRC如下:
在这里插入图片描述

三、举个例子

标准文档里给的例子
在这里插入图片描述
下图是实际项目中录取的CAN报文
在这里插入图片描述
UDS这东西呢,难倒是不难,就是细节太多,没啥别的技巧,就是多实践,多翻一翻官方文档,用得多了就会了,现在我还停留在翻文档的阶段,只记得常用的几个。继续学习,多实践。

最后

从时代发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强机会才越多。

因为入门学习阶段知识点比较杂,所以我讲得比较笼统,大家如果有不懂的地方可以找我咨询,我保证知无不言言无不尽,需要相关资料也可以找我要,我的网盘里一大堆资料都在吃灰呢。

干货主要有:

①1000+CTF历届题库(主流和经典的应该都有了)

②CTF技术文档(最全中文版)

③项目源码(四五十个有趣且经典的练手项目及源码)

④ CTF大赛、web安全、渗透测试方面的视频(适合小白学习)

⑤ 网络安全学习路线图(告别不入流的学习)

⑥ CTF/渗透测试工具镜像文件大全

⑦ 2023密码学/隐身术/PWN技术手册大全

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

扫码领取

### UDS 协议中服务 0x27 出现 NRC 0x37 错误的原因及解决方案 对于UDS (统一诊断服务)协议中的服务请求,当发送方接收到NRC(Negative Response Code) 0x37时,这表明请求未通过安全访问验证[^1]。 #### 原因分析 - **认证失败**:通常情况下,NRC 0x37意味着当前会话的安全访问级别不足以执行所请求的操作。可能是因为之前的安全访问尝试未能成功完成,或者根本没有进行必要的安全访问过程。 - **权限不足**:某些敏感操作需要特定级别的授权才能被执行。如果车辆控制单元(ECU)认为客户端不具备足够的权限来调用该功能,则返回此错误码。 - **命令顺序不当**:按照标准规定,在发起`RequestTransferExit`(0x37)前应先正确执行其他前置条件如Session Control(0x10), Security Access(0x27),若这些步骤中有任何一项出现问题也可能引发此类错误响应。 #### 解决方案建议 为了有效解决问题并获得预期的结果: - 验证是否已经完成了所有必需的服务流程,特别是涉及到安全性方面的交互; - 确认使用的密钥或种子/钥匙对是最新有效的,并且适用于目标ECU; - 尝试重新建立一个新的通信链路,并严格按照文档指南逐步实施各项指令直至达到所需状态; - 如果仍然遇到困难,可以考虑查阅具体车型的技术手册获取更详细的指导信息,或是联系制造商寻求技术支持。 ```python def check_security_access(ecu, key): """ 检查与给定 ECU 的安全访问权限. 参数: ecu (object): 表示要连接的目标电子控制单元的对象实例 key (str): 安全访问所需的密钥字符串 返回: bool: True 表示已成功获得适当级别的访问权; False 则相反 """ try: # 发送安全访问请求... result = ecu.send_request('SecurityAccess', data=key) if isinstance(result, PositiveResponse): return True elif isinstance(result, NegativeResponse) and \ getattr(result, 'nrc') == 0x37: print("Error: 请求被拒绝 - 访问受限.") return False except Exception as e: print(f"发生异常 {e}") return False ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值