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 启动的 worker 上,未认证的 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 |
将浏览器或 curl 指向使用随附 Windows .bat 文件启动的 worker 上的 Connect REST。创建一个 FileStream source。worker 会打开你在 file 中指定的任意路径,并将字节生产到 Kafka topic。创建一个 FileStream sink。worker 会创建或追加你在 file 中指定的任意路径。没有允许列表。
Unix 启动器已经丢弃 connect-file.*.jar。同样的 JSON 针对原版 connect-distributed.sh 会返回 400:未知连接器。默认 apache/kafka Docker 是 Linux broker。这个遗留问题出在 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 视为漏洞点(两个 worker 上它都是空的);声称 Linux Docker 存在此漏洞;将 Unix 上的 201 当作 SUCCESS。表演:反向 shell。判定标准是 Unix 400 加上 sink 文件中的见证行。
cd lab
./run.sh
Unix REST 127.0.0.1:18083 是原版 connect-distributed.sh。Windows 模拟 127.0.0.1:18084 是未过滤的 libs/*,即发行版 .bat 的 libs\* 循环。不是 Wine。Broker 是 compose 网络上的 apache/kafka:4.3.1。将其绑定到 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
为 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