新网Logo
首页>互联网热点>

通过破解固件,让三星手机变身 NFC 安全研究利器(一)

登录 注册

通过破解固件,让三星手机变身 NFC 安全研究利器(一)

  • 来源:网络
  • 更新日期:2020-08-28

摘要:在本文中,我们将为读者介绍如何通过破解三星手的固件,让其变身为 NFC 安全研究的利器。破解三星 NFC 芯片固件最近,我一直在研究如何将我的旧智能手机玩出点新花样;同时,我这个人

在本文中,我们将为读者介绍如何通过破解三星手的固件,让其变身为 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 安全研究的利器。由于篇幅太长,我们将作为三篇发表,更多精彩内容,敬请期待。