Kafka Connect 4.3.1 - Alta - Residuo di classpath della classe FileStream su Windows - lettura/scrittura di file non autenticata
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 ha rimosso FileStream dal CLASSPATH di Connect su Unix, così che il REST non autenticato non potesse aprire file locali. Il launcher Windows non ha mai ricevuto quell'esclusione. Il tarball continua a includere connect-file in libs/. kafka-run-class.bat concatena ogni jar presente lì dentro.
Una POST /connectors non autenticata su un worker avviato su Windows legge e aggiunge file che l'UID di Connect può toccare.
| ID | nessuna CVE al momento |
| 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 |
| Prodotto | Apache Kafka Connect |
| Affetto | 4.3.1 (26b251a); Windows bin/windows/kafka-run-class.bat. Lo .sh Unix esclude già connect-file. |
| Auth | Connect REST non autenticato (default listeners=http://:8083, nessun rest.extension.classes) |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Punta un browser o curl verso Connect REST su un worker avviato con i file .bat Windows forniti. Crea un source FileStream. Il worker apre qualunque percorso tu metta in file e produce i byte su un topic Kafka. Crea un sink FileStream. Il worker crea o aggiunge qualunque percorso tu metta in file. Non esiste alcuna allowlist.
Il launcher Unix elimina già connect-file.*.jar. Lo stesso JSON contro il connect-distributed.sh stock restituisce un 400: connettore sconosciuto. Il Docker apache/kafka predefinito è il broker Linux. Questo residuo è il CLASSPATH di Windows.
Ho letto prima la lista delle CVE di Kafka: JAAS Jndi/Ldap, allowlist URL OAUTHBEARER, DefaultJwtValidator, ConfigProvider, la JIRA pubblica di FileStream. Il kafka-run-class.sh Unix ha ancora l'esclusione:
regex="(-(test|test-sources|src|scaladoc|javadoc)\.jar|jar.asc|connect-file.*\.jar)$"
Anche cc_pkg omette file. Poi ho aperto la copia 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 copia ancora connect-file in libs/. La documentazione dice che FileStream non è nel CLASSPATH predefinito. Quella frase è vera per lo .sh.
Doyensec ha descritto questa classe nel 2022. KAFKA-13748 / PR 11908 è stata la correzione per Unix. Il .bat non è mai stato aggiornato.
Vicoli ciechi già registrati: Wine; eseguire il .bat su macOS; considerare plugin.path come la falla (è vuoto su entrambi i worker); sostenere che il Docker Linux sia questo bug; prendere un 201 su Unix come SUCCESS. Teatro: una reverse shell. L'oracolo è il 400 su Unix più una riga testimone nel file sink.
cd lab
./run.sh
Il REST Unix 127.0.0.1:18083 è il connect-distributed.sh stock. Il Windows-sim 127.0.0.1:18084 è libs/* non filtrato, il loop libs\* del .bat di release. Non Wine. Il broker è apache/kafka:4.3.1 sulla rete compose. Associalo al loopback.
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
Dai a kafka-run-class.bat la stessa esclusione di connect-file che lo .sh ha già. Rimuovi file dal loop gradle-from-source for %%p in (api runtime file json tools). Continua a distribuire il jar per chi imposta plugin.path di proposito.
26b251a451ce941d3d7a55e6487bcb7f16b5ad48)bin/windows/kafka-run-class.bat · bin/kafka-run-class.shFileStreamSourceTask.java · FileStreamSinkTask.java