2026년 1월, OpenClaw는 CVE-2026-25253을 공개했습니다. 기본 설정이 허술해 원격 코드 실행이 가능해졌고, 공개적으로 접근 가능한 135,000개 이상의 인스턴스가 위험에 노출되었습니다. 사용 중인 OpenClaw(npm/Docker/VPS 모두)가 보안 베이스라인 감사를 아직 통과하지 못했다면, 지금이 마지막 강화 기회입니다. 본 글에서는 취약점 사례를 되짚고, Docker/systemd/VPS/npm 전역 설치 3가지 배포 형태별 최소 권한 배포 체크리스트, 그리고 5단계 대응 플레이북(탐지 → 백업 → 업그레이드 → 검증 → 72시간 모니터링)을 제공하여 "동작함"에서 "전장에서 검증됨"으로 끌어올리는 방법을 안내합니다.
2026년 1월 중순, OpenClaw 보안팀은 CVE-2026-25253을 공개했습니다. Gateway가 기본 설정(0.0.0.0 리슨, 인증 없음)으로 실행될 때 조작된 WebSocket 핸드셰이크로 원격 코드 실행이 가능하다는 내용입니다. Shodan 스캔 결과, 당시135,000개 이상의 인스턴스가 인증 없이 접근 가능했으며, 개인 개발자부터 소규모 팀, 터널링 설정이 잘못된 기업 환경까지 포함되었습니다.
근본 원인은 코드 결함이 아닌 기본 설정이 지나치게 관대함에 있습니다:
0.0.0.0. 방화벽이나 리버스 프록시 인증이 없으면 관리 포트가 전체 인터넷에 노출됩니다.OPENCLAW_GATEWAY_TOKEN이나 TLS 설정을 강제하지 않아 평문 채널이 MITM 공격에 노출됩니다.openclaw onboard만 실행하고 "배포 완료"로 판단, 이후 gateway.bind 조정이나 ufw 설정을 생략했습니다.이 사건으로 v2026.2.0부터 기본 bind 주소가 127.0.0.1로 변경되었고 인스톨러에 보안 검사가 포함되었습니다. 그러나 기존 인스턴스는 수동 조치가 필요——本文章がその実行可能チェックリストです。
배포 형태와 관계없이 다음 3가지를 동시에 만족해야 합니다:
OPENCLAW_GATEWAY_TOKEN을 포함해야 합니다(≥32 문자, 90일마다 로테이션).Docker / Docker Compose로 OpenClaw를 운영한다면 다음 항목을 감사하세요:
| 체크 항목 | 안전한 설정 | 위험한 설정 예 | 수정 명령어 / 단계 |
|---|---|---|---|
| network_mode | 커스텀 브릿지 또는 host + 포트 매핑 제한 | ports: "0.0.0.0:18789:18789" | 127.0.0.1:18789:18789로 변경하거나 리버스 프록시만 경유 |
| --read-only | 컨테이너 루트 파일시스템 읽기전용; 볼륨 명시적 목록 | read_only: true 미설정 | Compose에 read_only: true 추가; ./openclaw-data:/home/node/.openclaw 볼륨 마운트 확보 |
| user와 볼륨 권한 | non-root(node:1000)로 실행; 호스트 볼륨 UID/GID 일치 | 컨테이너 root, 호스트 dir 755 宽松 | user: "1000:1000"; 볼륨 디렉토리를 사전에 chown 1000:1000 |
| restart policy | unless-stopped 또는 on-failure:3 | 재시작 없음(크래시 시 Exit) | self-healing 보장; healthcheck와 결합 |
| OPENCLAW_GATEWAY_TOKEN | 환경변수 주입; 길이 ≥32; CLI 설정과 일치 | 빈 토큰 또는 이미지 내 하드코드 | environment: OPENCLAW_GATEWAY_TOKEN=${TOKEN}; 호스트에서도 openclaw config set gateway.token $TOKEN |
변경 후 docker exec <container> netstat -tlnp로 Gateway가 127.0.0.1:18789(또는 리버스 프록시 포트)만 리슨하는 것을 확인하세요.
VPS에서 systemd 서비스로 OpenClaw를 상주시키려면 다음 방화벽 및 OS 수준 제어를 적용해야 합니다:
sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow 22/tcp # SSH sudo ufw allow 443/tcp # HTTPS (리버스 프록시 사용 시) sudo ufw allow 80/tcp # HTTP (선택, HTTPS로 리다이렉트) sudo ufw enable
sudo ufw status numbered # 18789/tcp 허용 규칙이 표시되지 않아야 함
PasswordAuthentication noOpenClaw 로그는 기본 /tmp/openclaw/openclaw-YYYY-MM-DD.log에 기록됩니다. logrotate를 설정해 디스크 고갈 방지:
# /etc/logrotate.d/openclaw
/tmp/openclaw/*.log {
daily
rotate 7
compress
missingok
notifempty
copytruncate
}
[Unit]
Description=OpenClaw Gateway
After=network.target
[Service]
Type=simple
User=node
Group=node
ExecStart=/usr/bin/openclaw gateway start
ExecStop=/usr/bin/openclaw gateway stop
Restart=on-failure
RestartSec=5
# 보안 강화
PrivateTmp=yes
NoNewPrivileges=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/home/node/.openclaw /var/log/openclaw
Environment="OPENCLAW_GATEWAY_TOKEN=${OPENCLAW_GATEWAY_TOKEN}"
# 자원 제한(선택)
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
로컬 npm 설치(개발機 또는 수동 운영 일반)는 반드시 Gateway bind 주소를 tightened해야 합니다:
# Gateway를 127.0.0.1만 리슨하도록 강제 openclaw config set gateway.bind 127.0.0.1 # 확인 openclaw config get gateway.bind # 127.0.0.1 출력되어야 함
외부 접근이 필요한 경우, 리버스 프록시(Nginx/Caddy)와 HTTP basic auth 또는 OAuth를 함께 사용:
location /openclaw/ {
proxy_pass http://127.0.0.1:18789/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# Basic auth (예시)
auth_basic "OpenClaw Admin";
auth_basic_user_file /etc/nginx/.htpasswd;
# 또는 OAuth2 프록시 통합
openclaw --version. < 2026.2.0이고 Gateway가 인터넷 노출 시 즉시 고위험으로 판별.nmap -p 18789 <your-public-ip>로 포트 접근성 확인.~/.openclaw/ 전체 아카이브: tar -czf openclaw-backup-$(date +%F).tar.gz ~/.openclawopenclaw gateway export > gateway-state.jsonnpm update -g openclaw 또는 docker pull openclaw/openclaw:latestgateway.bind를 127.0.0.1으로 재설정; 리버스 프록시 사용 시 TLS+인증 활성화 확인.openclaw gateway token rotate; 모든 CLI 인스턴스와 CI 환경변수 업데이트.openclaw gateway restartopenclaw gateway status가 "healthy" 표시해야 함.openclaw logs --follow | grep -i error다음 5항목을 월 1회 이상 실행해 OpenClaw가 설정 drifted나 버전落后로 다시 노출되지 않도록 유지:
| 카테고리 | 체크 명령어 / 동작 | 합격 기준 | 불합시 조치 |
|---|---|---|---|
| 포트 | ss -tlnp | grep 18789 | 리스닝 주소 = 127.0.0.1 | openclaw config set gateway.bind 127.0.0.1 + 재시작 |
| 인증 | openclaw config get gateway.token (길이 및 갱신일) | 토큰 ≥32 문자, 90일 이내 로테이션 | openclaw gateway token rotate; 모든 의존성 업데이트 |
| 로그 | du -sh /tmp/openclaw/ 및 logrotate 상태 | 로그dir <500MB, logrotate 활성 | logrotate 설정 조정, 오래된 로그 삭제 |
| 업데이트 | openclaw --version 최신 릴리스와 비교 | 버전 ≥ 2026.2.0(최신 stable) | npm update -g openclaw 또는 docker pull |
| 백업 | ~/.openclaw/backup/에 7일 이내 아카이브 존재 확인 | 최근 7일 이내 전체 백업 존재 | openclaw backup 즉시 실행 |
openclaw/openclaw:latest, :2026.3.13, :stable.많은 팀이 PoC나 임시 배포 시 "그냥 돌아가게" 사고로, 방화벽 설정, 토큰 로테이션, 로그 로테이션을 생략합니다. 개발機에서는 15분 절약할 수 있지만,本番환경에서는 3가지 치명적 위험이 발생합니다:
따라서 보안 강화는 사후补丁이 아니라 첫 단계입니다. 안정적 장기 운영을 요구하는 본 production OpenClaw의 경우, MACCOME의 managed offering은 모든 베이스라인을 out-of-the-box로 제공(자동 토큰 로테이션, 방화벽 화이트리스트, 24/7 침입 감시)——자체 호스팅의 번거로움 없이 사용 가능합니다. 자체 호스팅을 선택한다면 본 체크리스트 전 항목을 audit하고 결과를 팀运维 매뉴얼에 기록하세요.
자주 묻는 질문
OpenClaw v2026.1.0을 사용 중입니다. CVE-2026-25253 영향받나요?
영향 버전은 <2026.2.0이며, Gateway가 직접 공개될 때만 악용 가능합니다. 버전이 해당하더라도 127.0.0.1에 bind하거나 제어된 터널 사용 시 위험 크게 감소.无论如何 업그레이드 및 bind 강화 권장.
Docker Compose에 read_only: true 설정済——방화벽 불필요?
필요합니다. read_only는 컨테이너 내부 파일 변경을 방지하지만, Gateway 포트가 외부에서 직접 접근 가능할 수 있습니다. 완전한 강화에는 read-only + 127.0.0.1 bind + 리버스 프록시 인증 3가지 모두 필요.
토큰 로테이션 시 기존 채널(Telegram/Slack) 연결 끊어지나요?
네. Gateway 토큰은 CLI ↔ Gateway 인증 정보; 로테后 모든 CLI/Agent가 재페어링 필요. 채널층 토큰(Telegram bot token)은 영향 없음.
本番에서 외부 서비스 제공이必须时, 최소 권한은 어떻게 설정?
최소 권한 = (Gateway localhost 전용 리슨) + (리버스 프록시 계층에서 TLS+인증 강제) + (가능 시 소스 IP 화이트리스트). 프록시 계층(Nginx/Caddy/Traefik)은 독립 컨테이너 또는 엣지 노드에 두고, 인증된 요청만 127.0.0.1:18789로 전달.
인스턴스가 이미 침해당했는지 확인 방법?
흔적 확인:1) openclaw config list에 알 수 없는 CLI 토큰存在;2) ~/.openclaw/logs/에 수상 IP 연결 기록;3) 시스템 프로세스에 curl/wget 외부 통신 등 수상 자식 프로세스. 발견 시 즉시 격리, 백업 후 재구성.