赎回咖啡的新鲜气味

2020-09-27 04:56:16

我们通过修改咖啡机的固件,把咖啡机变成了一台危险的索要赎金的机器。在我们可以的时候,能不能让别人也来做呢?正如你可能预料的那样,答案是:是的。跟随我们的旅程,我们将向您展示固件就是新软件。

一些研究非常有趣,它证实了我做这项工作的原因。我被要求证明一个神话,称之为怀疑,即对物联网设备的威胁不仅仅是通过薄弱的路由器或接触互联网来访问它们,而且物联网设备本身也是脆弱的,在不拥有网络或路由器的情况下可以很容易地拥有它。我还打赌我可以让这种威胁持续存在,并给任何用户带来真正的危险。我们经常说,您的家庭网络被认为是一条信任链,其强大程度取决于其最薄弱的环节,但如果设备级别也是如此,情况又会怎样呢?那是什么意思?

假设您有一个物联网设备,该设备通过可通过定义明确的API访问的功能得到很好的保护;即使您可以通过API控制该设备,您可能也不会造成太大危害。除了固件,设备内部的编程有逻辑限制,例如,当有人挡住车库门或过热导致设备燃烧时,不允许您关闭车库门。

我们过去常常相信,硬件(如普通厨房电器)是可信的,不拆卸设备就不能轻易更改。但有了今天的“智能”家电,情况就不再是这样了。

我的同事们经常听我说,“固件是一种新的软件。”而且这个软件经常是有缺陷的。我们随处可见。CPU缺陷,以及生成容易破解的弱密钥的密码芯片。物联网安全状况的减弱在很大程度上是因为,如今,将处理器置于基于称为固件的短程序来控制和协调所有硬件部件、电机、传感器、加热元件等的设备中,更加方便和廉价。该解决方案不仅价格便宜,而且还具有一个重要的特性--可更新换代。

回到过去,如果一块硬件存在所谓的设计缺陷,僵化的设计(通常是硬连线)意味着供应商将需要更换整个组件或逻辑板,甚至需要更换整个设备。制造商将不得不改变制造流程,并可能造成巨大的经济损失。在固件时代,只需发布固件更新即可轻松缓解这一问题。

更新固件的过程可能有很大不同,从使用特殊工具连接到特殊设备(仍需要供应商的物理交互)到越来越流行的OTA(空中)更新方式。在这种情况下,供应商不必亲自到场,整个过程要么通过互联网自动完成,要么在用户通知并批准更新后半自动完成。

让我们看看我们都有些什么。我们有一个咖啡机,可以让你用老式的方式煮咖啡,只需按几个按钮,或者通过手机或平板电脑使用应用程序。该制造商使用Wi-Fi操作,当你打开包装盒时,你必须通过手机上的一个配套应用程序将其连接到你的网络。当第一次开机时,咖啡机在本地模式下工作,它会创建自己的Wi-Fi网络,希望喝咖啡的人首先连接到这个网络,以便设置设备。

当我们下载配套的应用程序时,我们看到它可以让你创建这个特定供应商的任何智能设备的网络,并将这些设备连接到家庭网络,然后允许你控制你的咖啡机或智能水壶的所有功能。它还允许您检查设备的固件版本,并根据需要进行更新。

这个设备所说的协议已经被其他几位研究人员在互联网上记录在案。不出所料,它是一个简单的二进制协议,几乎没有任何加密、授权或身份验证。与机器的通信在TCP端口2081上进行。该命令的格式非常简单:

RESPONSE_TYPE因命令而异,但一般规则是:如果响应包含数据RESPONSE_TYPE=COMMAND+1,如果它只是一个状态,那么RESPONSE_TYPE=3,那么只有一个数据字节包含结果状态,其中1表示成功。完整的命令列表在GitHub存储库中。

您可以根据咖啡机的默认设置为自己泡一杯/几杯不错的咖啡。如您所见,没有安全性,因此任何人只要能够访问网络并能够到达咖啡机的IP地址,就可以控制它。更有趣的是,当设备还没有加入家庭网络时,所有这些命令也可以通过默认打开的Wi-Fi网络使用。

