我的位置 态势感知  >  安全态势

深度 | 水滴实验室:无线信号分析之-滚动码安全

来源:关键基础设施安全应急响应中心 时间:2020-02-20 阅读次数:

作者:水滴实验室

单位:恒安嘉新

随着科技的发展生活之中的无线电在工控和物联网应用相当的广泛,生活之中接触的最多的设备是收音机、电视机、移动电话、无线路由器、无线键盘与鼠标、对讲机、无人机,还有车钥匙,本文讲解遥控钥匙之中的滚动码,遥控钥匙深入我们生活的方方面面,例如在爆破遥控、行吊(也就是常说的吊车)、汽车防盗、车库遥控、大门遥控、道路施工使用的小型太阳能红绿灯、家用继电器遥控开关等,试想一下如果黑客攻击了这些设备去控制红绿灯信号、吊车的操作、开走汽车甚至遥控爆破信号,会对大众的生活和社会的稳定造成多大的危害。本文将通过介绍无线信号中常见的固定码与滚动码,进一步分析其中的安全隐患与攻击面。

0x00什么是固定码与滚动码

1、固定码:是指每次发送出去的地址码固定不变,这类的芯片遥控比较容易拷贝。下面以PT2262芯片举例说明,一帧信号的编码格式为8位同步码+20位地址码+4位数据码。

8位同步码为的是让接收端准备接收信号,然后确认20位地址码(地址码固定不变)是否是发射端,4位数据码来区分功能,例如开锁、关锁、开启警报、一键启动等,由这三部分组成的固定码遥控系统。

2、滚动码:是指每次发送出去的码都不一样,通过算法完成滚动的功能。以Keeloq举例说明,一帧信号的编码格式为: 前导码+同步引导码+滚动码+序列号+功能码+状态码。每次按下遥控同步计数器都会每次递增向前滚动,所以称之为滚码,接收端接受到密文之后,通过厂家的密钥进行解密,解密之后得到同步计数和编码器序号,检测编码器序号是否与接收器的序号对应,再去检测同步计数是否在同步窗口内,然后执行用户所执行的功能,例如开锁、关锁、开启警报、一键启动等。

图1 滚码信号样本

0x01 滚动码攻击方式
1、重放攻击
 

因为并未采用密码随机或未增加时间戳,所以这个协议很容易受到重放攻击,模拟一个攻击场景,在办公室中录制放在桌子上汽车钥匙的无线信号,再去地下室把这段信号重放出来即可开启车锁,或者是进行信号干扰,发射一个干扰的信号,使车辆无法接收车钥匙的滚码信号,同时录制解锁车辆的第二次尝试信号,如果车主进行第二次按下遥控,才会将第一次拦截下的信号发射出来,并且保存下来第二次的信号去再次开启车辆。

这里介绍一下Samy Kamkar在2015年研究出来的RollJam,在美国拉斯维加斯举行的Defcon黑客大会上介绍了他所开发的一套智能系统(RollJam设备),它可以突破”滚动码”的安全防护并且拦截和重放无线电信号,入侵者可将RollJam隐藏在目标车辆车身上或车辆、车库的不远处。当毫不知情的车主在无线电频率范围内使用遥控钥匙时,会发现尝试一次后,遥控钥匙不起作用。但过一会再按一次钥匙按钮,仍可以让汽车或车门上锁或解锁。而入侵者可在任何时候取回RollJam设备,通过按压设备上的一个小按钮,得到从车主遥控钥匙上截获的密码,并使用这一密码随心所欲的开启汽车或车库门。

在按下遥控器的时候同时进行信号干扰,使车辆无法接收到正常的信号,然后再将信号重放出来达到解锁目标车辆的效果。 

图2 RollJam

2、滑动攻击
 

Bogdanov的论文中提到使用滑动计数和有效的线性近似进行了密码分析,使用滑动代数的方法攻击keelog,需要用到一个完整的密钥字典,可以通过使用更多的字典来提升滑动攻击的成功率,但是大大的增加了破解的时间

3、旁路攻击
 

对电路进行差分信号分析,可以通过使用电阻器和示波器测量目标IC的功耗。或者可以使用近场探头测量电磁辐射来提取设备的密钥

4、已知密钥分析
 

已知密钥生成算法,到了密钥还有序列号的情况下,那么就可以计算出编码密钥,通过编码密钥解密滚动码的数据了。

5、无钥匙进入攻击
 

常见的有13.56Mhz和125khz的RFID卡的遥控钥匙,当钥匙进入一定区域内就会发出信号,让车辆解锁,可以模拟一个信号去让车钥匙发出信号,通过无线信号中继的方式达到车辆解锁。 

 

图3 汽车接收位置

图4 树莓派搭建的无钥匙进入系统

6、拆解法
 

可以去拆解车辆的防盗盒将目标的存储芯片拆解下来利用编程器读取固件,在固件里面去添加钥匙或者找到密码根据算法解密出相应的数据。 

