介绍
长期以来,我个人的爱好就是分析和破解外部加密HDD硬盘驱动器。在此之前,我和我的同事Joffery Czarny以及Julien Lenoir曾经对下面这几款型号的设备进行过分析测试:
-Zalman VE-400
-Zalman ZM-SHE500
-Zalman ZM-VE500
而在今天的这篇文章中,我将会跟大家分享我对爱国者SK8671移动硬盘的分析成果。这块移动硬盘是我的一名同事给我的,它符合外部加密HDD的传统设计理念,并带有LCD信息显示屏以及一块用来输入密码的物理键盘。
注:本系列文章中的所有研究内容都是我个人在闲暇时间完成的,与我的公司没有任何关系。
硬件设备图如下所示:
爱国者SK8671移动硬盘外包装如下图所示:
用户必须输入密码才可以访问移动硬盘内的数据,而硬盘内的数据理应是经过加密处理的。
需要注意的是,硬盘本身提供的操作选项非常有限:
-在解锁之前按下F1键,可修改PIN码。
-PIN码必须为长度在6-9位之间的数字。
-采用了错误PIN码计数器,输入密码错误十五次之后会销毁硬盘中的所有数据。
硬件设计
当然了,我们首先要做的就是把设备的外壳拆开,然后看看电路板上都有哪些组件。拆开外壳的过程就是各种拧螺丝,然后拆开塑料外壳。最后,我们得到了如下图所示的组件:
主PCB板
这款设备的主PCB板设计其实非常简单:
我们从上往下看,最重要的部分分别为:
1. 连接LCD PCB板(CN1)的连接器;
2. 蜂鸣器(SP1);
3. Pm25LD010 SPI闪存(U2);
4. Jmicron JMS539 USB-SATA控制器(U1);
5. USB 3连接器(J1);
其中,SPI闪存存储的是JMS539固件以及其他的一些设置信息。
LCD PCB板
LCD显示屏的PCB板其实没什么特别的,其结构图如下所示:
电路板上的组件如下:
- 一个未知品牌的LCD字符显示屏(可能为中国产),带有串行控制接口;
- 一个连接键盘PCB板的带状连接器;
键盘PCB板
当我们开始分析键盘PCB板之后,有意思的地方就来了:
在键盘PCB板的背面,我们可以看到一个带状连接器和一个Cypress CY8C21434 PSoC 1 微型控制器(我一般把它称作“µC”或“PSoC”):
CY8C21434使用了M8C指令集,这种指令集在这份【汇编语言用户指南】中有详细介绍。
根据爱国者官方网站产品页上的介绍,这款产品支持CapSense,即Cypress的电容式键盘技术。你可以从一开始的电路板整体图片中看到,我焊接的是标准ISSP编程Header。电路分析
在分析一款硬件设备时,了解设备电路的连接情况可以很好地帮助我们对设备的运行机制进行分析。这款设备的电路板有一个相对比较“庞大”的连接器,我们可以使用一个连续测试模式下的万用表来识别电路板中的线路连接情况:
可能这样看的话电路板就有些乱了,所以我们给大家提供以下描述来帮助大家更好地理解: - PSoC代表的是数据表;
- 右边下一个连接器为ISSP头,网上的资料非常完整,这里就不再进行赘述;
- 最右边的连接器是连接到键盘PCB上的带状数据线;
- 加粗黑色框中画的是主PCB 板上的CN1连接器,它的线缆连接的是LCD的PCB板。P11、P13和P4连接的是PSoC针脚11、13和4;
攻击步骤
既然现在我们已经知道了这款设备的内部结构以及各个组件的情况,那么接下来我们就要对这款设备进行攻击分析了,而这里所采用的基本步骤跟我们之前分析设备时所采用的是一样的:
- 确保使用了基本的加密功能;
- 了解加密密钥的生成方法和存储方式;
- 寻找验证用户PIN码的位置(代码或功能组件);
但是在我们实际的分析过程中,我们的主要精力并不会放在破解该设备的安全性身上,我们的目标只是娱乐为主。我的实验操作过程如下: - 导出SPI闪存内容;
- 尝试导出PSoC闪存内存数据;
- 开始编写测试报告;
- 通过测试后发现,Cypress PSoC和JMS539之间的通讯数据中包含键盘记录信息;
- 当密码修改之后,SPI闪存中并不会存储任何信息;
- 我也懒得对JMS539固件(v8051)进行逆向分析了;
- TBD:完成针对该设备的整体安全性分析;
导出SPI闪存
导出SPI闪存内容这一步还是比较简单的:
首先,我们要将数据线跟闪存的CLK、MSOI、MISO和EN针脚相连接,然后使用一个逻辑分析工具(我使用的是Saleae Logic Pro 16)来嗅探通信数据。接下来,解码SPI协议并将分析结果以CSV格式输出。最后,使用decode_spi.rb对输出结果进行解析,并得到最终的SPI闪存数据。
需要注意的是,这种操作方法非常适用于JMS539,因为它会在设备的启动过程中从缓存将整个固件全部加载进来。
`$ decode_spi.rb boot_spi1.csv dump
0.039776 : WRITE DISABLE
0.039777 : JEDEC READ ID
0.039784 : ID 0x7f 0x9d 0x21
0.039788 : READ @ 0x0
0x12,0x42,0x00,0xd3,0x22,0x00,
[…]
$ ls —size —block-size=1 dump
49152 dump
$ sha1sum dump
3d9db0dde7b4aadd2b7705a46b5d04e1a1f3b125 dump`
不幸的是,我们在测试过程中这种方法貌似并没那么有效,因为当我们修改了PIN码之后,闪存内容并没有发生改变,而且在设备启动之后闪存内容也没有真正被访问过。所以说,我认为设备可能只存储了JMicron控制器(潜入了一个8051微型控制器)的固件。
嗅探通信流量
如果你想要弄清楚每一块芯片具体负责的是哪些任务,最好的方法就是检查其通信数据。我们都知道,USB-SATA控制器是跟屏幕相连接的,并通过CN1连接器和两个带状线缆与Cypress µC相连。所以我们用数据线与这三个相关的针脚进行连接,即P4、P11和P13。
接下来,启动Saleae逻辑分析工具,设置好触发器之后在键盘上输入“123456✓”。接下来,我们将会看到如下图所示的界面:
你可以看到三种不同类型的通信数据,在P4信道上是一些短脉冲信号,在P11和P13上大多是连续的交流信号。放大第一个P4脉冲信号(上图中蓝色线条标注的位置)之后,我们得到了如下图所示的数据:
你可以从上图中看到,P4脉冲信号大多都是70ms的纯规则信号,这种信号规则符合时钟的特征。但是在进行了进一步分析之后,我发现它只是用户每次按下物理键盘按键时发出了“哔哔”声…所以这部分数据对我们来说就没什么价值了,不过我们可以从中了解到PSoC对每一次键盘击键的注册信息。
可能有些细心的同学已经发现了,在第一张P4脉冲信号图中有一个跟其他不同的脉冲信号(“哔哔声”),而它代表的是“错误的PIN码”!放大了左后一个P4脉冲信号之后,我们得到了如下图所示的数据:
大家可以看到,这里我们得到的是有规则的电波信号,以及在最后“错误的PIN码”出现之后的信号变化模式。
一般来说,双线协议通常是SPI或I2C,而Cypress数据集表明这些针脚跟I2C有关,这也符合我们的测试情况:
USB-SATA芯片会不断地让PSoC去读取键位状态,默认情况下为“0”,当用户按下键盘“1”之后,状态值将会改变成“1”。当用户按下“✓”键之后,如果用户已经输入了有效的PIN码,则最终的通讯数据将会发生改变。但是,我现在还没有对实际的传输数据进行测试,不过传输的内容中似乎并没有加密密钥的存在。
总结
在本系列文章的上集中,我们对爱国者SK8671移动硬盘的内部构造以及电路板运行情况进行了分析,在本系列文章的下集,我们将会告诉大家如何导出PSoC内部闪存数据,感兴趣的同学请关注《安全客》的最新资讯。