在本文中,我们将为读者介绍如何通过破解三星手的固件,让其变身为NFC安全研究的利器。
破解三星NFC芯片固件
最近,我一直在研究如何将我的旧智能手机玩出点新花样;同时,我这个人也怕麻烦,所以,最好仅仅通过获取root权限就能达成目标。众所周知,智能手机包含了大量的硬件,由于它们出厂前已经被锁定,所以,通常只能用于“常规”用途——既然我们要玩点新花样,我们不妨对其进行“深入”修改,把手机变成一个高效的安全研究工具。
Wi-Fi监听模式
对于标准无线网卡来说,通过其监听模式,就可以嗅探Wi-Fi流量并破解WPA密钥。也就是说,通过改变无线网卡的运行模式,我们就能在更低的级别上接收所有流量,从而获取大量以前无法获取的信息。
在智能手机上,我们可以通过多种方式实现上述目的。许多高通骁龙CPU都直接支持这个功能,如果已经破解了手机的root权限,则可以使用以下命令将手机设置为监听模式。
echo 4 > /sys/module/wlan/parameters/con_mode
对于高通芯片组来说,这个过程可能会稍微复杂一些,因为不仅需要给内核打补丁,还要对固件进行定制,值得高兴的事,网上有许多公开的资料可以帮助大家完成这些任务。
尽管许多基于Android的安全工具都对这一功能提供了直接的支持,但是,如果你有兴趣的话,也可以通过切换根目录的方式,亲自搭建利用这些功能的环境。
根目录切换
当我获取了手机的root权限的手机来说,都会将根目录切换到核心数据分区中。在基于Debian的操作系统中,可以通过“qemu-debootstrap”命令轻松地生成一个指定CPU架构和版本的Debian根文件系统。一般情况下,我们习惯于将所需的命令放到手机上的“/data/local/userinit.sh”文件中(一个通常在Android设备启动时运行的脚本),这样的话,就能在不影响Android内核操作系统的情况下,为这个切换过根目录的环境提供对手机硬件的访问权限,同时,还可以启动一个SSH服务器,以便直接进入这个环境。
mount -o remount,rw /data
mount --bind /proc /data/debian_arm64/proc
mount --bind /sys /data/debian_arm64/sys
mount --bind /dev /data/debian_arm64/dev
mount devpts /data/debian_arm64/dev/pts -t devpts
chroot /data/debian_arm64/ /bin/bash --login -c /usr/sbin/sshd &
USB设备仿真
Linux系统,特别是在嵌入式设备上的Linux系统,通常能够仿真一个USB设备。在安卓系统上,内核通常会针对用户非常有用的特定功能进行编译的;对于普通用户来说,这些功能包括MTP、PTP、tethering,对于更高级的用户来说,这些功能还包括ADB。这些通常是作为内核的一个静态功能来编译的,然后,根据设备的/sys/目录下的设备文件进行有限的修改即可。你可以通过下载手机内核的源代码(通常可以在网上找到),并改变配置来启用大量的模块,以实现各种各样的功能。
其中,我最喜欢的是Gadget Filesystem模块,这是一个允许操作系统的用户空间控制USB功能的模块。这样,只要配置正确,任何嵌入式Linux设备就可以像USB设备一样处理了。实际上,只要你能够用自己喜欢的编程语言来访问文件,就能达成上述目的。对于我来说,我更喜欢使用C语言来做这些事,比如模拟设备,或者利用USB堆栈的漏洞等。
NFC功能
虽然这些功能都很有趣,也很容易实现,但我发现,在Android设备中NFC芯片的低级功能的研究方面,却鲜见相关的报道。虽然标准的Android设备能够充当读卡器,并具有一些有限的标签仿真功能,还能够作为一些高级数据的中继工具,但它的功能是非常有限的;这些功能在NFC攻击工具通常都可以找到。
对于Proxmarks、Chameleons以及其他入门工具来说,不仅能够通过NFC进行原始级别的通信,并且能够进行一些在手机(即便获得了root权限)上根本无法实现的攻击。原因在于,手机在通过NFC通信时,是通过与专门为此而构建的辅助芯片进行通信的。因此,我决定选择一部手机,看看能否通过修改其NFC芯片的固件,从而将一部标准智能手机变成NFC攻击工具。
三星S6——SM-G920F
我的第一个目标是三星S6,我打算拿它来做实验。我曾经研究过这个手机的功能,并修改过其内核,甚至用Debian替换过其Android操作系统,我觉得或许这次能够玩出一点新花样。
通过查阅手机的文件系统和相关资料,我发现它使用的是Samsung Semiconductor开发的芯片,这在网上的散件市场上非常少见,因为这款手机的美国版本使用的是完全不同的芯片组。不过,该手机的所有非美版本却都采用了这款芯片。
NFC控制器:S3FWRN5
经查,该芯片为S3FWRN5,这是一款2014年开发的芯片,在Galaxy S6和Note 4手机中都使用了该款芯片。经研究表明,它的一个关键功能就是安全更新固件,这意味着在手机的文件系统的某个地方,很可能存在一个固件二进制文件。
虽然我设法在网上购买了一颗芯片,然而,我决定要从手机上完成所有的逆向工作,所以最终没有在项目中用到它们。
基本通信
当你在Android设备上查看硬件通信时,你就会发现,这与在任何嵌入式Linux设备上查看通信的方式没啥区别:通过ADB,导航到“/dev/”文件夹,并查看可用的设备文件。通过查看三星手机的内核源码,我很快就搞清楚了该芯片是如何与手机进行通信的,并注意到它是使用I2C进行通信的,并且GPIO引脚用于设置电源模式。这些在文件系统中很容易通过“/dev/i2c-*”和“/dev/gpio*”文件进行访问。
然而,我发现该芯片的内核驱动程序将其抽象为一个单一的设备文件“/dev/sec-nfc”,并且,这个文件是利用IOCTL来设置电源和模式的,并且可以通过写入和读取操作来发送和接收数据。
NCI通信
对于标准的NFC芯片来说,它们是使用称为NCI的标准协议进行通信的。该协议由基本的命令头构成,用于提取和限制功能,以降低交互的复杂性。每个NCI命令由以下元素组成。
GID:包含功能组标识符的字节(核心、射频、厂商特有特性等)。
OID:包含特定操作标识符的字节。
长度:包含参数长度的字节。
有效载荷:与操作有关的数据,最多为0xFC字节。
该协议的功能非常强大,通过将复杂的通信下沉到了芯片本身,从而有效降低了NFC操作的复杂性。
非标准NCI功能
NCI在协议中加入了一些扩展元素,从而帮助制造商在标准要求之外扩展其功能,如针对芯片的配置信息,或为芯片增加隐藏功能。
其中最关键的是组ID 0xF。这个组是专门为厂商特定的命令而引入的,可以添加任何非标准功能。人们可以通过发送带有递增操作ID的命令和检查错误响应来暴力破解这些命令,即使它们没有被记录在文档中。在NCI中,这些函数是最有可能包含我们感兴趣的或含有安全漏洞的特性,因为它们没有文档化的标准。
下面就是一个很好的例子,三星的S3FWRN5会利用这些命令来设置通信频率值。
S3FWRN5的固件更新
据我所知,所有NFC芯片的固件更新都会使用自己的协议。虽然这些协议仍然使用与核心NCI通信相同的端点,就S3FWRN5来说,它使用的是I2C,但协议本身是不同的,并且经常需要进入到一个特殊的模式来执行这些操作。在S3FWRN5中,芯片是通过IOCTL进入引导加载器模式后,才能进行固件更新。
我发现,在手机的“/vendor/firmware/”分区中可以轻松找到固件更新文件,即“sec_s3fwrn5p_firmware.bin”文件。
我想跟踪一个完整的固件更新过程,并希望记录它是如何执行的。之所以这样做,是为了加快分析进程:虽然实现固件更新的源代码是在线的, 但是我觉得通过分析实际的通信过程,可以快速直观地掌握更新的具体步骤。为此,我修改了手机上的“.rc”配置文件,特别是与NFC芯片相关的文件。并且,我发现了一个文件,其中不仅包含了固件目录,而且还包含了提高数据跟踪级别的配置,甚至包括手机是否总是在启动时执行固件更新方面的信息。我对该文件进行了修改,以满足我的相应需求。
固件更新协议分析
通过修改这些功能,我发现只要我在手机上启用NFC,就可以通过Logcat追踪固件更新过程。通过过滤这些数据,我就能够获得更新过程中每个方面的完整视图。
通过这个日志,可以轻松看出更新是如何进行的。它使用了一个四个字节的头部,然后是有效载荷数据。
0x00:命令类型
0x01:命令
0x02-0x03: 有效载荷大小
0x04-0x100:有效载荷数据
我还注意到,每次交替命令都会设置传输的第一个字节的高位。
S3FWRN5固件文件分析
在考察了这些更新的细节后,我进一步深入研究了更新文件。在此过程中,我们看出了到哪些部分是元数据,哪些部分是值得研究的模拟更新。
我注意到一个明显的日期戳(图中用红色高亮显示),其后可能是一个版本号,然后是一些地址信息,这很可能是与该文件相关的元数据。
在绿色的方框中,我注意到了大量的高熵字节,这很可能是一个加密签名,它的起始地址在元数据中被注明。签名的存在意味着这不仅仅需要进行逆向工程,同时还需要绕过签名机制。
最后,在蓝色的方框中,我注意到了这些数据更趋向一致,所以,这很可能是固件的起始地址。通过查看更新中发送的命令,也证实了这一点。这个固件代码的低熵意味着它也是未加密的。
确定CPU的架构
如果能够了解固件的架构的候,对我们的进展将会非常有利。由于这是一个原始的二进制文件,因此没有提供有关架构的任何细节或关于芯片的任何其他信息。根据我的猜测,该芯片很可能采用了8051架构,因为该架构经常在嵌入式NFC芯片中被发现;或者是ARM Thumb架构,因为这是近年来嵌入式芯片组中最常用的架构。
所以,我决定先检查是是否为Thumb的代码,因为它有一个速记符,可以马上帮助我们了解该判断是否正确。Thumb中一个常见的操作是“BX LR”,这个操作用于在函数中返回没有推送或弹出任何寄存器的链接寄存器的分支。由于这种操作的性质,在Thumb固件中会大量出现。“BX LR”的操作码是0x70 0x47,用ASCII码表示为“pG”。通过在二进制文件上运行strings命令,并查找这个值,你可以很容易地判断一个芯片是否使用Thumb代码。幸运的是,就这里来耍,它确实在使用Thumb代码。
这真是太好了。首先,这意味着该芯片很可能会利用Cortex-M风格或Securcore架构。这些都是基于ARM的架构,有明确的标准。此外,Thumb代码比其他常见的嵌入式架构的代码更易于分析、逆向和修改。
小结
在本系列文章中,我们将为读者介绍如何通过破解三星手的固件,让其变身为NFC安全研究的利器。由于篇幅太长,我们将作为三篇发表,更多精彩内容,敬请期待。
本文翻译自:https://www.pentestpartners.com/security-blog/breaking-samsung-firmware-or-turning-your-s8-s9-s10-into-a-diy-proxmark/如若转载,请注明原文地址: