阿里云安全获Apache官方致谢 |Apache Druid 远程代码执行漏洞预警(CVE-2021-25646)
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
可以看到反序列后这里的值就是用户输入的enabled为true的JavaScriptConfig,之后就会将这个值和对对应的creatorProp绑定起来(最后会绑定到对应的参数上)
3.最后漏洞的利用点就是利用config为true之后绕过了对于config的检查
之后传入的function会被javascript rhino引擎执行,其中的js代码是支持调用java函数的,所以可以调用系统命令。
04
漏洞证明
05
修复建议
升级Apache Druid 到最新的0.20.1版本 https://github.com/apache/druid/releases/tag/druid-0.20.1
对Apache Druid进行权限控制,只允许受信任的主机访问集群服务器
阿里云WAF支持该漏洞防御,并提供免费应急支持,请钉钉扫描下方二维码加入应急支持群