Marimo 사전 인증 RCE가 드러낸 AI 워크스테이션 보안 위험

CVE-2026-39987의 WebSocket 인증 누락, 자격증명 탈취와 NKAbuse 배포 경로를 바탕으로 AI 노트북 환경의 격리와 패치 대응을 정리한다.

2026-08-14 · 최초 발행 2026-04-19

공개 직후 악용된 Marimo 터미널 엔드포인트

2026년 4월 8일 Marimo 팀은 CVSS 9.3 원격 코드 실행 취약점 CVE-2026-39987을 공개했다. 권고와 패치가 나온 뒤 10시간이 지나기 전 피해 시스템의 AWS 액세스 키와 OpenAI API 토큰이 탈취됐고, 공개 3일 후에는 HuggingFace Spaces를 경유하는 블록체인 기반 봇넷 캠페인이 가동됐다.

이 사건의 대상은 단순한 노트북 서버가 아니다. 데이터 과학자와 AI 연구자의 워크스테이션은 클라우드 권한, API 토큰, 데이터 접근 정보가 모이는 환경이며, 그만큼 공격자에게도 가치가 높은 침해 지점이 된다.

CVE-2026-39987은 Marimo 0.20.4 이하에서 터미널 WebSocket 엔드포인트인 /terminal/ws에 존재한 사전 인증(pre-auth) RCE다. Marimo는 셀 변경에 따라 의존 셀을 자동 재실행하는 반응형 Python 노트북 환경이다.

문제는 WebSocket 엔드포인트마다 인증 검사가 다르게 적용된 데 있었다. 일반 엔드포인트인 /ws는 연결을 받기 전에 validate_auth()를 호출한다. 반면 /terminal/ws는 실행 모드와 플랫폼 지원 여부만 확인하고 연결을 허용했다. 터미널 연결에 필요한 인증 검사가 빠져 있었다.

WebSocket 연결 시도WebSocket 연결 시도Yes 인증 실패Yes 인증 성공인증 없이 통과공격자 (비인증)/ws (일반 엔드포인트)/terminal/ws (터미널엔드포인트)validate_auth() 호출?연결 거부 (401)세션 허용실행 모드 확인만?PTY 획득임의 명령 실행환경 변수 읽기 (.env)AWS · OpenAI 토큰 탈취래터럴 무브먼트

공격자는 인증 없이 /terminal/ws에 연결해 완전한 PTY(Pseudo-Terminal) 셸을 확보할 수 있었다. 이후 시스템 명령 실행, 환경 변수 파일 열람, 자격증명 탈취와 래터럴 무브먼트의 발판 마련이 가능해진다. 이 취약점은 Marimo 0.23.0에서 수정됐다.

권고문만으로 시작된 침해

Sysdig Threat Research Team이 공개한 타임라인은 취약점 공개와 실제 침해 사이의 간격이 얼마나 짧아졌는지 보여준다.

  • 2026-04-08 — Marimo 팀이 CVE-2026-39987 권고문과 0.23.0 패치를 배포했다.
  • 2026-04-08 (권고 후 9시간 41분) — 첫 익스플로잇 시도가 탐지됐다. 공격자는 기성 익스플로잇 도구 없이 권고문 설명을 바탕으로 공격 코드를 작성했다.
  • 2026-04-08 (세 번째 세션).env 파일에서 AWS 액세스 키, 데이터베이스 커넥션 스트링, OpenAI API 토큰이 탈취됐다. 전체 작전 소요 시간은 3분 미만이었다.
  • 2026-04-11~14 — 10개국의 11개 고유 소스 IP에서 662건의 익스플로잇 이벤트가 기록됐다.
  • 2026-04-11 (공개 3일 후) — HuggingFace Spaces를 경유한 NKAbuse 변종 봇넷 캠페인이 가동됐다.

공격자는 별도 익스플로잇 프레임워크 없이 권고문만으로 공격을 완성했다. 취약점 구조가 단순하고 공격 벡터가 분명하면 무기화까지 걸리는 시간도 짧아진다. “패치 후 30일 이내 적용”이라는 대응 기준은 이 사례에서 작동하지 않는다.

로컬 개발을 전제로 한 설계가 노출될 때

