Kafka Connect 4.3.1 - Alta - Resto de classpath de Windows FileStream - lectura/escritura de archivos sin autenticación
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 sacó FileStream del CLASSPATH de Connect en Unix para que el REST sin autenticación no pudiera abrir archivos locales. El lanzador de Windows nunca recibió esa exclusión. El tarball sigue incluyendo connect-file en libs/. kafka-run-class.bat concatena todos los jars que hay allí.
Un POST /connectors sin autenticación en un worker lanzado en Windows lee y añade archivos a los que el UID de Connect puede acceder.
| ID | sin CVE todavía |
| CWE | CWE-552, CWE-1188 |
| CVSS | Alto: 9.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N |
| Producto | Apache Kafka Connect |
| Afectado | 4.3.1 (26b251a); Windows bin/windows/kafka-run-class.bat. El .sh de Unix ya excluye connect-file. |
| Autenticación | Connect REST sin autenticación (por defecto listeners=http://:8083, sin rest.extension.classes) |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1 |
Apunta un navegador o curl al Connect REST en un worker iniciado con los archivos .bat de Windows incluidos. Crea un source de FileStream. El worker abre cualquier ruta que pongas en file y produce los bytes en un topic de Kafka. Crea un sink de FileStream. El worker crea o añade cualquier ruta que pongas en file. No hay lista de permitidos.
El lanzador de Unix ya descarta connect-file.*.jar. El mismo JSON contra el connect-distributed.sh estándar devuelve un 400: conector desconocido. El Docker apache/kafka por defecto es el broker de Linux. Este residuo es el CLASSPATH de Windows.
Primero leí la lista de CVE de Kafka: JAAS Jndi/Ldap, lista de permitidos de URL de OAUTHBEARER, DefaultJwtValidator, ConfigProvider, el JIRA público de FileStream. El kafka-run-class.sh de Unix todavía tiene la exclusión:
regex="(-(test|test-sources|src|scaladoc|javadoc)\.jar|jar.asc|connect-file.*\.jar)$"
cc_pkg tampoco incluye file. Luego abrí la copia de 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 sigue copiando connect-file en libs/. La documentación dice que FileStream no está en el CLASSPATH por defecto. Esa frase es cierta para el .sh.
Doyensec escribió esta clase en 2022. KAFKA-13748 / PR 11908 fue el arreglo de Unix. El .bat nunca se actualizó.
Caminos equivocados ya registrados: Wine; ejecutar el .bat en macOS; tratar plugin.path como el agujero (está vacío en ambos workers); afirmar que el Docker de Linux es este bug; tomar un 201 en Unix como SUCCESS. Teatro: una reverse shell. El oráculo es el 400 de Unix más una línea testigo en el archivo sink.
cd lab
./run.sh
El REST de Unix 127.0.0.1:18083 es el connect-distributed.sh estándar. El Windows-sim 127.0.0.1:18084 es libs/* sin filtrar, el bucle libs\* del .bat de la release. No es Wine. El broker es apache/kafka:4.3.1 en la red de compose. Enlázalo a 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
Dale a kafka-run-class.bat la misma exclusión de connect-file que el .sh ya tiene. Elimina file del bucle for %%p in (api runtime file json tools) de gradle-from-source. Sigue distribuyendo el jar para quienes configuran plugin.path a propósito.
26b251a451ce941d3d7a55e6487bcb7f16b5ad48)bin/windows/kafka-run-class.bat · bin/kafka-run-class.shFileStreamSourceTask.java · FileStreamSinkTask.java