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

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)

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2015-07-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏上善若水

Emacs001学用Emacs之入门:关于配置文件

编辑器是我们经常要打交道的工具,工欲善其事,必先利其器。每一个领域都有专用的好的工具,比如android开发用android sduio, 我先用emacs填...

46540
来自专栏FreeBuf

钓鱼邮件攻击中的猥琐技巧与策略

引言 钓鱼邮件攻击是社会工程学攻击中的一种常见的手段,其目的是欺骗受害人来进行一些操作,最终控制受害人。一般来说,钓鱼邮件从后续的攻击手段来说,可以分为两类: ...

30260
来自专栏网站漏洞修补

如何解决网站title被恶意反复篡改

国庆假日期间我们Sine安全接到众多网站站长求助网站标题被改导致在百度搜索中百度安全中心提醒被拦截,导致网站正常用户无法浏览网站被跳转到一些菠菜du博网站,而且...

94950
来自专栏FreeBuf

色情网站的光棍节“福利”:加密式挂马玩转流氓推广

双十一前夜,还想着通过同城交友或是某些不可描述的网站一解单身的烦恼?别急,不妨先来看看这些网站给光棍发的“福利”! 最近,360安全中心监测到一起网站弹窗广告挂...

27580
来自专栏owent

整理一波软件源镜像同步工具+DevOps工具

上个月,同学的公司,格奕,突然间跪了。这个月基本属于休息+四处溜达。同时空闲的时候也想整理下之前做得一些之前的做得一些小工具们。在不泄密的情况下开源出来吧(其实...

12320
来自专栏mini188

技术笔记:Indy IdSMTP支持腾讯QQ邮箱邮件发送

1、腾讯QQ邮箱的授权码问题 因为腾讯邮箱折腾了个底朝天,其要搞什么授权码登录第三方客户端,否则会报这个错误: 'Error: 请使用授权码登录。详情请看: ...

22680
来自专栏云瓣

关于 Node.js 的认证方面的教程(很可能)是有误的

原文地址:Your Node.js authentication tutorial is (probably) wrong 我搜索了大量关于 Node.js/E...

34490
来自专栏FreeBuf

工具推荐: 汽车CAN总线分析框架CANToolz

aka YACHT (又一个汽车黑客工具) ? CANToolz 是一个分析控制局域网络CAN(Controller Area Network) 和设备的框架。...

28170
来自专栏Objective-C

iOS-微信支付(一)前戏

32950

保护微服务(第一部分)

面向服务的体系结构(SOA)引入了一种设计范式,该技术讨论了高度分离的服务部署,其中服务间通过标准化的消息格式在网络上通信,而不关心服务的实现技术...

15250

扫码关注云+社区

领取腾讯云代金券