前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CANard工具套件:CAN总线安全工具

CANard工具套件:CAN总线安全工具

作者头像
FB客服
发布2018-02-06 14:50:21
2.5K0
发布2018-02-06 14:50:21
举报
文章被收录于专栏:FreeBufFreeBuf

CAN是控制器区域网络(Controller Area Network, CAN)的简称,是国际上应用最广泛的现场总线之一。在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线。

前特斯拉员工Eric Evenchick在今年Black Hat Asia 2015大会发布了一款CAN总线协议的安全工具CANard,通过硬件抽象实现对多种CAN适配器的支持,向上提供统一的调用接口。还支持CAN-TP、OBD-II、UDS多种上层协议的通信。针对CAN总线协议设备的模糊测试及漏洞挖掘而言,CANard无疑是一个功能完整的基础平台。

一、 介绍

CAN是控制器区域网络(Controller Area Network, CAN)的简称,是国际上应用最广泛的现场总线之一。 在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线。

基于CAN总线的系统通常假设具备网络物理访问权限的任何人均是可信的。一旦设备接入CAN网络,我们就可以读取所有流量、发送欺骗消息或执行拒绝服务攻击(DoS)。

CANard 工具套件是一个Python库,目标是让我们与CAN网络的交互更为简单方便。这个工具套件实现了以下目标:

-硬件抽象 -协议实现 -易于自动化 -信息共享

二、基本通信

在CAN网络中,所有通信数据都会封装成帧。一个CAN帧由以下几部分组成:

-标示符(Identifier): -控制标志(Control flags) *远程请求标志(Remote Request Flag) *标示符扩展标志(Extended ID Flag) -数据长度码:4比特位 -数据域:0至8字节的数据

CANard库把CAN帧封装成Python对象。这些帧对象实现了发送、接收、记录、及查看等功能。下图是使用标识符为0x123、长度码为5、数据字节为1、2、3、4、5创建一个标准CAN帧。

现在,我们可以使用硬件设备来发送这个示例帧。这个简便的接口可以让我们更易于生成与发送载荷,或分析来自总线的帧。

三、 硬件抽象

由于传统PC并没有配备CAN总线接口,因此我们需要一个外部适配器。市场上有多种适配器可以实现USB接口转换CAN总线接口,如下表所示。每种设配器都需要安装自己的驱动及工具。

3.1 支持的适配器

CANard库当前支持Linux系统下的SocketCAN。因此,Linux环境下,所有SocketCAN支持的接口都可以通过CANard正常工作。此外,CANard还直接支持Windows、Mac OS X及Linux系统上的CANtact接口。

其中CANtact是一款Eric Evenchick设计的用于接入CAN系统的开源硬件。你可以从花费60美元从网站购买成品,如下图所示;也可以从Github下载电路图和固件代码(请查看底部链接),然后按照教程自己DIY一个。

SocketCAN是Linux系统环境下CAN总线协议的一种实现方法。SocketCAN使用伯克利的socket接口和linux网络协议栈,使得CAN设备驱动可以通过网络接口来调用。

实现对新硬件的支持是非常简单的。开发人员只需编写实现开启与终止通信、发送与接收消息的方法。一旦实现上述要求,我们就可以在库中使用新的CAN设备。

3.2 消息队列

CANard库还需要解决的一个常见问题是IO阻塞。当调用dev.recv()方法,程序便会被阻塞,直至收到一条消息。在等待帧的到来时,大多数CAN接口处于阻塞状态。

为防止脚本被阻塞,CANard使用了CanQueue队列。

这个示例会等待10秒来接收新帧。如果在指定时间内未接收到新帧,我们可以将超时作为一个错误处理。在CAN系统中,常见模式是“请求/响应(Request/Response)”模式。设备发送一个帧(frame)向一个远程设备请求数据或操作。那个远程设备便会做出相应的回复。

3.3 过滤器

“请求/响应(Request/Response)”示例使用了CanQueue的过滤器。因为我们已经了解响应帧的标示符为0x6A5,所以我们会忽略所有其他消息。这个功能在实现CANOpen、OBD-II及UDS协议时非常有用。

四、应用协议

CAN通信可以支持多种协议。我们关注符(ISO)标准的汽车行业。在汽车系统中,存在一种称作“诊断(diagnostics)”的通信协议。这些通信协议在汽车正常运转期间是不活跃的,但是制造商和技术服务人员可以用来获取设备状态、运行测试、读取内存及更新固件。

CANard的目标就是实现这些协议,所以开发人员不必费心处理底层的CAN消息结构。从安全角度来看,这点有助于针对特定目标汽车设备编写模糊测试器与漏洞挖掘。

4.1 CAN-TP

CAN帧只能承载不超过8字节的数据。为克服这一缺陷,我们可以使用ISO 15765-2标准,它常被称作ISO-TP。该标准提供一种方法,可以把更长的数据封装到多个帧中。虽然本文不涉及ISO-TP的细节,但是CANard可以自动化地生成和解析ISO-TP协议数据。

CANard库提供的协议实现类:IsoTpProtocol类。

4.2 OBD-II

OBD-II标准常用于车辆基本的诊断。该标准使用CAN-TP协议的一个子集。虽然OBD-II协议在读取车辆的基本数据上非常有用,但除此之外,它不能提供更多的功能。为了支持更复杂的诊断操作,需要使用用UDS。

CANard库提供的协议实现类:ObdInterface,实现了发送OBD-II协议数据的请求与接收响应的功能。

4.3 统一诊断服务(Unified Diagnostic Services)

统一诊断服务(Unified Diagnostic Services)或UDS用于制造商特定的诊断。UDS标准通过ISO 14229-1发布。该协议为制造商和服务技术人员提供多种多样的功能。

为访问这些服务,诊断工具需要连接到CAN总线。它会向总线上的各种控制器发送UDS请求。为接收UDS请求和发送UDS响应,每个控制器拥有一个唯一的CAN标示符(CAN ID)。

所提供的服务列表如表1所示。可用的各种服务也为攻击控制器提供了极大的便利。例如,读写车辆控制器的任意内存(服务号为0x23和0x3d)引起人们的广泛关注。

虽然这些服务的使用应该有限制的,但是通常存在实现上的问题。寻找这些问题便可以找到控制器的漏洞。

CANard库提供的协议实现类:UdsInterface类,实现了UDS消息的封装、发送、接收以及响应数据解析的功能。

五、脚本自动化

CANard允许开发人员自行构建工具来处理CAN原始数据和标准协议。由于库所提供的硬件抽象功能,脚本可以在多个平台和多种CAN总线适配器上使用。

如下所示的简单脚本,它以高速率发送标示符为0的消息,从而实现了拒绝服务攻击。在该示例中,我们使用了一个CANtact设备。

CANard的协议功能可以根据标准协议快速地构建工具。例如,下图代码通过向一系列标示符(ID)发送诊断会话的请求,进而尝试发现启用UDS的设备。

六、总结

CAN协议广泛应用于各种工业行业,包括汽车行业。CANard库为接入CAN总线系统的脚本的快速开发提供了强力的工具。由于CANard为CAN总线接口提供了硬件抽象,脚本可以适用于多个平台和多种CAN总线接口。这个工具的开源特性意味着任何人都可以增加对新接口的支持。

* 作者/Rabbit_Run,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-07-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档