黑客10秒无钥匙开走特斯拉:重大漏洞曝出!|在Firefox中触发UAF漏洞
2022-5-19 09:53:31 Author: mp.weixin.qq.com(查看原文) 阅读量:18 收藏

黑客10秒无钥匙开走特斯拉:重大漏洞曝出!

不止特斯拉,有不少能手机解锁的车都可以用同样的方法破解,智能门锁也可以。

编辑:泽南

如今,很多特斯拉车主都已习惯不带钥匙用手机解锁车辆,但最近一位网络安全研究人员已经展示了「无钥匙进入」把电动汽车开走的技术,新的漏洞为人们敲响了警钟。

总部位于英国曼彻斯特的安全公司 NCC Group 首席安全顾问 Sultan Qasim Khan 表示,有一种方法能黑进特斯拉 Model 3 和 Model Y ,解锁、启动车辆并踩油门开走。通过重定向车主的手机或密钥卡与汽车之间的通信,外人可以欺骗进入系统,使其认为车主就位于车辆附近。

目前有无钥匙启动功能的车辆远不止特斯拉一种,Khan 表示,这种黑客攻击并不是特斯拉独有的。相反,这是他对特斯拉无钥匙进入系统进行修补尝试的结果,该系统依赖于蓝牙低功耗协议(BLE)。

这是全球第一次对于 BLE 的链路层中继攻击,其破解了基于 BLE 的接近身份验证机制。通过在链路层从基带转发数据,黑客可以绕过已知的中继攻击保护,包括加密的 BLE 通信,因为它绕过了蓝牙堆栈的上层和解密需求。

NCC 在周日的一份报告中向其客户提供了调查结果的详细信息。所幸目前没有证据表明已有窃贼利用该方式攻击了特斯拉汽车。这家汽车制造商没有回应置评请求。

该安全公司已经向特斯拉披露了攻击的可能方法,但后者并不认为存在重大风险。NCC 表示,若想解决这个问题,不能简单地通过软件补丁进行修复,这家汽车制造商需要改变其硬件并修改无钥匙进入系统的逻辑。

虽然特斯拉在新技术应用上经常走在行业前端,但时常会被曝出安全等方面的问题。今年 1 月,19 岁的德国的安全研安全研究员 David Colombo 也曾透露一种劫持特斯拉汽车某些功能的方法,例如开关门和控制音乐音量。他使用远程指令控制了全球各地超过 25 辆特斯拉。

相较常规的蓝牙通信,BLE 在保持同等通信范围的同时显著降低了功耗和成本,是将不同传感器和控制设备连接在一起的理想选择。

该协议旨在通过局域联网方便地将设备高效连接在一起,面向智能门锁、汽车、手机、笔记本电脑以及很多 IoT 设备,但这也意味着它成为了黑客潜在解锁智能技术的方法。NCC 表示,其已能够对其他几家汽车制造商和科技公司的设备实现攻击。

Khan 表示,在 iPhone 或安卓手机上使用蓝牙无钥匙开门的 Kwikset Kevo 智能锁也受到同样问题的影响。Kwikset 对此表示,使用 iPhone 开门的用户可以在锁具应用中开启双重身份验证。一位发言人还补充说,iPhone APP 上操作的锁有 30 秒的超时时间,有助于防止入侵。

该公司表示,Kwikset 将在「夏季」更新其安卓应用程序。

「Kwikset 产品的安全性至关重要,我们与知名安全公司合作评估自身产品并持续合作,以确保为消费者提供尽可能高的安全性,」一位发言人说道。

管理涉事技术的机构,蓝牙技术联盟 SIG 的一位代表表示:「SIG 优先考虑安全性,我们提供的规范包括一系列功能,为产品开发人员提供保护蓝牙设备之间通信安全所需的工具 SIG 还向开发人员社区提供教育资源,以帮助他们在其蓝牙产品中实施适当级别的安全性,并为安全研究社区合作的漏洞响应计划,以负责任的方式解决蓝牙规范中发现的漏洞。」

NCC 表示,由于低功耗蓝牙普遍存在于消费级设备中,新漏洞的潜在攻击面很大,这包括:

  • 具有无钥匙进入功能的汽车 —— 攻击者可以解锁、启动和驾驶汽车。

  • 启用了蓝牙近距离解锁功能的笔记本电脑(配合智能手环、手机免输密码机制)。

  • 手机 —— 犯罪分子可以阻止手机锁定。

  • 家庭智能门锁 —— 攻击者无需机械撬开或断电即可解锁与开门。

  • 访问控制系统 —— 允许攻击者解锁和打开门,同时冒充他人。

  • 资产和医疗患者跟踪系统 —— 有人可能会欺骗资产或患者的位置。