让我们回到我们的主要目标,为邪恶的目的劫持咖啡机。更新过程的安全性如何?我们能破门而入吗?我们甚至可以更改固件来做一些不同于最初计划的事情吗?我们能把这个装置变成物理上危险的装置吗?我们能远程做吗?正如我在开始时所说,最薄弱的一环总是会损害整个系统。要么是网络,要么是设备。我们的目标是回答所有上述问题,并证明物联网设备也可能在固件级别受到威胁。

首先,我们想了解更新过程是如何工作的。我们有几个选择来做这件事,但我们已经有了一个基于我们过去做过的类似研究的食谱。一般规则是使其尽可能简单;以下是我们在尝试反向更新固件过程时的待办事项列表。

首先,我们需要以某种方式获取固件,同样有几个选项。让我们坚持规则,先选择最简单的:

Google It-尽管看起来很明显,但有时安全研究人员会省略这一步,这可以为他们节省大量工作。固件通常可以在互联网上下载。

捕获和分析网络流量-如果协议未加密,最简单的方法是只捕获网络流量,在这种情况下,我们还有三个要查看的选项。

对配套的应用程序进行分析和反向工程。在我们深入研究这款设备之前,建议先浏览一下设备的配套应用程序,这通常是获取通信协议和命令的最简单的解决方案。上面这些都没什么结果吗?现在可以拆卸设备,跟踪电路板以识别所有组件,获取数据手册以查找调试端口,并可能直接从芯片转储固件。这真的是硬件领域的一次冒险,并不是每个人都适合。

生活没有那么简单,逆向工程物联网设备也不是那么简单。事实证明,我们不得不综合使用上述所有技术。首先,我们在谷歌上搜索了一下,因为已经记录了这些命令,所以我们找到了一个命令,上面写着“更新固件”。但命令本身(其参数和格式)并未记录在案。因此,通过发布:

咖啡机进入更新模式(在较新的固件上,您必须按一个按钮才能真正开始更新,但较旧的版本不是这样!)。

嗯,不错,但是什么都没发生。通过分析网络流量,我们得出的结论是没有什么需要分析的,因为在此阶段没有流量从咖啡机流出。因此,我们尝试了Android同伴应用程序。

您可以看到UPDATE按钮是灰色的,所以很明显,固件是最新的,没有简单的选项来推送固件更新来查看网络流量中的内容。这里有趣的是遗漏了什么。无论是咖啡机还是应用程序都没有与互联网的通信。那么,应用程序怎么可能知道咖啡机有最新的固件呢?当应用程序向机器询问固件版本时,唯一通过的数据包是机器和应用程序之间的数据包。

这很奇怪,它似乎告诉我们固件可能不在互联网上,肯定是应用程序的一部分。因此,我们打开.apk文件就像打开.zip文件一样简单。我们在那里的发现证明了我们的假设。

固件是Android应用程序的一部分,这也意味着新版本的固件总是与新版本的应用程序一起提供。如果你仔细考虑一下,这是完全有道理的。新的固件通常会添加新的功能,这些功能必须以某种方式反映在应用程序的用户界面中,而且它允许我们在甚至不接触设备的情况下找到包含固件的文件。这很好,而且不是很常见。

在我的下一步研究中,我们试图找出文件包含的内容。任何反向工程师都会做的第一件事就是浏览一下文件,看看它包含了什么。我们看到的是一串真正有意义的弦。由此,我们可以推断没有加密,固件很可能是直接上传到咖啡机闪存中的“明文”图像。

为了能够理解固件需要做什么才能将二进制文件解码成程序集,这意味着我们需要知道该固件所针对的处理器或体系结构。

我们可以猜测,也可以做实验。或者,我们可以从设备上下来,以最老式的方式获取有关硬件的信息。因此,在拧下几个螺丝,取下几个塑料盖子之后,我们终于拿到了一块电路板。它看起来是这样的:

我们马上可以看到,有一个组件我们已经非常熟悉了。ESP8266模块。这是一种非常常见的芯片,提供Wi-Fi功能,被制造商广泛用作许多设备的Wi-Fi调制解调器,甚至用作设备的主CPU。这一次不是这样的。我们找出了其他看起来很重要的芯片,并得出了不同的结论。

