ClickHouse多个漏洞原理分析

宣布时间 2022-03-21

一、漏洞概述


ClickHouse是俄罗斯yandex公司于2016年开源的云数据库管理系统 ,ClickHouse广泛应用于云平台的大数据分析应用中 ,其用户包罗uber、ebay、德意志银行、阿里巴巴、腾讯等 。


近日 ,JFrog宁静研究团队披露了在ClickHouse DBMS中发现的7个漏洞 ,拥有ClickHouse最低权限的攻击者可以通过这些漏洞使ClickHouse服务器瓦解、泄漏内存内容 ,甚至导致远程代码执行(RCE) 。

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


图片1.png


二、处置建议


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)可以按下面的结构进行组织:


图片2.png


ClickHouse支持多种压缩格式 ,包罗LZ4、Gorilla、Delta等多种压缩算法 。ClickHouse Server凭据请求中附带数据的压缩算法标识 ,调用差异的解压算法来对数据进行解压 。


3.1 LZ4算法介绍


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

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


图片3.png

Token巨细为1字节 ,高4个bits为不行压缩数据(literal)的长度(literallength) ,而低4个bits为可以压缩数据(match)长度(match length) 。如果literallength的值为0 ,则体现后续数据里没有literal 。由于literal length只有4比特来体现 ,它的最大值为15 。当literal数据的巨细大于即是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时 ,没有判断复制的数据是否凌驾目标缓冲区的限制 。当需要复制的数据凌驾目标缓存的巨细时 ,会导致堆溢出 。


图片4.png


如上图代码所示 ,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进行复制操作时将导致堆溢出 ,触发法式瓦解 。


图片5.png


3.4 CVE-2021-43305漏洞原理


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


图片6.png


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指向的地址中 ,从而导致越界读 。


图片7.png


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异常 。


图片8.png


四、结束语


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


参考链接:

[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