Sultan Qasim Khan 是开源蓝牙 5 嗅探器 Sniffle 的创建者。该嗅探器可用于跟踪蓝牙信号,帮助识别设备。该技术现在经常被管理道路的政府机构用来匿名监控穿过市区的司机。

2019 年,英国消费者组织 Which 进行的一项研究曾发现,超过 200 种车型容易受到无钥匙进入系统攻击的影响,窃贼使用的攻击方法相似,但细节相略有不同。

在本次攻击特斯拉车辆的演示中,Khan 进行了「中继攻击」,其中黑客使用两个小型硬件设备来转发通信。为解锁汽车,Khan 在距离特斯拉车主的智能手机或遥控钥匙大约 15 码的范围内放置了一个中继设备,并将第二个设备插入他的笔记本电脑再靠近汽车。该技术利用了 Khan 为蓝牙开发套件设计的定制计算机代码,这些套件在网上的售价不到 50 美元。

除专门编写的软件外,攻击所需的硬件总共花费大约 100 美元,并且可以很容易地在网上买到。Khan 表示,一旦通信中继建立起来,黑客只需「十秒钟」就能解锁车辆。

「攻击者可以在晚上走到人们的家门口 —— 如果车主的手机在家里,并利用这种攻击来解锁和启动停在外面的汽车…… 又或者,一旦黑客设备安装在遥控钥匙或手机附近,攻击者就可以从世界任何地方发送命令,」Khan 补充道。

参考内容:
https://www.bloomberg.com/news/articles/2022-05-16/hacker-shows-off-a-way-to-unlock-tesla-models-start-the-engine
https://newsroom.nccgroup.com/news/ncc-group-uncovers-bluetooth-low-energy-ble-vulnerability-that-puts-millions-of-cars-mobile-devices-and-locking-systems-at-risk-447952

防不胜防!在Firefox中触发UAF漏洞

安全防护人员早已开发出各种方法来预防各类内存损坏漏洞。不过就算这样,UAF漏洞也很难被防护,原因是它的攻击面太多!由于它无法与源代码中的任何特定模式相关联,因此预防此漏洞类并非易事。在本文中,我将分析 Mozilla Firefox 中的一个UAF漏洞,该漏洞已被命名为 CVE-2022-26381。在撰写本文时,Mozilla 错误条目 1756793 仍然不对公众开放。
什么是UAF漏洞?
当访问指向已释放对象的指针时,就会发生UAF漏洞。它没有任何意义!为什么程序员要释放一个对象,然后再次访问它?
这种情况的发生是由于当今软件的复杂性。例如,一个浏览器有很多组件,每个组件都可以分配不同的对象。它们甚至可以互相传递这些对象以进行处理。当组件使用一个对象时,它可以释放该对象,而其他组件仍然有一个指向该对象的指针。该指针的任何解除引用都可能导致UAF漏洞。
概念验证
让我们先来看看最小化的概念验证,当在最新版本的Mozilla Firefox(97.0.1)上运行时,很有可能会崩溃。这就是 IDA 中崩溃时的示例。它发生在一个循环中:

它从内存中解除引用一个值,然后使用获取的值进行间接调用(虚函数调用)。因此,这被认为是一个远程代码执行漏洞。在解除引用期间使用的“rax”寄存器的值特别有趣:0xE5E5E5E5E5E5E5E5。这是一个神奇的值,Firefox 使用它来“毒化”已释放对象的内存,这样从释放对象获取的值的解除引用将导致崩溃,因为这个值从来都不是有效的内存地址。这有助于检测UAF的发生。
要分析UAF漏洞,就必须获得有关释放对象的更多信息,比如类型、大小、分配位置、释放位置以及随后使用的位置。在 Windows 上,这通常通过使用 GFlags 工具启用高级调试功能来启用各种全局标志来完成。具体来说,它可用于启用 pageheap 并创建用户模式堆栈跟踪以在分配特定对象时捕获堆栈跟踪。不幸的是,这对 Mozilla Firefox 没有帮助,因为 Firefox 有自己的内存管理机制,称为 jemalloc。我们可以获得有关该对象的更多信息的方法是在 ASAN 版本的 Firefox 上运行 PoC。你可以看到如下结果:
我们得到了很多信息。让我们通过检查对象的分配位置来进一步分解它:

让我们通过查看源代码(/builds/worker/checkouts/gecko/layout/svg/SVGObserverUtils.cpp 的第 1164 行)来进一步检查这个问题。你可以下载Firefox 97.0.1的源代码或使用在线版本(注意在线版本的行号可能不匹配,因为它会不断更新):

这是它在编译后发布版本中的样子。因此对象大小为 0x70 (112) 字节,用于在滚动触发的reflow期间存储和跟踪帧的属性。
然后我们想知道它在哪里被释放和重用。ASAN提供了一个很长的堆栈跟踪。仔细观察就会得到一个很好的提示。让我们首先检查当对象被释放时的堆栈跟踪:

现在是随后使用该对象时的堆栈跟踪:

当崩溃发生和启动对象释放时,我们可以在堆栈跟踪中看到" mozilla::SVGRenderingObserverSet::InvalidateAll "函数。这也与 OnNonDOMMutationRenderingChange 函数内部的发布版本的崩溃点相匹配(它表示它已内联在 xul!mozilla::SVGRenderingObserverSet::InvalidateAll 中)。我们现在可以做一个初步的有根据的猜测:当一个对象在“mozilla::SVGRenderingObserverSet::InvalidateAll”函数中循环处理时,就会到达一个释放正在处理的对象的代码路径,从而触发了一个UAF漏洞。
现在我们已经掌握了所有实施过程,就可以通过在Firefox发布的版本上运行PoC一步一步地验证这个假设。
首先,要知道分配对象的地址,以便我们可以监控它。这可以通过设置一个断点来轻松实现,该断点在分配时会打印对象的地址:

然后,让我们看看这些对象是如何在IDA中的“mozilla::SVGRenderingObserverSet::InvalidateAll”函数的循环中被处理的。我们将打印将要被处理的对象的地址,并在随后的虚函数调用中设置了一个断点:

我们运行 PoC,调试器在调用虚函数之前停止。如上所示,分配了两个对象,这两个对象将在循环中处理。首先,处理一个对象并调用“SVGTextPathObserver::OnRenderingChange”函数,最终释放各种分配的对象,包括等待处理的第二个对象!

我们可以在下图中清楚地看到这一点,这是在调用返回后立即拍摄的。正如你所看到的,在处理第一个对象时,第二个对象已经被释放(并且被0xe5毒化):

在第二次迭代中,被释放的对象被加载进行处理,导致有毒值的加载,并导致崩溃:

在针对发布版本运行 PoC 时,我们在解除引用 0xE5E5E5E5E5E5E5E5 期间发生了崩溃。但是,在 ASAN 版本中,它在写入内存时崩溃。为什么有区别?原因如下:
在release(非asan)构建中,当释放一个对象时,它的内存仍然是可访问的(而不是未映射的),因此对该内存的任何读取和写入仍然可正常进行,而不会立即触发崩溃。这就是为什么指令“mov byte ptr [rcx+8], 0”在上图中没有错误的执行。不过,崩溃可能会在更长的时间内发生。在本文的示例中,如果从释放的对象中获取一个值,然后解除引用,那么解除引用可能会导致崩溃。如果释放的对象内容被上面看到的毒值覆盖,则尤其如此。请注意,有可能根本不会发生崩溃,例如,如果只对释放的对象进行读取和写入,而没有对获取的值进行任何解除引用操作,或者有毒的值被不相关的数据覆盖。这意味着,如果我们对发布版本进行模糊处理,就有可能错过一个漏洞。
另一方面,ASAN监视内存上的所有读、写和解除引用,可以尽快捕获此类漏洞。这就是为什么推荐使用ASAN版本进行模糊测试的原因。
漏洞修复
UAF漏洞通常通过将原始指针转换为智能指针或通过更正对象引用计数的管理来修复。这样就可以通过更改引擎中处理连续帧循环的方式来修复它:

总结
开发人员已经花费了大量的精力来消除源代码中与已知模式相关的漏洞,并且他们基本上成功地降低了这些漏洞的影响。然而,有一些类型的漏洞更难预防,UAF就是其中之一。确保对具有一百万行代码的软件中的对象生命周期进行完美管理是极其困难的

文章来源 :机器之心、安全圈

精彩推荐


文章来源: http://mp.weixin.qq.com/s?__biz=MzAxMjE3ODU3MQ==&mid=2650539502&idx=1&sn=f0141b42ab46d971adc7eec46f378c73&chksm=83bd600ab4cae91cc0c38962511c5f7dfd824732a71f5f59154bef58c56436cfe494a43f1e7c#rd
如有侵权请联系:admin#unsafe.sh