图5 防盗控制器

图6 防盗控制器拆解

拆解后找到存储芯片,可以拆焊下来读取或者直接接线进行读取内部的数据,不过读取的数据是加密的,需要进行异或来解密数据,再去进行分析。 

图7 固件内容

当然在这里的密码是需要进行换算的

图8 密码转换表

固件中的密码:F3 67 4F 0B 换位后:3F 76 F4 B0 换算后正确的密码:84 CD 4F 0B

获取到正确的密码后可以最后在原有的基础上进行添加钥匙。

0x02 滚动码分析

通过上一章节,了解了常见的滚动码攻击方式,下面具体了解一下如何进一步分析滚动码信号,进而完成这些攻击手法。

1、Keelop分析
 

这里讲解一下对keeloq的安全性分析,首先先了解一下它的特性:

可编程的28位序列码、可编程的64位加密密钥、同步计数器(每次发送都是唯一的)、66位发送码长度、32位滚动码(4位功能码、2位溢出码、10位识别码、16位同步计数值)、34位固定码(28位序列号+4位功能码+2位状态码)。 

图9 keeloq加密算法

HCS201采用的就是keeloq滚码编码方式,将非线性加密算法生成的32位滚码与28位序列号和6个信息位(4位功能码+2位状态码)组合而成,形成一个66位的编码字,常见应用于汽车RKE(Remote keyless Entry)系统。 

图10 HCS201框图

其中密钥、序列号以及配置数据都存储在EEPROM阵列中,这里的数据是可以编程的,但是开启了读取保护,主要是为了阻止获取密钥或同步计数值,当然也可以对单片机进行解密进行获取。

2、信号分析
 

图11 Bit编码规则
图12 信号样本

这里我们需要用到的是滚动码与序列号

32Bit滚动码:

10100110100111111010000010010100

转化后:

00101001000001011111100101100101

//这里转换需要倒序

16进制:2905f965

//16进制转换结果28Bit序列号

28Bit序列号:

0101101101000001100010011100

转化后:

0011100100011000001011011010

16进制:39182da

4Bit功能码+2位状态码001011

以下是研究员参考代码:

#include<stdio.h>#include<stdlib.h>#include<string.h>#define KeeLoq_NLF 0x3A5C742E#define bit(x,n) (((x)>>(n))&1)#define g5(x,a,b,c,d,e) (bit(x,a)+bit(x,b)*2+bit(x,c)*4+bit(x,d)*8+bit(x,e)*16)typedef unsigned long int uint32_t;typedef unsigned long long int uint64_t;typedef unsigned long u32;typedef unsigned long long u64;uint64_t key;uint32_t KeeLoq_Encrypt(const uint32_t data, const uint64_t key){uint32_t x = data;uint32_t r;for (r = 0; r < 528; r++){x = (x >> 1) ^ ((bit(x,0) ^ bit(x,16) ^ (uint32_t)bit(key,r & 63) ^ bit(KeeLoq_NLF,g5(x,1,9,20,26,31))) << 31);}return x;}uint32_t KeeLoq_Decrypt(const uint32_t data, const uint64_t key){uint32_t x = data;uint32_t r;for (r = 0; r < 528; r++){x = (x << 1) ^ bit(x,31) ^ bit(x,15) ^ (uint32_t)bit(key,(15 - r) & 63) ^ bit(KeeLoq_NLF,g5(x,0,8,19,25,30));}return x;}int main(int argc, char* argv[]){unsigned long sn = strtoul(argv[1],NULL,16);long unsigned int datad,Msb,Lsb,Key_data;unsigned long data = strtoul(argv[2],NULL,16);key = 0xB3E5625A8CCD7139;Msb = KeeLoq_Decrypt(sn + 0x60000000,key);Lsb = KeeLoq_Decrypt(sn + 0x20000000,key);Msb = Msb << 32;Lsb = Lsb << 32;Lsb = Lsb >> 32;Key_data = Msb + Lsb;printf("%lX",Key_data);printf("\n");datad = KeeLoq_Decrypt(data,Key_data);datad = datad << 32;datad = datad >> 32;printf("%lX",datad);printf("\n");return 0;}

4(功能码)2da(为39182da的后三位)5611(同步计数值)

增加同步计数值则可以计算出下一次开锁的数据,并且修改功能码则可以达到开锁关锁开启后备箱等功能了。

0x03 总结

本文中介绍的滚动码不同于之前的固定码分析,可以看出多了溢出码、识别码、同步计数值、序列号、状态码等,介绍的这些攻击方式是比较基础的攻击方式科普,感兴趣的同学可以用实验的方式捕获信号进一步分析练习。

参考

https://en.wikipedia.org/wiki/KeeLoq

http://unicorn.360.cn/hackcube/forum.php?mod=viewthread&tid=17&extra=page%3D1

https://blog.csdn.net/islq/article/details/7077887

 

 

原文来源:关键基础设施安全应急响应中心

8条评论