查看原文
其他

ClickHouse多个漏洞原理分析

启明星辰 ADLab 2023-01-16

更多安全资讯和分析文章请关注启明星辰ADLab微信公众号及官方网站(adlab.venustech.com.cn)












一、漏洞概述


ClickHouse是俄罗斯yandex公司于2016年开源的云数据库管理系统,ClickHouse广泛应用于云平台的大数据分析应用中,其用户包括uber、ebay、德意志银行、阿里巴巴、腾讯等。
近日,JFrog安全研究团队披露了在ClickHouse DBMS中发现的7个漏洞,拥有ClickHouse最低权限的攻击者可以通过这些漏洞使ClickHouse服务器崩溃、泄漏内存内容,甚至导致远程代码执行(RCE)。

漏洞影响了ClickHouse 21.10.2.15版本之前的所有版本。具体漏洞描述如下表所示:

CVE ID

描述

危害

CVESSv3.1得分

CVE-2021-43304

LZ4压缩算法编码器解压恶意的查询数据时导致堆溢出。

远程代码执行

8.8

CVE-2021-43305

LZ4压缩算法编码器解压恶意的查询数据时导致堆溢出。

远程代码执行

8.8

CVE-2021-42387

LZ4压缩算法编码器解压恶意的查询数据时导致堆越界读。

拒绝服务或信息泄露

7.1

CVE-2021-42388

LZ4压缩算法编码器解压恶意的查询数据时导致堆越界读。

拒绝服务或信息泄露

7.1

CVE-2021-42389

Delta压缩算法编码器解压恶意的查询数据时导致除0错误。

拒绝服务

6.5

CVE-2021-42390

Delta压缩算法编码器解压恶意的查询数据时导致除0错误。

拒绝服务

6.5

CVE-2021-42391

Delta压缩算法编码器解压恶意的查询数据时导致除0错误。

拒绝服务

6.5


二、处置建议


2021年10月18日发布的ClickHouse 21.10.2.15版本修复了上述的7个漏洞,请尽快升级到ClickHouse 21.10.2.15及以后的版本。
下载链接:

https://github.com/ClickHouse/ClickHouse/releases/

缓解措施:

如果无法升级,请在服务器中添加防火墙策略,限制只允许特定IP的客户端访问WEB端口(8123)和TCP服务器端口(9000)。


三、漏洞分析


这些漏洞都存在ClickHouse Server处理压缩数据的请求处理过程中,ClickHouse Server支持对用户请求的附带数据进行压缩。用户可以在发起WEB请求时,将decompress标志设为1即可,举例如下:

cat query.bin | curl -sS —data-binary @-‘http://serverIP:8123/?user=xxx&password=xxx&decompress=1' 

查询的附带数据(query.bin)可以按下面的结构进行组织:

ClickHouse支持多种压缩格式包括LZ4GorillaDelta等多种压缩算法。ClickHouse Server根据请求中附带数据的压缩算法标识调用不同的解压算法来对数据进行解压。

3.1 LZ4算法介绍

LZ4压缩算法是LZ算法系列中的一种,也是目前综合效率最快的压缩算法之一。

一个LZ4压缩块由多个LZ4序列组成,LZ4序列由以下数据构成,如下图所示:

Token大小1字节,高4bits不可压缩数据(literal)的长度(literallength),而4bits可以压缩数据(match)长度(match length)如果literallength的值为0,则表示后续数据里没有literal由于literal length只有4比特来表示,它的最大值为15literal数据的大小大于等于15时,需要在Token字段后添加格外的字节来表示literal的长度(Literal length+)。

如果match length的值为0,则表示后续数据里没有match。由于matchlength只有4比特来表示,它的最大值为15。当match数据的大小大于等于15时,需要在offset字段后添加格外的字节来表示match的长度(match length+)。
Literals指没有重复、首次出现的字节流,即不可压缩的部分。
Offset指的是现在字符串离它的匹配项的长度,而匹配长度指的是现在字符串与字典中相同字符串的匹配长度。offset占用2个字节,即最大值为65535。

