查看原文
其他

阿里云安全获Apache官方致谢 |Apache Druid 远程代码执行漏洞预警(CVE-2021-25646)

漏洞预警 阿里云先知 2021-02-02

01

时间轴

2021-01-17

阿里云安全@Litch1向Apache官方报告了Apache Druid远程代码执行漏洞

2021-01-17

阿里云WAF更新防护策略

2021-01-29

Apache Druid官方发布了漏洞补丁,分配CVE编号为CVE-2021-25646,并向阿里云安全公开致谢

2021-02-01

阿里云安全发布漏洞风险提示

02

漏洞分析

这个漏洞的根本问题是一个druid中全局性的问题,开发者在使用Jackson相关的标签时,出现疏漏,使得攻击者可以构造传入的json串来控制一些敏感的参数。
举其中一个利用的例子:

对于这一段代码来说,开发者认为这种写法中config参数是用户不可控的,因为config参数并没有JsonProperty注解,他的值由apache druid重写的GuiceInjectableValues操纵,预期应该是配置文件中的值(默认为关闭状态),而实际上在用户传入的json串被解析为JavaScriptDimFilter类型的实例时,config参数的值是用户可控的。

漏洞的关键:

在于对用JsonCreator注解修饰的方法来说,方法的所有参数都会解析成CreatorProperty类型,对于没有使用JsonProperty注解修饰的参数来说,会创建一个name为””的CreatorProperty,在用户传入键为””的json对象时就会被解析到对应的参数上。

03

调试信息

1.HTTP Server端采用的是Jersey框架,所有的配置信息都由Guice框架在启动的时候进行绑定注入,比如利用的JavaScriptConfig,初始化的时候读取配置文件中的druid.javascript.enabled绑定到JavaScriptConfig的enabled field,这部分是非本地用户不可控的。

2.解析用户输入的关键部分:  

com.fasterxml.jackson.databind.deser.BeanDeserializer#_deserializeUsingPropertyBased在解析的过程中,会拿解析到的json串中的“键名”去查找当前解析对象中对应的creatorProperty,这步对应的是findCreatorProperty方法,findCreatorProperty方法会去_propertyLookup 这个HashMap中查找”键名”对应的属性,在_propertyLookup中可以看到其中没有用JsonProperty注释修饰的JavaScriptConfig的键为””,要是json串中的键也为””,就能匹配上,取出JavaScriptConfig对应的creatorProperty拿到对应的creatorProperty之后就会将用户输入的json串中这个键对应的根据类型去反序列相应的参数,

可以看到反序列后这里的值就是用户输入的enabled为true的JavaScriptConfig,之后就会将这个值和对对应的creatorProp绑定起来(最后会绑定到对应的参数上)

3.最后漏洞的利用点就是利用config为true之后绕过了对于config的检查

之后传入的function会被javascript rhino引擎执行,其中的js代码是支持调用java函数的,所以可以调用系统命令。

04

漏洞证明


05

修复建议


  1. 升级Apache Druid 到最新的0.20.1版本 https://github.com/apache/druid/releases/tag/druid-0.20.1

  2. 对Apache Druid进行权限控制,只允许受信任的主机访问集群服务器

  3. 阿里云WAF支持该漏洞防御,并提供免费应急支持,请钉钉扫描下方二维码加入应急支持群



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存