
CVE-2026-39987에 대한 개념 증명(PoC)
면책 조항 이 스크립트는 교육 및 승인된 테스트 목적으로만 사용됩니다. 명시적 허가 없이 시스템에 대해 이 도구를 무단 사용하는 것은 불법입니다. 작성자는 이 정보의 오용에 대해 어떤 책임도 지지 않습니다.
0.23.0 이전 버전의 Marimo에는 사전 인증 없이 악용 가능한 심각한 원격 명령 실행(RCE) 취약점이 있습니다. /terminal/ws 엔드포인트는 적절한 접근 제어를 구현하지 않아, 인증되지 않은 공격자가 시스템에 대한 전체 대화형 셸 액세스 권한을 얻을 수 있습니다.
| 세부 사항 | 정보 |
|---|---|
| CVE | CVE-2026-39987 |
| 심각도 | CRITICAL |
| CVSS 점수 | 9.3 (CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H) |
| 유형 | 사전 인증 원격 코드 실행 (RCE) |
| 벡터 | WebSocket (/terminal/ws) |
| 영향받는 제품 | Marimo < 0.23.0 |
| 패치 | Marimo ≥ 0.23.0 |
http.favicon.hash:-1864630356
services.http.response.favicons.hashes: -1864630356
-1864630356/api/versionPython 3.10+가 필요합니다. 의존성은 Astral의 uv로 관리됩니다.
# install uv (skip if already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh
uv venv
uv pip install -r requirements.txt
uv run poc.py -t <target_url>
-t, --target_url (필수): 대상의 /terminal/ws 엔드포인트에 대한 WebSocket URI입니다.uv run poc.py -t wss://<target-host>/terminal/ws
연결되면 대화형 raw pty 세션을 얻게 됩니다. 로컬에서 사용할 수 있는 추가 명령어(입력한 그대로 원격 셸로 전송되지 않음):
| 명령어 | 설명 |
|---|---|
.upload | 로컬 파일 경로와 원격 대상 경로를 입력받는 로컬 프롬프트를 열고, 파일을 업로드합니다. |
!upload <local_path> <remote_path> | 위와 동일하되 한 줄로 입력합니다. |
!download <remote_path> <local_path> | 대상에서 파일을 가져와 로컬 머신으로 다운로드합니다. |
/exit, /bye | 로컬에서 세션을 종료합니다. |
Ctrl+C를 눌러 중단/종료합니다.
>= 0.23.0으로 업그레이드하세요. /terminal/ws의 누락된 접근 제어를 수정합니다.localhost 또는 내부 인터페이스에 바인딩하고, 원격 액세스에는 VPN/배스천 호스트를 앞에 두세요./terminal/ws 및 기타 API 경로 앞에서 인증을 강제하는 리버스 프록시(예: OAuth2 프록시, mTLS) 뒤에 서비스를 배치하세요./terminal/ws에 대한 예기치 않은 WebSocket 연결과 서버 로그의 인증되지 않은 셸 활동을 모니터링하세요. 위의 Shodan/Censys dork는 노출되어 패치되지 않은 자체 인스턴스를 찾는 방어적 용도로도 사용할 수 있습니다.