Match指重复项,可以压缩的部分。

 3.2 CVE-2021-43304原理

src/Compression/LZ4_decompress_faster.cpp的decompressImpl函数在拷贝LZ4序列数据的literal时,没有判断复制的数据是否超过目标缓冲区的限制。当需要复制的数据超过目标缓存的大小时,会导致堆溢出。

如上图代码所示,ip是指向压缩缓冲区的指针。op是指向分配的目标缓冲区的指针,该目标缓冲区的大小为报头中给定的解压大小。copy_end是指向复制区域末端的指针。
copy_amount是模板的参数,可以是8、16或32。复制区域被分块复制,每个块的大小都与复制量相同。

攻击者可以构造恶意的LZ4序列数据,其中litera的长度(length变量)大于dest_size,将导致堆溢出。

3.3 CVE-2021-43304漏洞复现
我们可以构造这样的请求数据,其中压缩算法为LZ4,literal的长度为255*200,而dest_size为1。由于literal的大小远大于解压后缓冲区的大小,当clickhouse_server进行复制操作时将导致堆溢出,触发程序崩溃。

3.4 CVE-2021-43305漏洞原理

漏洞存在src/Compression/LZ4_decompress_faster.cpp的decompressImpl函数中,该函数直接从LZ4压缩数据中读取16位无符号偏移量(offset攻击者可以控制),offset用于定位match数据的位置,当offset的值大于dest_size的值时,copyOverlap操作将导致堆溢出。

3.5 CVE-2021-42388及CVE-2021-42387漏洞原理

漏洞存在src/Compression/LZ4_decompress_faster.cpp的decompressImpl函数中,该函数直接从LZ4压缩数据中读取16位无符号偏移量(offset攻击者可以控制),该偏移量用于计算wildCopy操作的源数据地址。当offset的值为大于copy_amount时(如offset = 0xffff),将导致程序将op地址之前的数据拷贝到op指向的地址中,从而导致越界读。

CVE-2021-42387是CVE-2021-42388的一个类似漏洞,这里就不再介绍。
3.6 CVE-2021-42389、CVE-2021-42390、CVE-2021-42391漏洞原理

ClickHouse支持的DoubleDelta编解码器、Delta编解码器、Gorilla编解码器中都存在被零除的漏洞。它们基于将压缩缓冲区的第一个字节设置为零。解压代码读取压缩缓冲区的第一个字节,并对其执行模运算以获得剩余字节,当source[0]为0时,CPU对0进行取模时操作将发生除0异常。


四、结束语


大数据时代下,大量数据聚集、连接及网络边界的延伸都为数据库的的安全提出了更高的要求。数据库作为信息技术系统的核心和基础,承载着越来越多的关键业务系统,成为企业和机构最具有战略性的核心数据资产,因此数据库方面的安全值得我们持续关注。


参考链接:

[1]https://jfrog.com/blog/7-rce-and-dos-vulnerabilities-found-in-clickhouse-dbms/

[2]https://github.com/ClickHouse/ClickHouse

[3]https://thehackernews.com/2022/03/multiple-flaws-uncovered-in-clickhouse.html






启明星辰积极防御实验室(ADLab)





ADLab成立于1999年,是中国安全行业最早成立的攻防技术研究实验室之一,微软MAPP计划核心成员,“黑雀攻击”概念首推者。截止目前,ADLab已通过CVE累计发布安全漏洞近1100个,通过 CNVD/CNNVD累计发布安全漏洞2000余个,持续保持国际网络安全领域一流水准。实验室研究方向涵盖操作系统与应用系统安全研究、移动智能终端安全研究、物联网智能设备安全研究、Web安全研究、工控系统安全研究、云安全研究。研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。






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

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