Belkin Wemo Smart Plug V2——无法修复的缓冲区溢出问题

Belkin Wemo Smart Plug V2——无法修复的缓冲区溢出问题

源节点: 2657924

物联网安全公司 Sternum 的研究人员 挖到了 来自知名设备品牌 Belkin 的流行家庭自动化电源插头。

他们看到的模型, WeMo 迷你智能插头 (F7C063) 显然它的保质期快要结束了,但我们在网上发现有很多这样的东西在出售,还有贝尔金网站上关于如何设置它们的详细建议和说明。

研究人员指出,尽管它们可能是旧的(在短期现代意义上):

我们最初对该设备的兴趣来自于我们实验室周围有几个这样的设备并在我们家中使用,所以我们只是想看看它们的使用安全性(或不安全性)。 [... T]他似乎是一种非常流行的消费设备[; b]根据这些数字,可以安全地估计仅亚马逊的总销售额就应该达到数十万。

简而言之,有很多人已经购买并插入了这些东西,并且现在正在使用它们来控制家中的电源插座。

简单地说,“智能插头”是一个电源插座,您可以将其插入现有的墙上插座,并在墙上插座正面的电源插座和背面相同的电源插座之间插入一个 Wi-Fi 控制的开关。智能插头的正面。 把它想象成一个电源适配器,而不是将一个圆形的欧式插座转换成一个三角形的英国插座,而是将一个手动切换的美国插座转换成一个电子开关的美国插座,可以通过应用程序或远程控制网络类型的界面。

物联网中的 S……

正如老笑话所说,许多所谓的物联网 (IoT) 设备的问题在于,“IoT”中的字母“S”代表安全……

……意思是,当然,通常没有您预期的那么多网络安全,甚至根本没有。

可以想象,一个不安全的家庭自动化设备,尤其是允许您屋外甚至世界另一端的人随意打开和关闭电器的设备,可能会带来很多麻烦。

我们之前已经写过很多不同产品中的物联网不安全问题,从 上网水壶 (是的,真的)这可能会将您的家庭 Wi-Fi 密码泄露给安全摄像头,骗子可以用来保存他们的 看着你 而不是相反,网络连接的磁盘驱动器有被获取的风险 被勒索软件攻击 直接通过互联网。

在这种情况下,研究人员早在 2023 年 2023 月就在 WeMo Mini Smart Plug 中发现了一个远程代码执行漏洞,并于 2023 年 XNUMX 月报告了该漏洞,并于 XNUMX 年 XNUMX 月为其获得了 CVE 编号(CVE-2023-27217).

不幸的是,尽管在现实世界中几乎肯定有许多这样的设备在积极使用,但贝尔金显然已经表示,它认为该设备“处于使用寿命的尽头”,因此不会修补安全漏洞。

(我们不确定如果该设备在其 120V AC 或 230V AC 电路中存在缺陷,例如可能过热和释放有毒化学物质或设置着火了,但似乎可以忽略设备中低压数字电子设备或固件的故障,即使它们可能导致网络攻击者随意反复打开和关闭设备中的主电源开关。)

当友好的名字成为你的敌人时

研究人员发现的问题是一个很好的老问题 堆栈缓冲区溢出 在允许您更改所谓的设备软件的部分 FriendlyName 设备的 - 当您使用手机上的应用程序连接到它时显示的文本字符串。

默认情况下,这些设备以一个友好的名称启动 Wemo mini XYZ,其中 XYZ 表示我们猜测是伪随机选择的三个十六进制数字。

这意味着即使你拥有两三个这样的设备,它们几乎肯定会以不同的名称开始,这样你就可以轻松地设置它们。

但是您以后可能想重命名它们,以便将来更容易区分它们,方法是分配友好的名称,例如 TV power, Laptop chargerRaspberry Pi server.

Belkin 程序员(或者,更准确地说,最终出现在这些 Belkin 品牌设备中的代码的程序员,他们可能也向其他品牌提供智能插头软件)显然保留了 68 字节的临时存储空间来跟踪重命名过程中的新名称。

但是他们忘记检查您提供的名称是否适合该 68 字节的槽。

相反,他们假设您会使用他们的官方手机应用程序来执行设备重命名过程,因此他们可以首先限制发送到设备的数据量,以防止缓冲区溢出出现。

具有讽刺意味的是,他们非常小心,不仅让您保持设备本身正常运行所需的 68 字节限制,甚至还限制您只能输入 30 个字符。