인터랙티브 노트북 플랫폼은 로컬 개발의 편의성을 중심으로 만들어졌다. 그러나 팀 공유 워크스테이션, 클라우드 VM, 포트 포워딩이 결합되면 로컬이라는 전제가 쉽게 무너진다.

Jupyter Notebook과 Marimo는 별도 설정 없이 실행하면 0.0.0.0 또는 localhost에 바인딩된다. 팀이 함께 쓰는 워크스테이션이나 원격 개발 환경에서는 localhost로 시작한 서비스도 외부 노출 서비스가 될 수 있다.

기능 확장 속도와 보안 검증의 속도도 비대칭이 될 수 있다. Marimo에는 터미널 통합, 패키지 관리자 내장, WASM 지원, 앱 공유 모드가 추가됐으며, 기능마다 새 엔드포인트가 생긴다. CVE-2026-39987은 터미널 기능 추가 시 인증 검사가 누락된 채 배포된 사례다.

노트북은 임의 코드 실행을 본질로 하는 환경이다. 데이터 파이프라인 접근을 위한 데이터베이스 자격증명, 클라우드 리소스 접근을 위한 IAM 역할이나 액세스 키가 환경 변수에 주입될 수 있다. 개발자 워크스테이션이 프로덕션 인프라에 접근 가능한 높은 권한을 갖는 경우도 많다.

자격증명과 GPU가 모이는 침해 지점

AI·데이터 과학자의 워크스테이션은 공격자에게 매력적인 표적이 될 조건을 갖추고 있다.

먼저 OpenAI·Anthropic·HuggingFace API 토큰, AWS·GCP·Azure IAM 자격증명, Weights & Biases·MLflow 추적 서버 토큰, 내부 데이터 레이크 및 벡터 데이터베이스 접근 키가 한 환경에 집중될 수 있다. .env 파일 하나만 탈취해도 클라우드 컴퓨팅 자원의 무단 사용, 독점 학습 데이터 접근, 파인튜닝 모델 탈취로 이어질 수 있다.

AI 연구 환경은 고사양 GPU 클러스터와도 연결돼 있다. 탈취한 권한으로 대규모 GPU 인스턴스를 스핀업하거나, 진행 중인 학습 작업을 가로채고, 모델 추론 엔드포인트를 악용할 수 있다. 단 한 번의 침해로 수십만 달러의 클라우드 비용이 발생할 수 있다.

또한 데이터 과학자 워크스테이션에는 수백 개의 Python 패키지가 설치돼 있다. 침해 이후 pip 패키지 조작, 훈련 스크립트 백도어 삽입, 모델 가중치 파일 변조 같은 소프트웨어 공급망 공격의 진입점이 될 수 있다.

노출된 Marimo 인스턴스PTY 획득환경 변수 탈취클라우드 자격증명AWS · GCP · AzureAI API 토큰OpenAI · Anthropic · HFDB 커넥션 스트링PostgreSQL · MongoDBGPU 인스턴스 무단 사용크립토마이닝클라우드 데이터 접근학습 데이터 탈취API 크레딧 소진비용 폭탄래터럴 무브먼트내부 DB 침투NKAbuse 봇넷 배포C2: NKN 블록체인

HuggingFace Spaces를 악용한 NKAbuse 배포

이 공격의 다음 단계에서는 AI 커뮤니티의 핵심 인프라인 HuggingFace Spaces가 악성 페이로드 배포 채널로 이용됐다.

공격자는 VS Code를 타이포스쿼팅한 vsccode-modetx라는 HuggingFace Space를 만들고 셸 스크립트를 게시했다. 침해된 Marimo 인스턴스에서 curl | bash로 해당 스크립트를 실행하면 Go 기반 ELF 바이너리 kagent가 설치된다. 이 바이너리는 NKAbuse의 미공개 변종이며, NKN(New Kind of Network) 블록체인 프로토콜을 C2(Command & Control) 채널로 사용한다.

