Pwn2Own高通DSP

  • Pwn2Own高通DSP已关闭评论
  • 11 views
  • A+

备注:

原文地址:Pwn2Own Qualcomm DSP - Check Point Research

原文信息:May 6, 2021Research By: Slava Makkaveev

原文标题:Pwn2Own Qualcomm DSP


介绍

骁龙是高通技术公司为移动设备设计和销售的一套系统芯片(SoC)半导体产品。单个SoC可能包括多个CPU核心、Adreno图形处理单元(GPU)、骁龙无线调制解调器、六边形数字信号处理器(DSP)、高通Spectra图像信号处理器(ISP)和其他硬件。

骁龙产品层通过CPU、GPU和DSP处理器的可扩展计算资源来区分。最低层可能只包含一个六角形DSP,而高级层最多包含四个专用于特定用例的六角形DSP处理器。例如,嵌入到Pixel 4、Samsung S10、小米9、LG G8和OnePlus 7等手机中的骁龙855(SM8150)SoC包括一个Kryo CPU、一个Adreno 640和四个独立的DSP,每个DSP专门用于特定的应用领域:传感器(SDSP)、调制解调器(MDSP)、音频(Adsp)和计算(CDSP)。

在本文中,我们研究两个DSP:

  • CDSP,用于图像处理、计算机视觉、神经网络相关计算和摄像机流媒体等计算密集型任务。
  • ADSP,用于音频和语音数据的低功耗处理。

就目前的研究而言,我们将cDSP和ADSP视为一个处理单元(DSP)。我们发现的安全问题适用于这两种情况。

CPU与DSP之间的通信

FastRPC是高通专有的远程过程调用(RPC)机制,用于启用CPU和DSP之间的远程函数调用。FastRPC框架是典型的代理模式。

在上图,您可以看到FastRPC组件之间的交互:

  • 用户模式进程(客户端)启动远程调用。例如,Android应用程序在其本机代码中调用一个存根函数。
  • 存根是一个自动生成的代码,它将函数调用转换为RPC消息。通常,存根代码被编译为一个单独的本机库,然后与客户机链接。存根代码使用libadsprpc.so和libcdsprpc.so库通过相关ioctl调用应用程序处理器(AP)上的DSP RPC驱动程序(/dev/adsprpc smd或/dev/cdsprpc smd)。
  • DSP-RPC内核驱动程序接收远程消息调用,通过共享内存驱动程序(SMD)通道将排队消息发送到DSP上的DSP-RPC框架,然后等待响应。
  • DSP-RPC框架将消息从队列中移除,并将它们分派给骨架动态库进行处理。
  • skel是一个自动生成的库,用于解组参数并调用目标方法实现。
  • 目标方法(object)是高通公司或原始设备制造商提供的逻辑,设计用于在DSP上运行。

谁可以在DSP上运行自己的代码?

出于安全原因,DSP由原始设备制造商和数量有限的第三方软件供应商授权编程。在DSP上运行的代码由高通公司签名。常规的Android应用程序没有权限在DSP上执行自己的代码。骁龙855和865 SoC是例外,高通被允许在cDSP上执行低权限免签名动态共享对象。

应该注意的是,谷歌通过SELinux策略防止第三方应用程序和adb shell访问DSP RPC驱动程序,对Pixel设备实施保护。

公开的Hexagon SDK负责将DSP对象的C/C++源代码编译成适用于DSP上执行的Hexagon(QDSP6)字节码。 存根和skel代码是根据开发人员准备的接口定义语言(IDL)模块自动生成的。高通公司IDL用于定义跨内存保护和处理器边界的接口。IDL只暴露了该对象的作用,但没有暴露它所在的位置或实现它的编程语言。

一个安卓应用开发者能够实现其定制的DSP库,但不能完全执行。只有预先构建的DSP库可以被一个Android应用自由调用。

谁在管理DSP?

QuRT是一个高通公司专有的多线程实时操作系统(RTOS),管理Hexagon DSP。QuRT的完整性得到了高通公司安全可执行环境(QSEE)的信任。QuRT的可执行二进制文件(aDSP和cDSP是分开的)被签署并分割成几个文件,其方式与高通公司设备上任何其他受信任的应用程序相同。其默认位置是/vendor/firmware目录。

