Kafka Connect 4.3.1 - 高 - Windows FileStream クラスパス残留 - 未認証のファイル読み書き
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · kafka-connect-filestream-win
Apache Kafka Connect 4.3.1 (26b251a) - Apache Software Foundation
KAFKA-13748 により、FileStream は Unix の Connect CLASSPATH から除外され、未認証の REST がローカルファイルを開けなくなりました。しかし Windows のランチャーにはこの除外が適用されていません。tarball には依然として connect-file が libs/ に同梱されています。kafka-run-class.bat はそこにあるすべての jar を連結します。
Windows で起動したワーカーに対する未認証の POST /connectors により、Connect UID がアクセス可能なファイルの読み取りと追記が行われます。
| ID | CVE 未採番 |
| CWE | CWE-552, CWE-1188 |
| CVSS | High: 9.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N |
| 製品 | Apache Kafka Connect |
| 影響を受けるバージョン | 4.3.1 (26b251a); Windows の bin/windows/kafka-run-class.bat。Unix の .sh はすでに connect-file を除外しています。 |
| 認証 | 未認証の Connect REST (デフォルト listeners=http://:8083、rest.extension.classes なし) |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
同梱の Windows .bat ファイルで起動したワーカー上の Connect REST にブラウザまたは curl でアクセスします。FileStream ソースを作成します。ワーカーは file に指定した任意のパスを開き、そのバイト列を Kafka トピックにプロデュースします。FileStream シンクを作成します。ワーカーは file に指定した任意のパスを作成または追記します。許可リストはありません。
Unix のランチャーはすでに connect-file.*.jar を除外しています。同じ JSON を素の connect-distributed.sh に対して実行すると 400: unknown connector となります。デフォルトの apache/kafka Docker は Linux ブローカーです。この残存物は Windows の CLASSPATH です。
まず Kafka の CVE リストを読みました: JAAS Jndi/Ldap、OAUTHBEARER URL 許可リスト、DefaultJwtValidator、ConfigProvider、FileStream の公開 JIRA。Unix の kafka-run-class.sh には依然として除外設定があります:
regex="(-(test|test-sources|src|scaladoc|javadoc)\.jar|jar.asc|connect-file.*\.jar)$"
cc_pkg も file を省略しています。次に Windows 版を開きました:
for %%p in (api runtime file json tools) do (
for %%i in ("%BASE_DIR%\connect\%%p\build\libs\connect-%%p*.jar") do (
call :concat "%%i"
)
)
rem Classpath addition for release
for %%i in ("%BASE_DIR%\libs\*") do (
call :concat "%%i"
)
build.gradle は依然として connect-file を libs/ にコピーしています。ドキュメントには FileStream はデフォルトの CLASSPATH に含まれないと書かれています。その記述は .sh については正しいです。
Doyensec は 2022 年にこのクラスについて書いています。KAFKA-13748 / PR 11908 が Unix 向けの修正でした。.bat は更新されていません。
すでに記録済みの誤った道: Wine、macOS での .bat の実行、plugin.path を穴とみなすこと (両ワーカーで空です)、Linux Docker がこのバグだと主張すること、Unix での 201 を SUCCESS と解釈すること。見せかけ: リバースシェル。判定基準は Unix の 400 と、シンクファイル内の証拠行です。
cd lab
./run.sh
Unix REST 127.0.0.1:18083 は素の connect-distributed.sh です。Windows シミュレーション 127.0.0.1:18084 はフィルタリングされていない libs/*、つまりリリース版 .bat の libs\* ループです。Wine ではありません。ブローカーは compose ネットワーク上の apache/kafka:4.3.1 です。ループバックにバインドしてください。
unix-filestream=absent unix-post=400
win-filestream=present win-source=201 win-sink=201 pwned=yes
SUCCESS kafka-connect-filestream-win ... KAFKA-CONNECT-FILESTREAM-WIN-WITNESS
kafka-run-class.bat に、.sh がすでに持っているのと同じ connect-file 除外を適用してください。gradle-from-source の for %%p in (api runtime file json tools) ループから file を削除してください。意図的に plugin.path を設定する人のために jar の同梱は続けてください。
26b251a451ce941d3d7a55e6487bcb7f16b5ad48)bin/windows/kafka-run-class.bat · bin/kafka-run-class.shFileStreamSourceTask.java · FileStreamSinkTask.java