2026년 1월의 어느 화요일 아침, 한 보안 연구자가 GitHub에 개념 증명 익스플로잇을 공개했다. 제목은 절제되어 있었다: "OpenClaw WebSocket Origin Bypass." 하지만 그 영향은 전혀 절제되지 않았다.
익스플로잇은 단순함이 돋보였다. 공격자는 몇 줄의 JavaScript가 담긴 악성 웹페이지를 만들기만 하면 됐다. OpenClaw 사용자가 그 페이지를 방문하면——이메일이나 Slack 메시지의 링크를 클릭하는 것만으로——JavaScript가 로컬 머신에서 실행 중인 OpenClaw 인스턴스에 조용히 연결해 임의의 명령을 실행했다. 인증 불필요. 링크 클릭 외의 사용자 조작 불필요. 머신에 대한 완전한 접근 권한 획득.
CVE-2026-25253의 CVSS 점수는 8.8. 보안 커뮤니티는 이를 치명적이라고 불렀다. OpenClaw 팀은 처음에 "WebSocket 아키텍처의 알려진 한계"라고 불렀다. 이 두 표현 사이의 간극이 위기가 어떻게 전개됐는지를 모두 말해준다.
타임라인
첫 번째 CVE가 1월 14일에 공개됐다. 48시간 이내에 Shodan 스캔으로 인터넷에 공개된 OpenClaw 인스턴스가 42,000개 이상 발견됐다——URL만 알면 누구든 악용할 수 있는 인스턴스들이었다. 많은 것들이 기업 배포였으며, 내부 파일 시스템, 데이터베이스, 환경 변수에 저장된 자격 증명에 대한 접근 권한을 가지고 실행 중이었다.
첫 번째 패치가 출시되기도 전에 CVE-2026-26327이 공개됐다: 노출된 인스턴스에서 로그인을 완전히 건너뛸 수 있는 인증 우회였다. 같은 주에 두 개의 치명적인 취약점, 둘 다 원격으로 악용 가능, 둘 다 동일한 42,000개 이상의 노출된 인스턴스에 영향을 미쳤다.
그리고 ClawHub 상황이 드러났다. 보안 연구자들이 공식 OpenClaw 스킬 마켓플레이스를 감사하기 시작했고, 공개된 스킬의 41.7%에 취약점이 포함되어 있음을 발견했다——일부는 우발적이고, 일부는 의도적으로 심어진 것이었다. 수백 개의 악성 스킬이 사용자가 설치하기를 기다리며 지난 몇 달 동안 조용히 업로드되어 있었다. XDA Developers가 "OpenClaw 사용을 중단하세요"라는 기사를 게재했고, 바이럴이 됐다.
이건 단순한 불운이 아니었다
OpenClaw 위기를 일련의 불운한 버그로 치부하고 싶은 마음이 들 수 있다——어떤 프로젝트에도 일어날 수 있는 종류의 것으로, 패치로 수정하고 넘어가면 된다고. 하지만 그런 프레이밍은 더 깊은 문제를 놓친다. 이 취약점들은 무작위가 아니었다. OpenClaw가 주말 프로젝트였고 보안이 주요 관심사가 아니었던 시절에 내려진 특정 아키텍처 결정들의 예측 가능한 결과였다.
WebSocket 신뢰 모델이 첫 번째 문제였다. OpenClaw의 웹 인터페이스는 Origin 헤더를 검증하지 않고 WebSocket 연결을 수락한다. 이는 2012년부터 알려진 잘 문서화된 취약점 클래스——크로스 사이트 WebSocket 하이재킹——다. 수정은 간단하다: Origin 헤더를 확인하면 된다. 하지만 OpenClaw에서 수정하면 허용적인 모델을 기반으로 성장한 플러그인 생태계가 깨지기 때문에 계속 미뤄지다가 CVE-2026-25253이 됐다.
두 번째 문제는 OS 수준의 권한이었다. OpenClaw 스킬을 설치하면 OpenClaw 프로세스 자체와 동일한 권한으로 실행된다. 대부분의 시스템에서 이는 파일 읽기, 네트워크 접근, 명령 실행, API 키와 비밀번호가 담긴 환경 변수 읽기가 가능함을 의미한다. 샌드박싱 없음, 기능 모델 없음, 스킬에 필요한 것만 접근을 허용하는 방법 없음. 설치하는 모든 스킬은 암묵적으로 모든 것을 신뢰받는다.
세 번째 문제는 JavaScript 공급망이었다. OpenClaw의 node_modules에는 1,200개 이상의 패키지가 포함되어 있다. ClawHub의 악성 스킬은 이를 악용해 인기 있는 패키지와 비슷한 이름의 패키지를 게시——타이포스쿼팅——하고 의존성으로 가져와지기를 기다렸다. 큰 의존성 트리를 가진 동적 언어에서 이 공격은 플랫폼 수준에서 방지하기가 거의 불가능하다.
보안 설계란 실제로 어떤 모습인가
ZeroClaw는 다른 가정 하에 구축됐다. "나중에 보안을 추가하겠다"가 아니라 "보안 제약이 처음부터 아키텍처를 형성한다"는 것이다.
Rust의 소유권 시스템은 컴파일 타임에 전체 취약점 클래스를 제거한다. 버퍼 오버플로우, use-after-free, 데이터 경쟁——이것들은 Rust 코드에서 패치가 필요한 버그가 아니라 컴파일 오류다. CVE-2026-25253이 OpenClaw에서 가능했던 것은 부분적으로 JavaScript의 동적 특성이 언어 수준에서 보안 경계를 강제하기 어렵게 만들기 때문이다. Rust에서는 코드가 실행되기 전에 컴파일러가 그 경계를 강제한다.
게이트웨이 페어링은 원격 접근을 위한 비밀번호 인증을 대체한다. 포트를 노출하고 사용자가 강력한 비밀번호를 설정하기를 바라는 대신, ZeroClaw는 클라이언트와 게이트웨이 간의 암호화 페어링을 요구한다——Bluetooth 페어링이 작동하는 방식과 유사하다. 인터넷에서 ZeroClaw 인스턴스를 찾은 공격자는 페어링 키 없이는 아무것도 할 수 없다.
기본 거부 허용 목록 모델은 에이전트가 접근하기 전에 모든 도구, 파일 경로, 네트워크 엔드포인트를 명시적으로 허용해야 함을 의미한다. 지정된 작업 공간 외부의 파일을 읽으려는 스킬은 접근이 아닌 권한 오류를 받는다. 목록에 없는 엔드포인트로의 네트워크 요청은 차단된다. 기본값은 접근 없음; 필요한 것만 정확히 허용한다.
심볼릭 링크 탈출 감지를 갖춘 작업 공간 범위 지정은 경로 순회 공격을 방지한다. 악성 스킬이 심볼릭 링크를 따라 샌드박스를 탈출하려 해도, ZeroClaw는 데이터에 접근되기 전에 시도를 감지하고 차단한다.
그리고 단일 바이너리 아키텍처는 공급망 공격 표면을 완전히 제거한다. node_modules 없음, 패키지 레지스트리 없음, 감사할 전이적 의존성 없음. 수백 개의 악성 ClawHub 스킬을 가능하게 한 공격 벡터가 단순히 존재하지 않는다.
전환하기
현재 OpenClaw를 실행 중이라면 마이그레이션 경로는 간단하다. 먼저 OpenClaw 데이터를 백업한다——대화 기록과 설정은 `~/.openclaw/`에 있으며, 무언가를 건드리기 전에 복사본이 필요하다.
단일 명령으로 ZeroClaw 설치:
```bash curl -fsSL https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/main/scripts/bootstrap.sh | bash ```
먼저 드라이런 모드로 마이그레이션 도구를 실행해 무엇이 변경될지 미리 보기:
```bash zeroclaw migrate openclaw --dry-run ```
무엇이 가져와지고, 무엇이 건너뛰어지고, 무엇에 수동 처리가 필요한지 정확히 보여준다. 미리 보기에 만족하면 실제 마이그레이션 실행:
```bash zeroclaw migrate openclaw ```
메모리, 설정, 채널 설정이 이전된다. 채널이 재연결되는지 확인하고 간단한 쿼리로 테스트한다. 전체 프로세스는 보통 10분 이내에 완료된다.
업계가 배워야 할 것
OpenClaw 위기는 한 프로젝트의 보안 실패에 관한 이야기가 아니다. 스크립팅 도구의 가정으로 인프라 소프트웨어를 구축하면 어떻게 되는지에 관한 이야기다.
AI 에이전트는 자격 증명을 처리하고, 파일 시스템에 접근하고, 코드를 실행하고, 24/7 실행된다. 이것은 인프라이지 스크립트가 아니다. 웹 서버와 동일한 보안 엄격함, 데이터베이스와 동일한 아키텍처 규율, 머신에서 상승된 권한으로 실행되는 다른 모든 것과 동일한 위협 모델링이 필요하다.
보안은 허용적인 아키텍처에 나중에 추가할 수 없다. 처음부터 설계에 내장되어야 한다——언어 선택, 권한 모델, 배포 아키텍처, 플러그인 시스템에. 그렇지 않으면 42,000개의 노출된 인스턴스와 8.8점의 CVE가 생긴다.
문제는 AI 에이전트가 표적이 될지 여부가 아니다. 그 일이 일어났을 때 아키텍처가 그것을 견딜 수 있도록 구축되어 있는지 여부다.