在这种情况下,主CPU,也是整个咖啡机的真正核心,是一个ARM Cortex M0处理器,它控制所有连接的设备(咖啡机、咖啡盖、水位传感器、热床加热器、主加热器、显示器、按钮和“丢失的瓶子”传感器)。为了便于理解,我们给出了整个制造者的框图:

我们可以看到,ESP8266只是用作WiFi调制解调器,为主CPU提供WiFi功能(这听起来可能很有趣,因为ESP8266的功能是主CPU的许多倍,内存也比主CPU大得多,但这是真的)。不管怎么说,我们已经拿到我们要的东西了。现在我们知道了CPU的确切类型,我们可以下载数据表并提取一些基本信息,这些信息将帮助我们确定从哪里开始反汇编。

我们知道这款CPU很初级,资源也很有限,不会有操作系统让RE变得更容易,因为没有太多代码要处理。在本例中,我们使用IDA(交互式反汇编程序),经过多次尝试和错误尝试后,我们将二进制文件加载到起始地址0x08004000。通常,CPU从0x08000000地址开始执行,但后来我们发现,在地址空间的开头有第二个自定义引导加载器(那里有一段代码,用于更新芯片上剩余的代码),它负责升级过程,并且总是作为安全位置运行,以防更新过程中出现问题。当您发现自己身处未知固件的陌生之地时,您通常会在IDA中得到类似于以下内容的信息(这是我们在威胁实验室中经常使用的工具,通常用于对恶意软件和未知代码进行反向工程):

我们看到许多未命名的例程和字符串列表。现在,真正的工作开始了。你必须找出哪个程序有什么作用,然后慢慢地把整个过程拼凑在一起。这是个喜好问题,但我通常从弦乐开始。从字符串中,您通常可以推断哪些函数使用该字符串,并且根据该引用,您通常可以发现该函数的作用。它还有助于首先确定最常见和引用最多的函数。具体地说,在IoT的情况下,一个很好的线索可能还是识别内存映射的I/O引脚,因此当您看到对此类内存的引用时,您就知道该函数涉及附加的一些硬件组件。让我们跳过冗长的分析部分,让我们给您展示一些精选的内容。

虽然我们没有逆转所有的功能,但我们得到了大部分重要的功能。我们还发现了存储按钮状态和通过Wi-Fi接收数据的全局变量,以及控制显示器和所有小工具的例程。我们还找到了分配和释放内存、蜂鸣音、延迟等函数。我们找到了执行所有子函数的程序的主循环以及主命令例程-即基于网络上接收的数据包执行命令的函数。这使我们能够创建咖啡机能够执行的所有远程命令的列表,并将它们与以前的研究相匹配,甚至扩展它。

在颠倒整个固件之后,我们确切地知道每个外围设备连接到哪里,如何控制它,以及咖啡机能够执行的所有命令。最有趣的是固件升级例程本身。仔细查看处理引发“更新”屏幕的命令的函数后,发现咖啡机将某些内容记录到EEPROM存储器中并执行重启。所以现在很明显,更新过程是由引导加载程序处理的,而引导加载程序不是固件包的一部分。此外,当“更新”消息出现在屏幕上时,Wi-Fi的名称也会从“Smarter Coffee:xx”更改,其中xx与设备MAC地址的最低字节相同。所以很明显,即使你的咖啡机连接到了你的家庭网络,更新也总是在“接入点”模式下通过Wi-Fi完成的。

当我们试图逆转更新协议时,我们有几个不同的选择。因为我们知道里面有什么处理器,所以我们可以尝试将整个固件(包括引导加载程序)从芯片中转储出来,并对引导加载程序进行反向工程。我们采用了一种更简单的方法,决定对Android应用程序进行反向工程,并找到更新部分,因为它通常比CPU汇编语言更容易阅读反编译的Java代码。我们花了一段时间,但我们确定并记录了整个过程:

这里令人惊讶的是,更新过程没有使用固件的任何加密或签名。所有的东西都是通过不安全的WiFi连接以明文传输的,唯一的检查是最后的CRC。