对于每个启动远程调用的Android进程,QuRT在DSP上创建一个单独的进程。当用户进程被生成时,特殊的shell进程(/vendor/dsp/fastrpc_shell_0用于aDSP,/vendor/dsp/fastrpc_shell_3用于cDSP)被加载到DSP上。shell负责调用骨架库和对象库。此外,它还实现了DSP的RPC框架,提供骨架和对象库可能需要的API。

DSP的软件架构提供了不同的保护域(PD)以确保内核软件的稳定性。在DSP中,有三个保护域:

  • 内核 - 拥有对所有PD的所有内存的访问权。
  • Guest OS - 可以访问自己PD的内存,用户PD的内存,以及一些系统寄存器。
  • 用户--只能访问自己的PD的内存。

无签名的动态共享对象在无签名PD内运行,无签名PD是用户PD,它对底层DSP驱动和线程优先级的访问受到限制。无符号PD被设计为只支持一般的计算应用。

对象库以及FastRPC shell在用户pd中运行。

跳过FastRPC流程中的存根代码

libadsprpc.so和libcdsprpc.so库负责与DSP RPC驱动进行通信。这些库导出了两个对研究来说很有意思的函数:

  • int remote_handle_open(const char name, remote_handle ph). 这个函数在AP上的调用者进程和DSP上一个新的FastRPC shell进程之间打开一个远程会话。这个会话用于与作为第一个参数的骨架库的通信。
  • int remote_handle_invoke(remote_handle h, uint32_t scalars, remote_arg *pra). 这个函数能够调用骨架库的导出方法。应将会话处理程序指定为第一个参数。

使用这两个函数,客户可以执行任何骨架库中实现的DSP方法。由高通公司或OEM提供的存根代码可以从该链中跳过。

让我们看看remote_handle_invoke函数的第二个和第三个参数,它们对目标方法及其参数进行编码。

scalars是一个词,包含以下元数据信息:

  • 方法索引和属性(最高字节,0xFF000000掩码)。
  • 输入参数的数量(0x00FF0000掩码)。
  • 输出参数的数量(0x0000FF00掩码)。
  • 输入和输出句柄的数量(0x000000FF掩码,四位用于输入,四位用于输出)。在现代手机上,如果这个字节不等于零,则DSP调用失败。

Pra是指向目标方法的参数数组(REMOTE_ARG条目)的指针。参数的顺序如下:输入参数、输出参数、输入句柄和输出句柄。

正如你所看到的,每个输入和输出参数都被转换为一个通用的remote_buf条目。

需要注意的是,如果我们准备的remote_arg数组条目多于目标方法的要求,那么额外的参数就会被骨架库忽略。

标量和pra参数通过DSP RPC驱动和DSP RPC框架 "原样 "传输,并作为每个骨架库提供的特殊调用函数的第一和第二参数使用。例如,libfastcvadsp_skel.so库提供了fastcvadsp_skel_invoke invoke函数。invoke函数只负责按索引调用适当的skel方法。每个skel方法本身会验证收到的远程参数,将远程_bufs解读为常规类型,并调用对象方法。

正如你所看到的,要从一个skel库中调用一个方法,你只需要知道它的索引和用remote_buf结构包裹每个参数。事实上,我们不需要提供调用函数的名称、参数的类型和数量来执行调用,这使得骨架库成为一个非常方便的模糊测试目标。

降级漏洞

安卓手机上有很多高通预装的框架库。绝大多数都是专有的。然而,也有像libdspCV_skel.so和libhexagon_nn_skel.so这样的开源例子。

几乎所有Android设备上都可以找到libfastcvadsp_skel.so和libscveBlobDescriptor_skel.so等很多框架库。然而,像libVC1DecDsp_skel.so和libsysmon_cdsp_skel.so这样的库只出现在现代骁龙的SoCs上。

有些库是由原始设备制造商实现的,并且只在特定供应商的设备上使用。例如,在三星S7 Edge上可以找到libedge_smooth_skel.so,在一加6T设备上可以找到libdepthmap_skel.so。

通常,所有skel库都位于/dsp或/供应商/dsp或/供应商/lib/rfsa/adsp目录中。默认情况下,remote_handle_open函数会精确扫描这些路径。此外,还有一个环境变量ADSP _图书馆_路径,其中可以添加一个新的搜索路径。

如前所述,所有的数字信号处理器库都是签名的,不能打补丁。然而,任何安卓应用程序都可以在其资产中携带一个由高通公司签名的框架库,将其提取到应用程序的数据目录中,将路径添加到ADSP _库_路径的开头,然后打开一个远程会话。该库已成功加载到数字信号处理器上,因为其签名正确。

