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로 실행된 워커에서 인증되지 않은 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 전용 |
제공된 Windows .bat 파일로 시작된 워커의 Connect REST에 브라우저나 curl을 연결합니다. FileStream 소스를 생성합니다. 워커는 file에 입력한 경로를 열고 바이트를 Kafka 토픽으로 프로듀스합니다. FileStream 싱크를 생성합니다. 워커는 file에 입력한 경로를 생성하거나 추가합니다. 허용 목록은 없습니다.
Unix 런처는 이미 connect-file.*.jar를 제외합니다. 동일한 JSON을 기본 connect-distributed.sh에 대해 실행하면 400: unknown connector가 반환됩니다. 기본 apache/kafka Docker는 Linux 브로커입니다. 이 잔여물은 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를 취약점으로 간주(두 워커 모두에서 비어 있음); Linux Docker가 이 버그라고 주장; Unix에서 201을 SUCCESS로 간주. 극적인 시도: 리버스 셸. 오라클은 Unix 400과 싱크 파일의 증인 라인입니다.
cd lab
./run.sh
Unix REST 127.0.0.1:18083은 기본 connect-distributed.sh입니다. Windows 시뮬레이션 127.0.0.1:18084는 필터링되지 않은 libs/*, 릴리스 .bat의 libs\* 루프입니다. Wine이 아닙니다. 브로커는 compose 네트워크의 apache/kafka:4.3.1입니다. 루프백에 바인딩하세요.
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