웹페이지 한 번에 로컬 모델 오염, NemoClaw가 WSL에서 못 고친 이유
Oasis Security가 NVIDIA NemoClaw의 CVE-2026-65105를 공개했습니다. 악성 페이지를 한 번 열면 로컬 Ollama 모델의 채팅 템플릿이 공격자 지시문으로 바뀝니다. macOS·Linux는 v0.0.106에서 막았고 WSL은 아직입니다.
- 악성 웹페이지 한 번이면 로컬
Ollama모델의 채팅 템플릿이 바뀝니다. - 심어진 지시문은 페이지를 닫아도 이후 모든 대화에 다시 붙습니다.
- macOS·Linux는 v0.0.106에서 막았고 WSL 경로는 아직입니다.
보안 업체 Oasis Security가 2026년 8월 25일 NVIDIA NemoClaw의 취약점 CVE-2026-65105를 공개했습니다. 공격자가 만든 웹페이지를 한 번 열면, 그 페이지가 노트북에서 도는 모델 서버에 인증 없이 접근해 모델이 대화를 조립하는 방식 자체를 다시 씁니다. 페이지를 닫아도 바뀐 설정은 남습니다.
NemoClaw는 NVIDIA가 만든 오픈소스 도구입니다. OpenClaw 같은 에이전트를 격리된 상자 안에서 돌려 개인 파일이나 클라우드 계정에 함부로 닿지 못하게 막아 줍니다. 저장소 설명문도 "지원 에이전트를 NVIDIA OpenShell 안에서 더 안전하게 실행"이라고 적었고 GitHub stars는 2만 2000개를 넘겼습니다. 이번에도 그 상자는 뚫리지 않았습니다. 대신 상자 바깥에 세워 둔 모델 서버가 열렸습니다.
웹페이지가 모델 설정을 다시 쓰는 순서
NemoClaw는 로컬 추론 서버 Ollama를 OLLAMA_HOST=0.0.0.0:11434로 띄웁니다. 내 컴퓨터 안에서만 닿는 주소가 아니라 모든 네트워크 인터페이스에 문을 여는 설정입니다. 그리고 Ollama API에는 자체 로그인 절차가 없습니다.
공격 순서는 이렇습니다.
사용자가 공격자 페이지를 한 번 연다
도메인이 127.0.0.1로 다시 해석된다 (DNS 리바인딩)
브라우저는 같은 출처로 판단해 11434 포트에 요청을 보낸다
/api/create로 모델의 채팅 템플릿을 다시 쓴다
DNS 리바인딩은 공격자 도메인이 처음에는 자기 서버 주소로, 잠시 뒤에는 127.0.0.1로 해석되게 만드는 오래된 수법입니다. 브라우저는 IP가 아니라 도메인 이름을 기준으로 같은 출처인지 판단하므로, 요청이 내 컴퓨터로 향해도 계속 허용합니다. Ollama가 2024년 3월 CVE-2024-28224 대응으로 넣어둔 Host 헤더 검사가 있지만 비루프백 주소에 묶여 있으면 그 검사를 건너뜁니다.
여기까지는 흔한 로컬 서비스 노출 사고입니다. 다른 점은 공격자가 무엇을 바꾸느냐입니다. 시스템 프롬프트에 문장을 밀어 넣는 방식은 에이전트가 자기 지시문으로 덮어써 버립니다. 그래서 공격자는 한 겹 아래인 채팅 템플릿을 건드립니다. 템플릿은 사용자 메시지와 시스템 메시지를 실제 모델 입력 문자열로 조립하는 틀이고 에이전트가 지시문을 제출한 뒤에 적용됩니다. 오염된 템플릿은 추론할 때마다 모든 시스템 메시지 끝에 공격자 문장을 덧붙입니다.
Oasis Security 연구 책임자 Elad Luz는 SiliconANGLE에 "오염은 가드레일이나 운영자가 볼 수 있는 것보다 한 겹 아래에서 일어난다"고 말했습니다. 템플릿은 API를 호출하는 쪽에 노출되지 않습니다. 에이전트도, 감사 로그도 자기가 받은 프롬프트가 바뀐 줄 모릅니다.
이 수법은 이메일 한 통으로 에이전트 기억에 가짜 사실을 심는 공격과 목적이 같습니다. 다만 심는 자리가 기억이 아니라 모델 파일 쪽이어서 대화를 지워도 사라지지 않습니다.
NVIDIA가 고친 것과 못 고친 것
NemoClaw의 방어는 다섯 겹입니다. 네트워크, 파일시스템, 프로세스, 게이트웨이 인증, 그리고 추론입니다. 공식 문서의 도식에서 추론 계층은 "에이전트가 어떤 AI 모델을 쓸 수 있는지 통제한다"고 정의됩니다. 어떤 모델을 쓰느냐만 보고, 그 모델이 내부에서 어떤 템플릿을 쓰는지는 보지 않습니다.
수리 이력은 저장소에 그대로 남아 있습니다.
관리 대상 Ollama를 루프백으로만 묶는 systemd 설정 추가 (PR #3039)
이슈 #6014 등록. systemd 방식이 root 권한을 요구해 깨진다는 구조 문제 제기
인증 프록시가 기동 전에 백엔드 포트를 훑어 비루프백 리스너가 있으면 거부
Oasis Security 공개. 이슈 #6014는 여전히 열려 있음
이 방어가 닿지 않는 곳이 있습니다. NVIDIA는 이슈 #6014 본문에 세 가지 실행 형태 중 어디에 인증 프록시가 서는지를 직접 표로 적어 뒀습니다.

표 아래 문장이 남은 구멍을 지목합니다. Windows 호스트 런처가 Docker Desktop의 WSL 가상 머신에서 닿도록 Ollama를 0.0.0.0:11434에 직접 묶고 이 경로의 유일한 완화 수단은 Windows Defender 방화벽과 표준 오류 출력 경고뿐이라고 적혀 있습니다. 이슈 본문은 Docker Desktop 형태가 "명시적으로 범위 밖"이라고 못박습니다.
WSL은 곁가지 환경이 아닙니다. NemoClaw 공식 사전 요건 문서가 지원 플랫폼으로 밝힌 네 가지 중 하나이고 README는 DGX 또는 WSL 호스트에서 기본 설정으로 설치하라고 안내합니다. 저장소의 src/lib/inference/ollama/windows.ts를 열어 보면 OLLAMA_HOST=0.0.0.0:11434를 사용자 계정 환경 변수로 영구 저장합니다. 주석에도 다음 로그인 때 트레이에서 실행돼도 이 설정이 유지되도록 그렇게 한다고 적혀 있습니다. NemoClaw를 꺼도 그 계정의 Ollama는 계속 열려 있습니다.
v0.0.106에 들어간 방어에도 구멍이 남습니다. 저장소 SECURITY.md가 스스로 적어 둔 한계입니다.
| 한계 | 내용 |
|---|---|
| Docker Desktop 경로 | WSL 계열 두 형태는 프록시를 통째로 건너뜀 |
| 운영자 우회 | NEMOCLAW_OLLAMA_PROXY_SKIP_BIND_PROBE=1이면 검사가 꺼짐 |
| 경고 전달 | 관리 실행 경로는 프록시 출력을 버려 경고가 운영자에게 안 감 |
| 검사 시점 | 기동 시 1회만 검사. 이후 다시 열리는 것은 범위 밖 |
같은 날 NVIDIA는 보안 문서도 고쳤습니다. 커밋 #10035가 "Locked-Down (기본값)"이라는 표기에서 "(기본값)"을 지웠습니다. 온보딩 기본값은 Balanced 티어이고, 이 티어는 npm·pypi·huggingface·brew 프리셋을 자동으로 켭니다. 가장 잠긴 상태를 원하면 온보딩에서 Restricted 티어를 직접 고르고 웹 검색도 꺼야 합니다.
지금 쓸 수 있는 조건
| 항목 | 내용 |
|---|---|
| 대상 | NemoClaw로 OpenClaw·Hermes·LangChain Deep Agents Code를 돌리면서 추론 공급자로 Ollama를 고른 경우 |
| 가격 | 무료. NemoClaw는 Apache-2.0 오픈소스이고 Ollama도 무료 |
| 한국 사용 | 가능. 지역 제한이 없어 취약점도 똑같이 해당 |
| 필요 조건 | 최소 4 vCPU·8GB 메모리·20GB 디스크. 지원 플랫폼은 Linux(Ubuntu 24.04 검증), DGX OS, macOS(Apple Silicon), Windows WSL2 + Docker Desktop. 네이티브 Windows는 지원 실행 경로가 아님 |
NIM, NemoClaw가 관리하는 vLLM·llama.cpp, 원격 공급자를 쓴다면 이 프록시를 지나지 않으므로 이번 취약점의 대상이 아닙니다. 2026년 8월 25일 기준 실제 악용 사례는 보고되지 않았습니다. CVE-2026-65105는 아직 미국 국가취약점데이터베이스(NVD)에 예약 상태로만 올라 있어 CVSS 점수도 없습니다. CISA가 사흘 시한을 걸었던 Ray 취약점과 달리, 이번 건은 강제 조치 시한이 붙는 종류가 아닙니다.
버전만 올린다고 끝나지 않습니다. 지금 쓰는 모델이 이미 오염됐는지부터 봐야 합니다. Ollama를 쓴다면 아래 명령으로 템플릿을 눈으로 확인하고, 모델 카드에 없던 문장이 뒤에 붙어 있으면 그 모델을 지우고 다시 내려받으면 됩니다.
ollama show --template nemotron-3-nano:30b
WSL이나 Windows에서 돌리고 있다면 PowerShell에서 [Environment]::GetEnvironmentVariable('OLLAMA_HOST','User')도 함께 확인합니다. 0.0.0.0:11434가 나온다면 NemoClaw를 껐는지와 무관하게 그 값이 계정에 남아 있는 상태이고, 이 경로에는 아직 받을 패치가 없습니다. 이슈 #6014가 닫히고 Windows 전용 완화책이 별도 릴리스로 나올 때가 이 구성을 다시 검토할 시점입니다.