事实上,没有加载框架库的版本检查,这使得运行一个非常旧的骨架库成为可能,该库在DSP上有一个已知的1天漏洞。即使更新的框架库已经存在于设备上,也可以通过在原始文件路径之前的ADSP _库_路径中指示它的位置来加载这个库的旧版本。这样,攻击者可以简单地绕过任何数字信号处理器补丁。此外,通过分析DSP软件补丁,攻击者可以在库中找到内部修复的漏洞,然后通过加载未修补的版本来利用它。

由于缺少该设备允许的批准/拒绝的框架库列表,因此可以在任何其他设备(例如三星)上运行针对一个设备(例如索尼Xperia)的库。这意味着在一个原始设备制造商库中发现的漏洞会危及所有基于高通的安卓设备。

基于反馈的Hexagon库的模糊测试

DSP库是私有的Hexagon elf。调试Hexagon可执行文件的最简单方法是使用开源的快速仿真器(QEMU)。QEMU在2019年底才添加了六边形指令集支持。我们修复了很多bug,以便能够在模拟器的用户模式下运行真正的DSP库。

在Ubuntu PC上,采用美国模糊算法AFL (AFL)结合QEMU对框架和对象DSP库进行模糊处理。

为了在模拟器上执行一个库代码,我们编写了一个简单的程序(Hexagon ELF二进制),它负责以下内容:

  • 将作为第一个命令行参数接收的数据文件解析为标量字和remote_arg数组。
  • dloopen一个在第二个命令行参数中指定的框架库。库可能依赖于其他框架和对象库。例如,libfastcvadsp_skel。这取决于libapps_mem_heap。所以,libdspCV_skel。所以,libfastcvadsp。所以自由。所有这些库都可以从固件中提取或从实际设备中提取。
  • 通过提供标量和remote_arg数组的指针作为参数来调用invoke函数的地址。例如,fastcvadsp_skel_invoke是对libfastcvadsp_skel.so库进行模糊测试的起始点。

我们的程序使用了以下输入文件格式:

  1. scalars值(4字节)。在图3中的一个例子中,标量值等于0x08020200,这意味着通过提供两个输入和两个输出参数来调用8号方法。
  2. 输入参数的大小(每个参数为4字节):0x10和0x20。
  3. 输出参数的大小(每个参数4个字节):0x80200和0x1000。
  4. 输入参数的值。在这个例子中,第一个参数的值是0x10字节的0x11,第二个参数的值是0x20字节的0x22。

对于每个输出参数,我们分配指定大小的内存,并用值0x1F填充它。

大多数框架库广泛使用DSP框架和系统调用。我们的简单程序不能处理这样的请求。因此,在执行其余代码之前,我们必须在模拟器上加载QuRT。最简单的方法是不使用真正的QuRT操作系统,而是使用它的“精简版”runelf。pbn,高通采用在Hexagon模拟器上执行,并包含在Hexagon SDK中。

AFL fuzzer可以改变数据文件的内容并触发runelf的执行。PBN在模拟器上。QuRT加载准备好的ELF二进制文件,然后调用目标框架库。在执行测试用例之后,QEMU将一个代码覆盖矩阵返回给AFL。

我们对模糊的结果感到惊讶。在我们选择模糊的所有DSP库中都发现了崩溃。在libfastcvadsp_skel中检测到数百个独特的崩溃。所以图书馆。

有趣的是,大多数问题都是在框架库中发现的,而不是在对象库中。这意味着Hexagon SDK会产生易受攻击的代码。

自动生成的代码

让我们看看开源的hexon_nn库,它是Hexagon SDK 3.5.1的一部分。这个库导出了许多用于神经网络相关计算的函数。

Hexagon SDK在编译库时自动生成hexon_nn_stub .c stub和hexon_nn_skelc skel模型。通过手动检查模块,可以很容易地检测到一些安全问题。我们只展示其中的两个。

数据打包(Marshaling)字符串(char*)参数

int hexagon_nn_op_name_to_id(const char name, unsigned int node_id) 函数需要一个输入(name)和一个输出(node_id)参数。下面的存根代码是由SDK生成的,用于处理这两个参数。

