Kafka Connect 4.3.1 - Élevé - Résidu de classpath Windows FileStream - lecture/écriture de fichiers non authentifiée
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 a retiré FileStream du CLASSPATH Connect sous Unix afin qu'une REST non authentifiée ne puisse pas ouvrir des fichiers locaux. Le lanceur Windows n'a jamais reçu cette exclusion. L'archive livre toujours connect-file dans libs/. kafka-run-class.bat y concatène chaque jar.
Un POST /connectors non authentifié sur un worker lancé sous Windows lit et ajoute des fichiers auxquels l'UID de Connect a accès.
| ID | pas encore de CVE |
| CWE | CWE-552, CWE-1188 |
| CVSS | Élevé : 9.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N |
| Produit | Apache Kafka Connect |
| Affecté | 4.3.1 (26b251a) ; Windows bin/windows/kafka-run-class.bat. Le .sh Unix exclut déjà connect-file. |
| Auth | REST Connect non authentifiée (par défaut listeners=http://:8083, sans rest.extension.classes) |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 uniquement |
Pointez un navigateur ou curl vers Connect REST sur un worker démarré avec les fichiers .bat Windows fournis. Créez une source FileStream. Le worker ouvre le chemin que vous mettez dans file et produit les octets sur un topic Kafka. Créez un sink FileStream. Le worker crée ou ajoute le chemin que vous mettez dans file. Il n'y a pas de liste d'autorisation.
Le lanceur Unix retire déjà connect-file.*.jar. Le même JSON contre le connect-distributed.sh d'origine renvoie un 400 : connecteur inconnu. Le Docker apache/kafka par défaut est le broker Linux. Ce reliquat est le CLASSPATH Windows.
J'ai d'abord lu la liste des CVE Kafka : JAAS Jndi/Ldap, liste d'autorisation d'URL OAUTHBEARER, DefaultJwtValidator, ConfigProvider, le JIRA public de FileStream. Le kafka-run-class.sh Unix contient toujours l'exclusion :
regex="(-(test|test-sources|src|scaladoc|javadoc)\.jar|jar.asc|connect-file.*\.jar)$"
cc_pkg omet également file. J'ai ensuite ouvert la copie 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 copie toujours connect-file dans libs/. La documentation indique que FileStream n'est pas sur le CLASSPATH par défaut. Cette phrase est vraie pour le .sh.
Doyensec a écrit cette classe en 2022. KAFKA-13748 / PR 11908 était le correctif Unix. Le .bat n'a jamais été mis à jour.
Fausses pistes déjà consignées : Wine ; exécuter le .bat sur macOS ; considérer plugin.path comme la faille (il est vide sur les deux workers) ; prétendre que le Docker Linux est ce bug ; prendre un 201 sous Unix pour un SUCCÈS. Théâtre : un reverse shell. L'oracle est le 400 Unix plus une ligne témoin dans le fichier sink.
cd lab
./run.sh
La REST Unix 127.0.0.1:18083 est le connect-distributed.sh d'origine. La simulation Windows 127.0.0.1:18084 est le libs/* non filtré, la boucle libs\* du .bat de release. Pas Wine. Le broker est apache/kafka:4.3.1 sur le réseau compose. Liez-le à 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
Donnez à kafka-run-class.bat la même exclusion connect-file que celle déjà présente dans le .sh. Retirez file de la boucle gradle-from-source for %%p in (api runtime file json tools). Continuez à livrer le jar pour ceux qui définissent plugin.path volontairement.
26b251a451ce941d3d7a55e6487bcb7f16b5ad48)bin/windows/kafka-run-class.bat · bin/kafka-run-class.shFileStreamSourceTask.java · FileStreamSinkTask.java