Loading...
我们透过修改咖啡机的固件,将其转变成一个要求赎金的危险设备。当我们能够这样做时,其他人是否也能做到呢?如你所料,答案是:可以。让我带你踏上一段旅程,我们将展示固件是新的软体。
有些研究活动非常有趣,充分证明了我为何从事这项工作。我被要求证明一个神话,称这是一种怀疑,即物联网 (IoT) 装置的威胁不仅仅来自于通过弱路由器或网络暴露来访问它们,而是 IoT 装置本身是脆弱的,可以在不拥有网络或路由器的情况下轻易被控制。我也打赌我能让这个威胁持续并对任何用户构成真正的危险。我们经常说你的家庭网络,作为信任链,仅仅是其最弱的环节,但如果在设备层面上同样成立,那会意味著什么呢?
假设你拥有一个 IoT 设备,其功能得到良好保护,可以通过明确定义的 API 访问;即使你可以通过 API 控制该设备,你可能也无法造成太大伤害。固件,即设备内部的编程,具有逻辑约束,例如,不允许你在某人处于其路径上时关闭车库门或使设备过热到自燃。
过去,我们常常相信,像普通厨房电器这样的硬体是安全的,并且不会在不拆卸设备的情况下轻易被改动。但随著今天的智能电器,这已不再是事实。
我的同事们经常听我说固件是新的软体,而且这套软体常常存在缺陷。我们随处可见这样的现象。CPU的漏洞,以及产生弱金钥的加密晶片,都容易被破解。物联网安全的薄弱状态,主要是因为如今在设备内部放置控制和协调所有硬体部件电机、传感器、加热元件等的处理器变得更方便和便宜,而这些都是基于一段称为固件的简短程式。这种解决方案不仅便宜,还有一个重要特性可以更新。
早年,如果某个硬体存在所谓的设计缺陷,由于其刚性设计经常是硬接线,厂商需要更换整个组件或逻辑板,甚至是整个设备。制造商需要更改生产过程,可能还会损失财务利益。在固件的时代,只需发布固件更新就能轻松缓解这一问题。
固件更新的过程可能有很大不同,从使用特殊工具连接到设备这仍然需要厂商的物理互动到越来越流行的 OTA空中下载更新。在这种情况下,厂商无需亲自到场,整个过程要么通过互联网自动完成,要么在用户通知和批准更新后进行半自动操作。
那么,让我们看看我们拥有什么。我们有一个咖啡机,可以通过按几个按钮或使用手机或平板电脑的应用程序来按传统方式制作咖啡。这台咖啡机通过 WiFi 运行,开箱后必须通过手机上的伴随应用程序将其连接到你的网络。第一次开机时,咖啡机以本地模式运行,并创建自己的 WiFi 网络以便希望喝咖啡的人首先连接以设置设备。
值得一提的是,这台咖啡机不再受到厂商的支持,因为他们在 2017 年转向了更安全的平台和技术,这一点在本研究中充分说明。但这同样显示了我们面对被弃用 IoT 设备的普遍问题。
当我们下载伴随应用程序时,我们可以看到该应用程序允许你创建任何该厂商的设备的网络,并将这些设备连接到家庭网络,然后允许你控制咖啡机或智能水壶的所有功能。它还允许你检查设备的固件版本,并在需要时进行更新。
这台设备使用的协议已被其他几位研究人员在互联网上记录下来。正如预期的那样,它是一个简单的二进制协议,几乎没有加密、授权或身份验证。与设备之间的通信发生在 TCP 端口 2081。命令的格式非常简单:
作为回应如果有回应,咖啡机发送回:
推特加速器responsetype 根据命令的不同而有所不同,但一般规则是:如果回应中包含数据 responsetype = command 1,如果只是状态,那么 responsetype=3,并且只有一个 data 字节,该字节包含结果状态,其中 1 表示成功。完整的命令列表可以在 GitHub 存储库 中找到。
举个例子,通过发出这条命令:
用“默认”设置制作一杯美味的咖啡
你会根据咖啡机的默认设置为自己制作一杯或几杯咖啡。正如你所见,这里没有安全措施,所以任何能够访问该网络并能够到达咖啡机的 IP 地址的人都可以控制它。更有趣的是,所有这些命令在设备尚未连接到家庭网络时也可以通过该预设打开的 WiFi 网络访问。
让我们回过头来,回到我们的主要目标为了不当目的劫持咖啡机。更新过程有多安全?我们能进行干扰吗?我们是否能更改固件以做其他原本不是设计用来做的事情?我们能否将设备变成物理危险的设备?我们能否远程做到这一点?如我最开始所说,最弱的链接总是会削弱整个系统。无论是网络还是设备。我们的目标是回答所有上述问题,并证明 IoT 设备在固件层面上也可能受到损害。
首先,我们想了解更新过程是如何工作的。我们有几个选项来做到这一点,但根据我们过去类似的研究,我们已经有了相应的方案。一般规则是让过程尽可能简单;以下是在尝试反向工程固件更新过程时的待办事项。
获取固件文件解包如果它是被打包或加密的反向工程将那些零和一转换为有意义的代码修改它添加恶意内容上传并推送回设备这听起来很简单,对不对?
首先,我们需要以某种方式获取固件,再次,有几个选项。我们先采取最简单的方案:
Google搜索这看似很明显,但有时安全研究人员会忽略这一步,这可以节省他们许多工作。固件通常可以在互联网上下载。捕获和分析网络流量如果协议是未加密的,最简单的方法是捕获网络流量;在此情况下,我们需从以下三个方面寻找设备与互联网之间的流量设备与伴随应用之间的流量如果有的话伴随应用与互联网之间的流量分析和反向工程伴随应用。在深入探讨设备之前,首先检查设备的伴随应用通常是取得通信协议和命令的最简单方法。如果上述所有方法都没有成果,就该拆解设备,追踪电路板以识别所有元件,获取数据手册以查找调试端口,并可能直接从晶片上转储固件。这真的需要一些硬体冒险,不是每个人都能做到。生活并不是这么简单,反向工程 IoT 设备也不简单。结果证明,我们需要使用上述所有技术的结合。首先,我们进行 Google 查询,正如命令已经被记录下来,我们找到了表示要更新固件的命令。然而,该命令本身其参数和格式并未记录。因此通过发出:
这个简单的两字节命令将咖啡机切换到更新模式
咖啡机进入了更新模式在较新版本的固件中,必须按一个按钮才能实际启动更新,但旧版本的情况则不然!
嗯,不错,但什么也没有发生。通过分析网络流量,我们得出的结论是,因为此阶段咖啡机没有流量,因此没有可分析的内容。因此我们尝试了 Android 伴随应用。
智能咖啡机的 Android 应用程序,右侧图片显示更新界面
你可以看到更新按钮是灰色的,显然固件是最新的,并且没有简单的选项可以推送固件更新以查看网络流量中的内容。有趣的是,这里缺失的部分。咖啡机和应用程序之间以及两者与互联网之间都没有通信。因此应用程序如何知道咖啡机拥有最新的固件呢?唯一通过的数据包是应用程序在询问咖啡机的固件版本时发送的。
IoT 的典型流量分析与伴随应用:我们关心的是应用和互联网及设备之间的流量。
这很奇怪,这似乎告诉我们固件可能不在互联网上,必须是应用的一部分。因此我们就像处理 zip 文件一样轻松地打开了 apk 文件。我们在那里找到的东西证明了我们的假设。
APK 内部的文件:你可以看到两个带有 bin 后缀的文件中包含了两个产品的固件
固件是 Android 应用的一部分,也意味著新版本的固件始终伴随新版本的应用。这样想想也很有道理。新的固件通常会添加新的功能,而这些功能必须以某种方式在应用程序的用户界面中反映出来,这让我们能够在不触及设备的情况下找到固件文件。这很好,且不常见。
在我研究的下一个步骤中,我们试图弄清楚该文件的内容。任何反向工程师首先会查看该文件以查看其包含的内容。我们看到里面有一堆实际上有效的字符串。由此我们可以推断,没有加密,固件可能是直接上传到咖啡机的明文映像。
该文件的内容告诉我们,没有涉及加密,还提供了可能的额外 WiFi 模组
为了能够理解固件的作用,我们需要将二进制解码为汇编语言,这意味著我们需要知道这个固件针对的处理器或架构。
我们可以猜测,也可以尝试。或者我们可以像以前一样拆解设备以获取有关硬体的信息。因此,当我们拧开几个螺丝并拆掉几个塑料盖子后,我们终于得到了这块电路板。这就是它的样子:
咖啡机及其控制板
我们立刻看到了我们已经非常熟悉的一个元件。ESP8266 模组。这是一个非常常见的晶片,提供 WiFi 功能,广泛用于许多设备中,作为 WiFi 调制解调器或直接作为设备的主要 CPU。但这次情况并非如此。我们识别了其他似乎重要的晶片,并得出不同的结论。
1 ESP8266带AT调制解调器固件,2 STM32F05106 ARM Cortex M0 主要 CPU,负责协调一切,3 I2C EEPROM配置,4 调试端口和编辑界面
在这种情况下,主要 CPU,真正的咖啡机核心,是一个 ARM Cortex M0 处理器,它控制所有连接的设备咖啡研磨机、咖啡盖、水位传感器、加热盘、主加热器、显示器、按钮和缺失咖啡壶传感器。为了更易理解,我们绘制了整个咖啡机的框图:
咖啡机主要组件的框图
我们可以看到 ESP8266 仅用作 WiFi 调制解调器,它为主 CPU 提供 WiFi 功能这听起来可能很搞笑,因为 ESP8266 的性能和内存都远超过主要 CPU,但这是事实。无论如何,我们得到了我们所需的信息。现在我们知道了 CPU 的确切类型,可以下载数据手册并提取一些基本信息,以帮助我们理解反汇编从何开始。
可以在 STMicroelectronics 网站上找到的基本规格
我们知道这个 CPU 既简单又资源有限,没有操作系统,这通常使反向工程变得简单,因为没有太多代码需要检查。在这种情况下,我们使用 IDA交互式反汇编器,经过几次尝试和错误后,我们将二进制文件加载到起始地址 0x08004000。通常,CPU 从 0x08000000 地址开始执行,但后来我们发现,地址空间的开头会有一个自定义引导程序一段代码,允许更新晶片上的其他代码,它处理升级过程并作为安全性保护,在升级过程出现问题时始终保持运行。当你发现自己身处不熟悉的固件世界时,你通常会在 IDA 中看到如下信息这是我们在威胁实验室中经常使用的工具,反向工程恶意软体和未知代码:
IDA环境显示函数和字符串视图
我们看到许多未命名的子例程以及一串字符串。现在,真正的工作开始了。你必须找出每个子例程的作用,并慢慢拼凑整个运作方式。这是个人喜好的问题,但我通常从字符串开始。从字符串中,你通常可以推导出使用该字符串的函数,并根据那个参考,你通常可以揭示该函数的功能。这也有助于首先识别最常见和被引用最多的函数。具体在 IoT 的情况下,一个不错的线索还可能是识别内存映射的 I/O 引脚,因此当你看到对这样内存的引用时,你就知道该函数关联了一些附加的硬体部件。让我们跳过枯燥的分析过程,看看几个快照。
利用架构知识来理解代码:从地址中我们推断这个必须是访问缺失咖啡壶开关的函数,因此调用的函数是通用函数,用来读取引脚,而调用此函数的将是冲泡命令的一部分
尽管我们并未对所有函数进行反向工程,但我们获得了大多数重要的函数。我们还发现存储按钮状态和通过 WiFi 接收的数据的全域变数,以及控制显示器和所有设备的程式。我们还找到了分配和释放内存、发出声音、延迟等的函数。我们找到了执行所有子功能的程序主循环,还有处理基于通过某个网络包接收的命令的主要命令例程。这使我们能够创建一份咖啡机可执行的所有远程命令的清单,并与以前的研究进行匹配,甚至对其进行扩展。
通过交叉参照函数调用和地址,我们逐步揭示了每个函数的作用
在对整个固件进行反向工程后,我们确切知道每个外围设备连接的位置,如何控制它,以及咖啡机能够执行的所有命令。最有趣的是固件升级程式本身。再次仔细检查处理触发更新屏幕的命令的函数后,发现咖啡机会将一些内容记录到 EEPROM 记忆体并执行重启。因此现在很清楚,更新过程由引导程序处理,而这不是固件包的一部分。当更新信息显示在屏幕上时,WiFi 名称会变更,从 Smarter Coffeexx 变为 Smarter Coffee Updatexx,其中 xx 与该设备的 MAC 地址的最低字节相同。因此显而易见,即使你的咖啡机已连接到家庭网络,当涉及更新时,它总是通过 WiFi 以接入点模式进行。
检测处理所有命令的主要函数,根据调用图的外观
WiFi 相关函数集的特写
当我们尝试反向工程更新协议时,我们有几个不同的选项。由于我们知道内部的处理器,我们可以尝试将整个固件包括引导程序转储出晶片,然后对引导程序进行反向工程。我们选择了一个更简单的方法,决定反向工程 Android 应用,以查找更新部分,因为通常比 CPU 汇编语言更易于阅读反编译的 Java 代码。这花了我们一段时间,但我们确定并记录了整个过程:
通过反向工程 APK 档案获得的更新过程
这里最令人惊讶的是,更新过程不使用任何固件的加密或签名。所有信息在无安全 WiFi 连接上以明文方式传输,唯一的检查是结尾的 CRC。
现在我们拥有所有信息,可以尝试我们的第一次更新。使用 Python,我们实现了一个简单的上传器,分为两个步骤。首先,它尝试查找咖啡机的 WiFi,然后连接到它默认情况下,咖啡机始终可在 19216841 的 2081 端口连接。通过发送开始更新命令,咖啡机会切换到更新模式。
t这个简单两字节命令将咖啡机切换到更新模式
脚本等待 WiFi 从 “Smarter Coffeexx” 变更为 “Smarter Coffee Updatexx”。一旦发生这种变化,它再次连接到相同地址,使用前述过程发送新固件。作为开始,我们仅发送了一个稍作更新的固件版本,该版本显示的内容从缺少咖啡壶变更为:
整个固件替换过程大约耗时 1525 秒,并且完全自动完成。
有趣的是,显示器没有字体或文本输出,屏幕上看到的所有内容都是存储在固件中的图像。因此,例如,对于咖啡杯的数量112有图片。这些图片是黑白的,编码相当简单,如下图所示:
黑白图像编码
现在我们拥有一切所需,可以创建我们自己的修改过的固件。最初,我们想证明这个设备可能用于挖掘加密货币,考虑到 CPU 和架构,这确实可行,但以 8MHz 的速度根本没有意义,因为挖掘产生的价值微乎其微。
我们决定将咖啡机转变为一台勒索软体机器,当某个触发器被触发时,会启动赎金信息。在触发器被攻击者激活前,它看起来完全无辜且运作正常,这让人更加惊讶。
为此,我们劫持了原本用来将咖啡机连接到网络的命令,当用户尝试将设备连接到家庭网络时,来自用户的操作会不经意间触发赎金行为。
我们利用固件最后未使用的内存空间创建恶意代码。使用 ARM 组合语言,我们创建了一个勒索病毒,当被触发时,会使咖啡机无法正常运作并要求赎金,同时启动加热盘、水分配加热元件,永久运行并持续研磨,显示勒索消息并发出警告声。我们认为这足以让任何用户感到惊慌,并使其经历一场极为紧张的事件。此时用户唯一能做的就是将咖啡机从电源插座拔掉。
恶意代码的片段:这部分会在显示器上显示赎金的信息
在这里你可以看到它运行的情况:
现在我们已证明可以在不接触的情况下改变咖啡机的固件,让我们看看作为攻击者,你能如何接触到这台咖啡机。我们有哪些可能性,是否能克服更新版本固件的安全措施?在更新过程中,设备拥有者必须按下启动按钮才能开始更新。
在此过程中,我们需要物理接触设备来启动更新。
易于执行 需物理接触,咖啡机必须处于未配置状态未连接到家庭网络
这种攻击选择可能影响最小。要执行此操作,你需要接触设备或至少处于其 WiFi 信号范围内。如果设备已连接到家庭网络,你可以采用 去认证攻击,因为该设备在无法连接到预设 WiFi 网络时会回落到无预设的 WiFi 接入点模式。让我们来看看这种攻击的示意图:
攻击者发出开始更新命令,然后 WiFi 名称立即更改为Smarter Coffee Updatexx。然后攻击者开始向设备发送修改过的固件。
在此情境中,我们利用网络来接触咖啡机。
可以远程完成 首先需突破网络,需要一台支持 WiFi 的设备/路由器,如果咖啡机正在运行较新版本的固件,则需要用户按下按钮确认更新。
这是一种非常常见的情况,攻击者首先突破家庭网络。这种攻击的关键在于找到可以控制 WiFi 的设备。一个理想的候选者当然是 WiFi 路由器。
由于咖啡机在更新固件时总是变成 WiFi 接入点,所以你需要一个能在内部网络中使用的设备来连接到它。这通常是任何路由器的相当常见功能,因此在短时间内,你可以轻松将路由器重新配置为客户端,而不是 WiFi 接入点。由于更新过程非常短暂,因此影响几乎不值得注意。有些路由器甚至能同时作为客户端和接入点,并使用单个无线电。
这种攻击是一个先前攻击向量的变体,唯一的不同在于用户被引导按下更新按钮而没有任何担忧。
可接触,克服用户互动问题 需要更多的计划和进入网络的访问,并非瞬间效应
这里的新颖之处在于,就在应用程序询问固件版本的那一刻,运行在路由器上的攻击脚本会仿冒该响应并发送回咖啡机固件已过期的响应,这导致应用程序提示需要更新。其余的事简单得多现在你可以取代从应用程序流向咖啡机的固件。
这种攻击也可以以路过者的方式执行,当你靠近咖啡机且未连接任何网络时。
在这种攻击场景中,我们诱骗用户下载一个假应用程序来控制咖啡机。
无需与网络或协议互动 社会工程学,结果无法保证
这是一种经典的攻击场景。你只需替换官方伴随 Android 应用内的固件,然后使用盗窃的证书重新签名,并尝试将其推进 Google Play 商店或其他第三方应用商店。你可以使用任何社会工程学技术来推动用户下载假应用程序,因为固件没有签名,咖啡机会欣然接受。基本上,创建假版本的应用程序并促使用户安装的任何形式都有效。
在我们的分析过程中,我们发现了几个缺陷以及一个关键漏洞。如你所想,最严重的漏洞是使攻击能够远程替换咖啡机的固件。
固件版本之间存在差异,最旧的固件不需要任何用户互动就可以更新,而较新版本的咖啡机固件要求用户按下设备上的开始按钮才能开始更新。然而,即使要求用户在更新前按按钮,你仍然可以使用社会工程学攻击,不断发送开始更新数据包,这将导致用户即使按下取消也会不断看到相同的提示信息。
因为更新是在未加密的网络上进行的,你也可以伪造固件版本,让伴随应用相信咖啡机确实需要更新,然后注入恶意代码。在这种情况下,用户很可能会乐于按更新。
另一个弱点是永久将设备与家庭 WiFi 网络断开连接的可能性。即使它已经连接到安全的 WiFi 网络,你也可以通过使用 去认证攻击 将设备从网络中断开连接。奇怪的是,它不会试图重新连接,因此会永久失去连接,或至少在有人重置它之前是如此。如果你在设备重新启动过程中不断去认证该设备,它会改回无线接入点模式,等待攻击者连接。
即使我们联系厂商,我们也很可能得不到任何回应。根据他们的网站,这一代咖啡机不再受到支持。因此用户不应期望会有修复方案。
在经历这一切后,你还会对智能咖啡机感兴趣吗?正如下方地图所示来源:wigle,这家厂商的近 570 台智能咖啡机正处于未配置状态。这意味著这 570 台设备的智能功能未被使用。然而,这些设备的所有者无意中让黑客更容易进入其设备,因为每台咖啡机都会自动成为一个接入点,以便任何在范围内的人都能连接并滥用。
此外,这个案例还展示了现代 IoT 设备最令人担忧的问题之一:一台冰箱的典型寿命是 17 年,那么你认为厂商会支持其智能功能的软体多长时间?。当然,即使不再获得更新,你依然可以使用它,但随著物联网的迅速发展和对支援的糟糕态度,我们正在制造一支弃用的脆弱设备军队,这些设备可以被用于不法目的,如网络入侵、数据泄漏、勒索攻击和 DDoS。
全球各地未配置的 Smarter Coffee 机器
正如我们一开始所言,在安全领域,我们过去常常将视为生态系统中不受信任的部分,而将硬体视为安全和受信任的部分。但我们越来越常见到这种信任正在被破坏。不幸的是,许多供应商让固件攻击变得更可行,他们只是抛开安全措施,让其面临被攻击的风险。这使网络罪犯打开了一个全新的攻击面,供其滥用。写和替换固件可能并不简单,但你可以获得的潜行性和持久性是如此诱人。
我们生活在一个事物彼此沟通的世界,而智能设备的数量逐渐超过电脑的数量。这些设备大多没有屏幕,因此能够使得其所有者对其背景中运行的恶意活动视而不见。
CVE202015501 Smarter Coffee Maker 2 代前,允许无需身份验证或授权的固件替换。用户互动需求按下一个按钮。注意:此漏洞仅影响不再受到维护的产品。
不同的固件映像1eff6702b158b1554284f3ef6eb9d05748f43ba353d60954f21c6f20fd71e6ce650a7bc7a55162988c77df34235c8e87eda9c8e2fcecd72b74c5f69e3edd088c
存有固件映像、IDA 数据库、上传器的 GitHub 存储库Avast IoC 存储库
相关研究参考:反向工程 Smarter Coffee IoT 机制协议,使用终端制作咖啡https//wwwpentestpartnerscom/securityblog/anotherunsmartsmarterapp/githubcom/Tristan79/iBrew(opens in a newtab)https//wwwpentestpartnerscom/securityblog/hackingawificoffeemachinepart1/
标签:分析,CVE,硬体 ,反向工程,漏洞
分享:XFacebook