블록체인 기반 C2는 기존 IP 기반 C2 차단만으로 대응하기 어렵다. 중앙 서버 대신 탈중앙화 P2P 네트워크를 사용하므로 단일 서버 차단으로 C2 통신 전체를 끊을 수 없기 때문이다. 신뢰할 수 있는 콘텐츠 소스로 받아들여지는 AI 플랫폼을 배포 경로로 이용했다는 점도 기존 보안 솔루션 탐지 우회에 유리하게 작용한다.

패치와 격리를 함께 설계하는 대응

가장 먼저 Marimo를 0.23.0으로 올려야 한다. 즉시 업그레이드할 수 없다면 방화벽에서 /terminal/ws를 차단하고, 노출 가능성이 있는 비밀 키를 모두 로테이션해야 한다. WebSocket 연결 로그에서 /terminal/ws를 향한 비인증 접근 흔적을 확인하는 포렌식 검토도 필요하다.

노트북 서버는 인터넷에 직접 노출하지 않는 구성이 필요하다.

  • 노트북 인스턴스를 사설 서브넷(Private Subnet)에 배치하고 인터넷 게이트웨이 경로를 제거한다.
  • VPN 또는 SSH 터널을 통해서만 노트북 UI에 접근하게 제한한다.
  • 방화벽 규칙으로 노트북 포트(7860, 8888 등)의 외부 접근을 차단한다.
  • 리버스 프록시(Nginx, Traefik) 뒤에 노트북을 배치하고 인증 레이어를 추가한다.

개발 환경의 의존성은 프로덕션보다 더 빠르게 갱신해야 한다. 알려진 취약점 검토와 자동 PR 생성을 패치 관리 흐름에 넣을 수 있다.

# pip-audit로 알려진 취약점 스캔
pip install pip-audit
pip-audit -r requirements.txt

# safety로 의존성 보안 검사
pip install safety
safety check

# Dependabot 또는 Renovate Bot으로 자동 PR 생성
# .github/dependabot.yml에 Python 생태계 설정 추가

장기적으로는 노트북 실행 환경을 컨테이너나 마이크로VM으로 격리하는 방법이 강력한 방어 수단이 된다. 2026년 현재 Firecracker, Kata Containers, gVisor 같은 마이크로VM 솔루션은 컨테이너 탈출 취약점에 대한 강력한 방어를 제공한다.

HTTPS + VPNTTL 기반 단기 자격증명허용된 도메인만개발자 브라우저리버스 프록시Nginx + 인증컨테이너 오케스트레이터Kubernetes / Docker마이크로VM (Firecracker)노트북 격리 환경Read-only파일시스템시크릿 마운트Vault / KMSegress 필터링화이트리스트 차단클라우드 리소스PyPI · HuggingFace

격리 환경에는 최소 권한 원칙도 적용해야 한다. 컨테이너는 root 없이 실행하고 --no-new-privileges 플래그를 적용한다. 노트북 작업 디렉토리를 제외한 파일시스템은 읽기 전용으로 마운트하며, 장기 API 키 대신 TTL이 짧은 임시 자격증명(AWS STS, Vault 동적 시크릿)을 사용한다. 외부로 향하는 트래픽은 화이트리스트 기반으로 제한하고, 세션마다 새 컨테이너를 스핀업한 뒤 종료 시 완전히 삭제하는 ephemeral notebook 구성을 고려할 수 있다.

.env 파일에 장기 자격증명을 저장하는 관행도 줄여야 한다. HashiCorp Vault, AWS Secrets Manager, 환경별 IAM 역할을 이용해 노트북에 장기 자격증명이 남지 않도록 하고, truffleHog·gitleaks 같은 자격증명 스캔 도구를 CI/CD 파이프라인에 통합해 실수로 커밋된 시크릿을 탐지한다.

CVE-2026-39987은 인증 누락 하나가 빠르게 확장되는 개발 도구 생태계에서 어떤 결과로 이어질 수 있는지 보여준다. 공개 10시간 만의 자격증명 탈취와 3일 만의 봇넷 캠페인은 AI 워크스테이션을 보안 팀이 관리해야 할 공격 표면으로 만든다. 내부망 제한, 컨테이너·마이크로VM 격리, 단기 자격증명 체계를 함께 적용해야 한다.

Sources

Marimo사전 인증 RCEAI 워크스테이션노트북 보안컨테이너 격리자격증명 관리