ClickHouse多个误差原理剖析
宣布时间 2022-03-21一、误差概述
ClickHouse是俄罗斯yandex公司于2016年开源的云数据库管理系统,ClickHouse普遍应用于云平台的大数据剖析应用中,其用户包括uber、ebay、德意志银行、阿里巴巴、腾讯等。
误差影响了ClickHouse 21.10.2.15版本之前的所有版本。详细误差形貌如下表所示:

二、处置惩罚建议
2021年10月18日宣布的ClickHouse 21.10.2.15版本修复了上述的7个误差,请尽快升级到ClickHouse 21.10.2.15及以后的版本。
https://github.com/ClickHouse/ClickHouse/releases/
缓解步伐:
三、误差剖析
这些误差都保存ClickHouse Server处置惩罚压缩数据的请求处置惩罚历程中,ClickHouse Server支持对用户请求的附带数据举行压缩。用户可以在提倡WEB请求时,将decompress标记设为1即可,举例如下:
盘问的附带数据(query.bin)可以按下面的结构举行组织:

ClickHouse支持多种压缩名堂,包括LZ4、Gorilla、Delta等多种压缩算法。ClickHouse Server凭证请求中附带数据的压缩算法标识,挪用差别的解压算法来对数据举行解压。
3.1 LZ4算法先容
LZ4压缩算法是LZ算法系列中的一种,也是现在综合效率最快的压缩算法之一。
一个LZ4压缩块由多个LZ4序列组成,LZ4序列由以下数据组成,如下图所示:

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指重复项,可以压缩的部分。
src/Compression/LZ4_decompress_faster.cpp的decompressImpl函数在拷贝LZ4序列数据的literal时,没有判断复制的数据是否凌驾目的缓冲区的限制。当需要复制的数据凌驾目的缓存的巨细时,会导致堆溢出。

如上图代码所示,ip是指向压缩缓冲区的指针。op是指向分派的目的缓冲区的指针,该目的缓冲区的巨细为报头中给定的解压巨细。copy_end是指向复制区域最后的指针。
攻击者可以结构恶意的LZ4序列数据,其中litera的长度(length变量)大于dest_size,将导致堆溢出。

3.4 CVE-2021-43305误差原理

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的一个类似误差,这里就不再先容。
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


京公网安备11010802024551号