我们可以看到,除了现有的两个参数外,第三个remote_arg条目是在_pra数组的开头创建的。这个特殊的_pra[0]参数保存了名称字符串的长度。

名称本身保存在第二个remote_arg条目(_prin[0])中,它的长度将再次存储在其中,但这次存储在_prin [0].buf中。nLen字段。

skel代码提取这两个长度,并将它们作为带符号的int值进行比较。这就是问题所在。攻击者可以忽略存根代码,并在第一个remote_arg条目中写入一个负值(大于或等于0x80000000),绕过这个验证。然后,这个假长度被用作内存偏移量,并导致崩溃(读取到堆边界之外)。

为所有需要字符串参数的对象函数生成相同的代码。

数据打包(Marshaling)输入输出缓冲区

让我们看看int hexagon_nn_snpprint(hexagon_nn_id, unsigned char* buf, int bufLen)函数,它需要一个缓冲区和其长度作为参数。缓冲区同时用于输入和输出数据。因此,在存根代码中,它被分成两个独立的缓冲区(输入和输出缓冲区)。再一次,两个缓冲区的长度(_in1Len和_rout1Len)都存储在额外的remote_arg条目(_pra[0])中。

skel函数在调用对象函数之前将输入缓冲区复制(使用_MEMMOVEIF宏)到输出缓冲区。要复制的数据大小是在特殊的remote_arg条目(_pra[0])中持有的输入缓冲区的长度。

攻击者控制这个值。所有的验证检查都可以通过使用一个负的输入缓冲区的长度简单地绕过。

在检查缓冲区边界时将类型转换为有符号的int类型是一个导致堆溢出的错误。

总而言之,自动生成的代码将漏洞注入高通公司、OEM和所有其他使用Hexagon SDK的第三方开发者的库中。由于SDK中存在严重的漏洞,预装在安卓智能手机上的几十个DSP框架库存在漏洞。

利用DSP漏洞

让我们来看看在专有DSP骨架库中发现的众多漏洞之一,并尝试准备 "读什么 "和 "写什么 "的基元。

libfastcvadsp_skel.so库可以在大多数Android设备上找到。在下面的例子中,我们使用的是版本为1.7.1的库,从索尼Xperia XZ Premium设备中提取。恶意的安卓应用程序可以通过向remote_handle_invoke函数提供特制的参数,导致libfastcvadsp_skel.so库崩溃。图5中的数据文件显示了这种特制参数的一个例子。

如您所见,调用0x3F方法并为其提供一个输入参数和三个输出参数。输入参数的内容以字节0x14开始,包含以下主要字段:

  • 红色0x02显示要读多少个半字(大小)。
  • 黄色的0x44332211显示要读什么(源)。这个值是相对于DSP堆中第一个输出参数的开始的偏移。使用这个偏移量,我们可以控制读取的起始地址。这个偏移量可以是我们想要的长度,甚至可以是负数。
  • 青色的0x04显示了要读的地方(目的地)。这个值也是偏移量。

导致崩溃的原因是源地址不正确。

用于读取primitive的缩写PoC代码如下所示。

输入参数在DSP堆中总是位于输出参数之后。因此,在写入基元中,我们需要根据第一个输出参数的长度来转移源地址(所有其他参数都是空的)。

攻击者可以在DSP进程(User PD)的地址空间中操纵源和目的偏移量进行读写。第一个输出参数和内存中的libfastcvadsp_skel.so库之间的偏移量是一个常量值。在skel或对象库的数据段中找到一个指针来触发调用是很容易的。出于安全原因,我们将不公布DSP进程中代码执行的其余POC。

DSP用户域研究摘要

在这次对属于高通DSP用户域的骨架和对象库的安全研究中,我们发现了两个全局性的安全问题:

  • 缺少对DSP库的版本控制。这使得恶意的安卓应用可以进行降级攻击,在DSP上运行有漏洞的库。
  • Hexagon SDK中的漏洞导致高通公司所属的和移动供应商的代码中出现了数百个隐藏的漏洞。由于Hexagon SDK中的问题,基于Snapdragon的智能手机中嵌入的几乎所有DSP框架库都容易受到攻击。

