Kafka Connect 4.3.1 - उच्च - Windows FileStream classpath अवशेष - अनधिकृत फ़ाइल पढ़ना/लिखना
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 से हटा दिया ताकि unauth REST स्थानीय फ़ाइलें न खोल सके। Windows launcher को वह exclude कभी नहीं मिला। tarball अभी भी connect-file को libs/ में भेजता है। kafka-run-class.bat वहाँ मौजूद हर jar को concatenate करता है।
Windows-launched worker पर unauth POST /connectors उन फ़ाइलों को पढ़ता और append करता है जिन्हें 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 |
| Product | Apache Kafka Connect |
| Affected | 4.3.1 (26b251a); Windows bin/windows/kafka-run-class.bat. Unix .sh पहले से connect-file को exclude करता है। |
| Auth | unauthenticated Connect REST (default listeners=http://:8083, no rest.extension.classes) |
| License | GNU Affero GPL v3.0 |
| Lab | केवल 127.0.0.1 |
शिप किए गए Windows .bat फ़ाइलों के साथ शुरू किए गए worker पर Connect REST को browser या curl से target करें। एक FileStream source बनाएँ। Worker आपके द्वारा file में डाले गए किसी भी path को खोलता है और bytes को Kafka topic पर produce करता है। एक FileStream sink बनाएँ। Worker आपके द्वारा file में डाले गए किसी भी path को बनाता या append करता है। कोई allowlist नहीं है।
Unix launcher पहले से connect-file.*.jar को drop करता है। stock connect-distributed.sh के विरुद्ध वही JSON एक 400 है: unknown connector। Default apache/kafka Docker Linux broker है। यह leftover Windows CLASSPATH है।
मैंने पहले Kafka CVE सूची पढ़ी: JAAS Jndi/Ldap, OAUTHBEARER URL allowlist, DefaultJwtValidator, ConfigProvider, FileStream का public JIRA। Unix kafka-run-class.sh में अभी भी exclude मौजूद है:
regex="(-(test|test-sources|src|scaladoc|javadoc)\.jar|jar.asc|connect-file.*\.jar)$"
cc_pkg भी file को छोड़ देता है। फिर मैंने Windows copy खोली:
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/ में copy करता है। Docs कहते हैं कि FileStream default CLASSPATH पर नहीं है। वह वाक्य .sh के लिए सत्य है।
Doyensec ने यह class 2022 में लिखी थी। KAFKA-13748 / PR 11908 Unix fix था। .bat को कभी update नहीं किया गया।
पहले से दर्ज गलत रास्ते: Wine; macOS पर .bat execute करना; plugin.path को छेद मानना (यह दोनों workers पर खाली है); Linux Docker को यह bug बताना; Unix पर 201 को SUCCESS मानना। नाटक: एक reverse shell। Oracle Unix 400 और sink फ़ाइल में एक witness line है।
cd lab
./run.sh
Unix REST 127.0.0.1:18083 stock connect-distributed.sh है। Windows-sim 127.0.0.1:18084 unfiltered libs/* है, release .bat का libs\* loop। Wine नहीं। Broker compose network पर apache/kafka:4.3.1 है। इसे loopback पर bind करें।
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 को वही connect-file exclude दें जो .sh में पहले से है। gradle-from-source for %%p in (api runtime file json tools) loop से file को हटा दें। उन लोगों के लिए jar शिप करना जारी रखें जो जानबूझकर plugin.path सेट करते हैं।
26b251a451ce941d3d7a55e6487bcb7f16b5ad48)bin/windows/kafka-run-class.bat · bin/kafka-run-class.shFileStreamSourceTask.java · FileStreamSinkTask.java