marimo 반응형 Python 노트북 터미널 WebSocket 인증 누락으로 인한 사전 인증 원격 코드 실행(RCE) 취약점 (CVE-2026-39987)
실무자 핵심 요약 (Executive Summary)
SECOPS ASSESSMENT0.23.0 미만 버전의 marimo 오픈소스 Python 노트북 라이브러리
인증되지 않은 원격 공격자가 터미널 WebSocket 엔드포인트(/terminal/ws)에 직접 연결하여 완전한 PTY 셸 권한을 획득하고 임의의 시스템 명령을 실행할 수 있습니다
marimo 패키지를 최신 보안 패치가 적용된 0.23.0 이상 버전으로 즉시 업데이트하십시오
영향받는 제품 및 버전 범위
권장 패치 및 임시 완화(Workaround) 가이드
PATCH & WORKAROUND1. 공식 보안 패치 적용 (권장)
marimo 패키지를 최신 버전(0.23.0 이상)으로 업그레이드하십시오.
# pip를 사용하는 경우
pip install --upgrade marimo>=0.23.0
# poetry를 사용하는 경우
poetry add marimo@latest2. 임시 완화 조치 (패치 적용이 불가능한 경우)
- 네트워크 접근 제어: marimo 서버가 실행 중인 포트(기본적으로 외부 노출이 불필요한 포트)에 대해 신뢰할 수 있는 IP 대역만 접근할 수 있도록 방화벽 규칙(IP White-listing)을 설정하십시오.
- 리버스 프록시 인증 추가: Nginx, Apache 또는 OAuth2 Proxy와 같은 리버스 프록시를 marimo 전면에 배치하여, 애플리케이션 레이어에 도달하기 전에 기본 인증(Basic Auth) 또는 SSO 인증을 강제하도록 구성하십시오.
- WAF(웹 애플리케이션 방화벽) 규칙 설정: 외부로부터
/terminal/ws경로로 유입되는 비정상적인 WebSocket 업그레이드 요청을 탐지 및 차단하십시오.
내 GitHub/GitLab 레포지토리에 이 취약한 패키지가 숨어 있는지 30초 만에 스캔하세요
간접 의존성(Transitive Dependency)에 포함된 취약점은 수동 확인이 불가능합니다. Git 연동 한 번으로 취약 버전 탐지부터 호환성을 유지하는 최소 버전 업그레이드 PR까지 자동 생성하세요.
취약점 발생 원리 및 공격 메커니즘
marimo는 데이터 과학 및 머신러닝 분야에서 널리 사용되는 반응형 Python 노트북 도구입니다. 본 취약점(CVE-2026-39987)은 marimo의 터미널 WebSocket 엔드포인트인 /terminal/ws에서 적절한 사용자 인증 검증을 수행하지 않아 발생합니다 (CWE-306: 중요한 기능에 대한 인증 누락).
일반적인 WebSocket 엔드포인트(예: /ws)는 연결 요청 시 validate_auth() 함수를 호출하여 세션 및 권한을 엄격히 검증하는 반면, /terminal/ws 엔드포인트는 단순히 실행 모드(Running Mode)와 플랫폼 지원 여부만을 확인한 후 연결을 수락합니다. 이로 인해 공격자는 유효한 세션 토큰이나 자격 증명 없이도 해당 엔드포인트에 직접 WebSocket 핸드셰이크를 요청할 수 있으며, 연결이 성립되면 대상 서버의 운영체제 권한으로 대화형 PTY(Pseudo-Terminal) 셸을 획득하여 임의의 시스템 명령을 실행할 수 있게 됩니다.
이 취약점은 CVSS 9.8의 치명적(Critical) 등급으로 분류되었으며, CISA KEV(Known Exploited Vulnerabilities) 목록에 등재되어 실제 야생(In-the-Wild)에서 적극적으로 악용되고 있음이 확인되었습니다.
공식 보안 권고문 및 참조 링크
marimo is a reactive Python notebook. Prior to 0.23.0, Marimo has a Pre-Auth RCE vulnerability. The terminal WebSocket endpoint /terminal/ws lacks authentication validation, allowing an unauthenticated attacker to obtain a full PTY shell and execute arbitrary system commands. Unlike other WebSocket endpoints (e.g., /ws) that correctly call validate_auth() for authentication, the /terminal/ws endpoint only checks the running mode and platform support before accepting connections, completely skipping authentication verification. This vulnerability is fixed in 0.23.0.
일간 취약점 브리핑 및 긴급 Zero-Day 경보 구독
보안 실무자와 인프라·백엔드 엔지니어를 위해 매일 아침 주요 취약점과 패치 우선순위를 요약해 발송합니다.