我们向高通公司报告了几十个DSP库中约400个独特的崩溃,包括以下内容:

  • libfastcvadsp_skel.so
  • libdepthmap_skel.so
  • libscveT2T_skel.so
  • libscveBlobDescriptor_skel.so
  • libVC1DecDsp_skel.so
  • libcamera_nn_skel.so
  • libscveCleverCapture_skel.so
  • libscveTextReco_skel.so
  • libhexagon_nn_skel.so
  • libadsp_fd_skel.so
  • libqvr_adsp_driver_skel.so
  • libscveFaceRecognition_skel.so
  • libthread_blur_skel.so

为了证明这一点,我们利用其中一个已发现的漏洞,获得了在基于骁龙处理器的设备上执行无符号代码的能力,包括三星、Pixel、LG、小米、OnePlus、HTC和索尼手机。

一个能够访问DSP的用户域的安卓应用可以获得以下可能性:

  • 触发DSP内核死机并重启移动设备。
  • 隐藏恶意代码。反病毒软件不扫描Hexagon指令集。
  • cDSP负责对来自摄像头传感器的流媒体视频进行预处理。攻击者可以接管这个流程。
  • 访问DSP内核驱动程序。驱动程序中的漏洞可以将应用程序的权限扩大到客户操作系统或DSP内核的权限。

DSP驱动器

QuRT操作系统实现了自己的设备驱动模型,称为QuRT驱动调用(QDI)。QDI是无法从Android API中访问的。像POSIX一样,QDI设备驱动的操作权限高于请求驱动服务的用户代码。QDI提供了一个简单的驱动程序调用API,隐藏了所有与特权模式相关的实现细节。

libqurt.a库是Hexagon SDK的一部分,它包含QDI基础设施。FastRPC外壳与该库静态链接。

在QuRT的可执行二进制文件中可以找到几十个QDI驱动程序。它们通常被命名为/dev/...、/qdi/...、/power/...、/drv/...、/adsp/...或/qos/...。int qurt_qdi_open(const char* drv)函数可以用来获得对QDI驱动的访问。一个小的整数设备句柄会被返回。这是与POSIX文件描述符的直接平行。

QDI只提供了一个宏,是必要的用户可见的API。这个qurt_qdi_handle_invoke宏负责所有的通用驱动操作。事实上,qurt_qdi_open只是这个宏的一个特例。这些是宏的参数:

  1. QDI句柄或预定义的常量值之一。
  2. 定义所请求动作的方法编号。在SDK的头文件中,我们看到:
  3. 方法1和2保留给名称注册和名称查询。
  4. 3-31保留给开放句柄上的POSIX类型操作。
  5. 32 - 127是为QDI基础设施保留的。
  6. 128-255保留给自动生成的方法使用,比如可能由IDL生成的方法。
  7. 256和更高的是私有方法编号。驱动器可以随心所欲地使用这些方法。
  8. 0到9个可选的32位参数。

qurt_qdi_handle_invoke宏调用相关的设备驱动调用函数,该函数实现了主要的驱动逻辑,并提供了一个指定的方法号和可选的参数。

这是一个从用户PD代码中调用QDI驱动的例子。

一个QDI驱动使用int qurt_qdi_devname_register(const char name, qurt_qdi_obj_t opener) API函数在QuRT中注册自己。驱动程序提供它的名字和一个指向开启器对象的指针作为参数。

开启者对象的第一个字段是驱动程序调用函数。QuRT调用这个函数来处理来自用户PD或另一个驱动的驱动请求,并提供以下参数:

  • QDI句柄,代表发送QDI请求的客户端。
  • 发出该QDI请求的开启器对象。
  • 由调用者提供的QDI方法。
  • 由调用者提供的九个可选参数。

一般来说,驱动程序的调用函数是一个由QDI方法ID组成的开关运算符。每个方法可以使用与所提供的参数数量不同的参数。参数类型是qurt_qdi_arg_t。

请注意,驱动程序调用函数是基于模糊的漏洞研究的一个很好的目标,因为方法是由ID识别的,而不是由名称识别的,调用者不需要知道参数的确切数量和它们的实际类型来调用驱动程序方法。

基于反馈的QDI驱动器的模糊测试

为了fuzz Ubuntu个人电脑上的QDI驱动程序,我们使用了QEMU六边形和AFL的相同组合来模糊数字信号处理器库。然而,代替skel_loader程序,我们实现了另一个六边形ELF二进制qdi_exec,它负责这些操作:

  • 将作为第一个命令行参数接收的数据文件解析为QDI方法标识和驱动程序调用函数的九个参数的数组。
  • 通过第二个命令行参数中指定的地址调用驱动程序调用函数,并提供QDI方法标识和从数据文件中解码的参数。