我们都知道为什么让客户端进行错误检查而不是在服务器端检查(或者更好的是)是一个糟糕的主意:

  • 客户端代码和服务器代码可能会不一致。 未来的客户端应用程序可能会认为 72 个字符的名称是一个不错的选择,并开始向服务器发送超出其安全处理能力的更多数据。 未来的服务器端编码人员可能会注意到,似乎从来没有人使用过完整的 68 字节保留,并且不加思索地决定 24 字节应该绰绰有余。
  • 攻击者可以选择不理会该应用程序。 通过生成自己的请求并将其传输到设备,他们可以轻松绕过任何仅依赖应用程序的安全检查。

研究人员很快就能够尝试更长的名称,以至于他们可以通过覆盖为新名称保留的内存缓冲区的末尾并破坏存储在紧跟其后的字节中的数据来随意使 WeMo 设备崩溃。

破坏堆栈

不幸的是,在基于堆栈的操作系统中,大多数软件最终都布置了基于堆栈的临时内存缓冲区,因此这些缓冲区中的大多数紧随其后的是另一个重要的内存块,它告诉程序完成后去哪里它现在正在做。

从技术上讲,这些“下一步要去哪里”的数据块被称为 退货地址,当程序调用所谓的 功能子程序,这是一段代码(例如,“打印此消息”或“弹出警告对话框”),您希望能够在程序的多个部分中使用这些代码。

每次使用子程序时,返回地址都会神奇地记录在堆栈中,这样计算机就可以自动“展开”其路径以返回到调用子程序的位置,每次激活时都可能不同。

(如果一个子例程有一个固定的返回地址,你只能从你程序的一个地方调用它,这将使首先将代码打包到一个单独的子例程中变得毫无意义。)

正如您所想象的,如果您在子例程运行完成之前破坏了那个神奇的返回地址,那么当它运行完成时,它会信任地但不知不觉地将自己“展开”到错误的位置。

运气好的话,攻击者或许能够提前预测如何创造性地破坏返回地址,从而以蓄意和恶意的方式误导程序。

被误导的程序不仅会崩溃,还会被诱骗运行攻击者选择的代码,从而导致所谓的 远程代码执行 利用,或RCE。

两种常见的防御措施有助于防止此类攻击:

  • 地址空间布局随机化,也称为 ASLR。 每次运行时,操作系统都会故意将程序加载到略有不同的内存位置。 这使得攻击者更难猜测如何以最终获得并保留控制权而不是仅仅使代码崩溃的方式来误导有缺陷的程序。
  • 堆叠金丝雀, 以矿工过去常带入地下的鸟类命名,因为它们会在甲烷存在时晕倒,从而提供残酷但有效的爆炸风险预警。 每次调用子程序时,程序都会故意在返回地址前面插入一个已知但随机的数据块,这样缓冲区溢出将不可避免地、可检测地首先覆盖“金丝雀”,然后再溢出到足以践踏的程度在最重要的返回地址上。

为了让他们的漏洞快速可靠地发挥作用,研究人员需要强制 Wemo 插件关闭 ASLR,远程攻击者无法做到这一点,但通过在现实生活中进行大量尝试,攻击者仍然可能幸运地猜对在程序使用的内存地址处,并无论如何获得控制权。

但研究人员无需担心堆栈金丝雀问题,因为有缺陷的应用程序是在“插入金丝雀检查安全指令”功能关闭的情况下从其源代码编译而来的。

(受 Canary 保护的程序通常比未受保护的程序稍大和慢一些,因为每个子例程都需要额外的代码来进行安全检查。)

怎么办呢?

  • 如果您是 WeMo Smart Plug V2 用户, 确保您没有将家庭路由器配置为允许通过互联网从“外部”访问设备。 这减少了行话中所说的 攻击面面积.
  • 如果您有支持通用即插即用的路由器, 也称为 UPnP,确保它已关闭。 众所周知,UPnP 很容易在不经意间向外部人员开放内部设备。
  • 如果你是程序员, 避免仅仅为了节省几个字节而关闭软件安全功能(例如堆栈保护或堆栈金丝雀检查)。 如果您真的内存不足,请通过改进代码或删除功能来减少内存占用,而不是通过降低安全性来减少内存占用,这样您就可以塞入更多内存。

时间戳记:

更多来自 裸体安全