现在我们有了尝试第一次更新所需的所有信息。我们使用Python实现了一个简单的上传器,它分两个步骤工作。首先,它尝试找到咖啡机的Wi-Fi,然后连接到它(默认情况下,咖啡机总是可以在192.168.4.1端口2081上访问)。通过发送“START UPDATE COMMAND”,咖啡机将自己切换到更新模式。

脚本等待Wi-Fi从“Smarter Coffee:xx”更改为“Smarter Coffee Update:xx”。一旦发生这种情况,它会再次连接到相同的地址,并使用前述过程发送新固件。对于初学者,我们刚刚发送了一个略有更新的固件版本,该版本没有显示“Missing Carafe”,而是显示了以下内容:

因此,更换固件的整个过程大约需要花费几分钟。15-25秒,全自动。

有趣的是,显示器没有字体或文本输出,您在屏幕上看到的所有内容都以图像的形式存储在固件中。因此,例如,有关于杯数(1-12)的图像。图像是黑白的,编码非常简单,如下图所示:

现在我们已经拥有了创建我们自己的修改后的固件所需的一切。最初,我们想证明这个设备可以挖掘加密货币的事实,考虑到CPU和体系结构,它当然是可行的,但是在8 MHz的速度下它没有任何意义,因为这样一个挖掘器的产值将可以忽略不计。

我们决定把咖啡机变成一台勒索软件机,在那里有一个特定的触发器来启动赎金信息。它看起来完全是无辜的,工作正常,直到被攻击者扣动扳机,这让它变得更加令人惊讶。

为此,我们劫持了最初用于将制造商连接到网络的命令之一,以便当用户尝试将机器连接到家庭网络时,用户可以自己无意中触发赎金行为。

我们使用固件末尾未使用的内存空间来创建恶意代码。通过使用ARM组装器,我们创建了勒索软件,当触发该软件时,使咖啡机无法使用并要求赎金,同时打开温床,永久性地分配加热元件,并永远旋转研磨机,显示赎金信息并发出嘟嘟声。我们认为这足以吓坏任何用户,让它成为一种非常有压力的体验。此时,用户唯一能做的就是从电源插座上拔下咖啡机插头。

现在我们已经证明了可以在不接触咖啡机的情况下改变咖啡机的固件,让我们来看看你是如何以攻击者的身份拿到咖啡机的。我们有什么可能性,我们能不能克服更新固件版本的“安全”措施,即设备所有者需要在更新发生之前按下Start(开始)按钮。

+易于执行-需要物理接近,咖啡机必须处于未配置状态(未连接到家庭网络)。

此攻击选项可能影响最小。要执行此操作,您需要访问该设备,或者至少需要在其Wi-Fi信号范围内。如果设备已经连接到家庭网络,您可以使用解除身份验证攻击,因为当设备无法连接到预设的WiFi网络时,它也容易受到“默认-后退到Wi-Fi接入点模式”的攻击。我们来看一下这次攻击的方案:

攻击者发出“UPDATE START”命令,随后Wi-Fi将其名称更改为“Smarter Coffee Update:xx”。然后,攻击者开始向机器发送修改后的固件。

+可以远程完成-需要首先接入网络,并且需要网络内支持Wi-Fi的设备/路由器,如果咖啡机运行在更新的固件版本上,用户需要按下按钮确认更新。

这是一种非常常见的情况,攻击者首先闯入家庭网络。这次攻击的关键部分是找到一种可以控制Wi-Fi的设备。当然,理想的候选设备是Wi-Fi路由器。

由于咖啡机在升级固件时总是将自己变成Wi-Fi接入点,因此你需要一个网络内部的设备来连接到它。这通常是任何路由器的常见功能,因此在短时间内,您可以轻松地将路由器重新配置为客户端,而不是Wi-Fi接入点。因为更新过程很短,所以中断应该很难察觉。有些路由器甚至能够使用单个无线电同时充当客户端和接入点。

此攻击是前一个攻击向量的变体,唯一的区别是它欺骗用户毫无顾虑地按下更新按钮。

+覆盖范围,克服用户交互问题-需要更多规划和网络接入,而不是立竿见影的效果。

这里的新奇之处在于,在应用程序请求固件版本的确切时刻,(在路由器上运行的)攻击脚本只是欺骗响应,并发回指示咖啡机固件已过期的响应,即。

.