我们为qdi_exec程序使用了以下输入文件格式:

  • 头部(4字节)。它包含三个有价值的字段:
  • QDI方法ID(10个低位)。在图中的例子中,它是0x01
  • 参数的数量(4位)。在这个例子中,只使用了一个参数。其余八个参数被认为是零。
  • 参数类型的掩码(9位)。正如我们前面提到的,每个参数要么是一个数字,要么是一个指向缓冲区的指针。在掩码中,每个参数由一个比特表示。值为0意味着该参数是一个数字,正值意味着该参数是一个缓冲区。
  • 缓冲区参数的大小(每个参数为4字节)。在这个例子中,长度为0x0A的/dev/diag字符串被用作参数。
  • 缓冲区参数的内容。

QDI驱动是作为QuRT ELF的一部分实现的。高通公司没有把它们包括在runelf.pbn版本的QuRT中,我们在模拟器上与我们的程序一起运行。因此,我们不得不对runelf.pbn ELF文件进行如下修补:

  1. 在runelf.pbn中添加用于真实设备的QuRT ELF的程序段。我们使用了从Pixel 4设备上提取的aDSP二进制文件。
  2. 将QDI驱动使用的malloc和memcpy内核函数重定向到其用户模式实现。内核内存函数限制了用户和内核空间之间的一些传输。

AFL fuzzer对数据文件的内容进行了修改,并在模拟器上触发了经过修补的runelf.pbn的执行。runelf.pbn加载了我们的qdi_exec程序,它直接调用了QDI驱动的调用函数。

我们通过对QuRT二进制文件的逆向工程,手动找到了QDI驱动调用函数的起始地址。开启者对象位于代码中的驱动程序名称旁边。

fuzzer在骁龙855 aDSP内置的十几个QDI驱动程序中发现了许多崩溃现象。其中大部分也适用于cDSP

利用QDI驱动程序中的漏洞

QDI驱动中的任何故障都可以被用来引起DSP内核的恐慌,并重新启动移动设备。例如,下面的每一行代码都会引起DSP恐慌,并可用于对设备进行DoS攻击。

出于研究目的,我们成功地利用了/dev/i2c QDI驱动的几个任意内核读写漏洞和/dev/glink QDI驱动的两个代码执行漏洞。出于安全原因,我们不能公布POC代码,但我们注意到,利用方法相当简单。这是一个读取primitive的例子:

恶意的安卓应用可以利用QDI驱动中发现的漏洞和用户PD的DSP库中描述的漏洞,在DSP客户操作系统的上下文中执行自定义代码。

从客体操作系统PD请求安卓服务

如果我们试图从DSP客体操作系统代码中打开一个与安卓有关的文件,会发生什么?答案是,QuRT会将我们的请求重定向到一个特殊的Android守护进程。如图9所示,在Snapdragon 855设备上,有两个aDSP守护进程和一个cDSP守护进程,它们以不同的权限运作。

在Pixel 4设备上,这些防护程序的启动命令可以在init.sm8150.rc文件中找到。

这些高权限的vendor.adsprpcd和vendor.cdsprpcd守护进程处理DSP客户操作系统请求。u:r:adsprpcd:s0和u:r:cdsprpcd:s0上下文只能访问与DSP有关的目录和对象。

结论

aDSP和cDSP子系统是非常有前途的安全研究领域。首先,DSP可以被第三方的Android应用程序调用。其次,DSP处理个人信息,如通过设备传感器的视频和语音数据。第三,正如我们在博客中介绍的那样,DSP组件中存在许多安全问题。

高通公司为披露的DSP漏洞分配了CVE-2020-11201、CVE-2020-11202、CVE-2020-11206、CVE-2020-11207、CVE-2020-11208和CVE-2020-11209。对于QDI驱动程序中发现的漏洞,高通公司决定不指定CVE。所有问题都已通过2020年11月的高通公司安全补丁成功修复。

出于研究目的,我们利用了一些已发现的漏洞,获得了在所有基于骁龙的移动终端的aDSP和cDSP上执行特权代码的能力。

相关推荐: 拿下靶机ColddWorld: Immersion

一、渗透环境 靶机名称:ColddWorld: Immersion来自vulnhub,下载地址为https://download.vulnhub.com/colddworld/Immersion_Machine.ova 靶机IP地址为192.168.17.14…