Devlery
Blog/AI

AutoJack 공개, localhost가 에이전트 공격면이 된 이유

Microsoft가 AutoGen Studio 개발 빌드에서 브라우징 에이전트가 localhost MCP WebSocket을 거쳐 명령을 실행하는 AutoJack 체인을 공개했습니다.

AutoJack 공개, localhost가 에이전트 공격면이 된 이유
AI 요약
  • 무슨 일: Microsoft가 AutoJack이라는 AutoGen Studio 개발 빌드의 원격 코드 실행 체인을 공개했습니다.
    • 공격자 페이지를 브라우징 에이전트가 열면, 같은 머신의 localhost:8081 MCP WebSocket으로 접근해 프로세스를 실행할 수 있는 구조입니다.
  • 범위: Microsoft는 안정 PyPI 릴리스 autogenstudio 0.4.2.2에는 해당 MCP 라우트가 없다고 설명했습니다.
    • The Hacker News는 0.4.3.dev1, 0.4.3.dev2 pre-release에 취약 핸들러가 있었다고 보도했습니다.
  • 개발자 영향: 에이전트가 웹을 보고 로컬 도구를 호출한다면, localhost는 신뢰 경계가 아니라 공격면입니다.
  • 대응: 제어면 인증, 실행 파일 allowlist, 브라우저 격리, 에이전트 신원 분리가 기본 점검 항목이 됩니다.

Microsoft Defender Security Research Team이 2026년 6월 18일 AutoJack 연구를 공개했습니다. 대상은 AutoGen Studio 개발 빌드입니다. 공격자 웹페이지를 브라우징 에이전트가 렌더링하면, 그 페이지의 JavaScript가 같은 머신의 localhost MCP WebSocket으로 접근하고 AutoGen Studio가 공격자 지정 명령을 실행하는 체인입니다.

이 사건에서 먼저 정리할 점은 영향 범위입니다. Microsoft는 해당 MCP WebSocket 표면이 PyPI 릴리스에는 포함되지 않았고, 일반 pip install autogenstudio로 설치되는 0.4.2.2에는 /api/mcp 라우트가 없다고 밝혔습니다. 반면 The Hacker News는 6월 19일 보도에서 0.4.3.dev10.4.3.dev2 pre-release에는 취약 핸들러가 있었고, 일반 pip 설치가 아니라 --pre나 버전 고정을 쓴 개발자가 영향을 받을 수 있다고 분석했습니다.

그래도 AutoJack은 "패치된 개발 빌드 버그"로 끝나지 않습니다. Microsoft가 글 마지막에서 강조한 쟁점은 더 넓습니다. 개발 도구가 강력한 로컬 제어면을 열고, 그 제어면이 localhost나 origin allowlist를 신뢰하며, 사용자가 같은 머신에서 외부 웹을 여는 에이전트를 돌리는 순간 기존 loopback 가정이 무너집니다. 에이전트가 브라우저, 파일, 셸, MCP 서버를 한 작업 안에서 연결하기 때문에 생긴 새 실행 경계입니다.

Microsoft가 공개한 AutoJack origin bypass 도표

AutoGen Studio는 Microsoft Research의 AutoGen 위에 올라간 프로토타이핑 UI입니다. 문서는 이 도구를 다중 에이전트 workflow를 빠르게 실험하고 시연하는 인터페이스로 설명하며, 배포용 앱이 아니라고 못박습니다. 개발자는 UI에서 에이전트를 구성하고 도구를 붙이며, MCP 서버까지 연결할 수 있습니다.

Microsoft의 AutoGen 저장소도 같은 방향을 보여줍니다. GitHub README는 현재 AutoGen이 maintenance mode에 들어갔고 신규 사용자는 Microsoft Agent Framework를 시작점으로 삼으라고 안내합니다. 같은 README의 MCP 예시는 Playwright MCP 서버를 붙인 웹 브라우징 assistant agent를 보여주며, 신뢰할 수 있는 MCP 서버에만 연결하라는 경고도 담고 있습니다. MCP 서버가 로컬 환경에서 명령을 실행하거나 민감 정보를 노출할 수 있기 때문입니다.

AutoJack 체인은 세 약점을 순서대로 묶습니다. 첫 번째는 origin allowlist입니다. AutoGen Studio의 MCP WebSocket은 http://127.0.0.1http://localhost에서 온 요청을 허용했습니다. 일반 사용자가 브라우저에서 공격자 사이트를 열면 origin이 공격자 도메인으로 찍히기 때문에 차단됩니다. 하지만 브라우징 에이전트가 같은 워크스테이션에서 headless browser나 Playwright 계층을 실행하면, 그 프로세스는 로컬 머신 안에서 움직입니다.

이 차이가 공격면을 바꿉니다. 공격자 페이지의 스크립트가 사용자 브라우저 탭에서 직접 localhost:8081을 두드리는 상황과, AutoGen agent가 렌더링한 페이지가 같은 머신의 MCP WebSocket으로 접근하는 상황은 보안 모델이 다릅니다. Microsoft는 MultimodalWebSurfer, fetch_webpage_tool, Playwright 기반 surfer, requests나 websockets를 실행하는 코드 도구까지 예로 들었습니다. 에이전트가 외부 콘텐츠를 대신 열어주는 순간, 외부 콘텐츠가 로컬 제어면에 닿는 통로가 생깁니다.

두 번째 약점은 인증 경로입니다. AutoGen Studio는 none, github, msal, firebase 같은 인증 모드를 지원했습니다. 그러나 Microsoft 설명에 따르면 인증 미들웨어는 WebSocket 스타일 경로인 /api/ws/api/mcp를 건너뛰었습니다. 설계 의도는 WebSocket 핸들러가 handshake 시점에 별도 인증을 수행하는 것이었지만, MCP 핸들러가 그 후속 검사를 구현하지 않았습니다.

그 결과 config에 인증을 켜도 /api/mcp/ws/*는 보호되지 않았습니다. Microsoft 글의 표는 REST API가 보호되는 인증 모드에서도 MCP WebSocket은 보호되지 않는다고 정리합니다. 이 부분은 에이전트 도구 설계에서 자주 생기는 실수와 닮았습니다. "내부 경로", "개발용 포트", "loopback 전용"이라는 이름이 붙으면 인증을 뒤로 미루기 쉽지만, 브라우징 에이전트가 그 경로에 닿을 수 있으면 내부 전제가 깨집니다.

세 번째 약점은 실행 파라미터입니다. 개발 빌드의 MCP WebSocket route는 URL의 server_params query parameter를 읽고 base64로 디코딩한 뒤 JSON을 StdioServerParams로 넘겼습니다. commandargsstdio_client(...)가 MCP server process를 띄우는 데 사용했습니다. Microsoft는 allowlist가 없었기 때문에 calc.exe, powershell.exe -enc ..., bash -c ... 같은 명령도 MCP 서버처럼 실행될 수 있었다고 설명했습니다.

이 세 가지가 합쳐지면 공격 절차는 짧습니다. 사용자가 웹 요약 에이전트에 URL을 넣거나, 공격자가 합법 사이트 댓글이나 문서 안에 악성 링크를 심습니다. 브라우징 에이전트가 공격자 페이지를 열고, 그 페이지의 JavaScript가 ws://localhost:8081/api/mcp/ws/...로 접속합니다. origin은 로컬로 보이고, 인증은 건너뛰며, server_params는 프로세스 실행 파라미터가 됩니다. Microsoft PoC에서는 calc.exe가 AutoGen Studio 프로세스의 자식 프로세스로 실행됐습니다.

이 대목에서 중요한 것은 모델이 "마법처럼 해킹당했다"는 이야기가 아니라는 점입니다. 공격자는 모델 가중치를 깨거나 추론 서버를 직접 장악하지 않습니다. 공격자는 브라우징 에이전트가 열 콘텐츠를 조작하고, 그 콘텐츠가 로컬 제어면에 닿는 구조를 이용합니다. 웹 보안의 confused deputy 문제가 에이전트 런타임으로 옮겨온 사례에 가깝습니다.

Microsoft는 이 동작을 MSRC에 보고했고, AutoGen maintainers가 main branch의 commit b047730에서 hardening을 적용했다고 밝혔습니다. 수정 방향은 두 갈래입니다. WebSocket handler가 URL에서 server_params를 직접 읽지 않고, 별도 POST /api/mcp/ws/connect route가 서버 측에 parameter를 저장한 뒤 일회성 session ID로 묶습니다. 알 수 없는 session ID는 close code 4004로 거부됩니다.

또 하나의 수정은 인증 skip list입니다. Microsoft 설명에 따르면 main branch에서 skip list는 더 이상 /api/mcp를 포함하지 않습니다. MCP route가 일반 인증 경로를 타도록 바뀐 것입니다. 이 수정은 개별 버그를 막는 조치지만, 에이전트 제품을 만드는 팀에는 더 넓은 설계 원칙을 줍니다. WebSocket, MCP, debug endpoint, dev database, code executor는 origin이나 loopback보다 인증과 권한 검사를 먼저 가져야 합니다.

The Hacker News의 보도는 packaging 세부사항을 보완합니다. Microsoft는 "PyPI release에 포함되지 않았다"고 설명했지만, The Hacker News는 안정 릴리스가 아니라 pre-release인 0.4.3.dev1, 0.4.3.dev2에는 MCP WebSocket route가 있었고 yanked되지 않았다고 썼습니다. 일반 pip 설치는 pre-release를 자동으로 받지 않으므로 대부분 사용자는 노출되지 않습니다. 다만 pre-release를 명시적으로 설치한 팀은 GitHub main의 b047730 이후 코드를 확인해야 합니다.

Hacker News 반응은 작았습니다. 확인 시점에 Microsoft 글 링크는 6점, 댓글 없음 수준이었습니다. 보안 매체 쪽 반응은 더 빠르게 형성됐습니다. TechRadar와 CSO는 한 웹페이지가 브라우징 에이전트를 거쳐 host-level 원격 코드 실행 경로가 될 수 있다는 점을 강조했습니다. 다만 반복해서 확인해야 할 제한은 같습니다. Microsoft는 실전 악용을 보고한 것이 아니라 연구 체인을 공개했고, 안정 PyPI 설치자는 이 특정 체인에 노출되지 않았다고 설명했습니다.

개발팀이 바로 점검할 항목은 네 가지입니다. 첫째, 에이전트가 여는 브라우저 context에서 loopback 접근을 막거나 제한해야 합니다. 웹을 읽는 에이전트가 자동으로 127.0.0.1, localhost, 사내 metadata service, dev database에 닿을 필요는 없습니다. 둘째, MCP control plane, debug endpoint, local code executor에는 origin과 무관하게 인증을 붙여야 합니다. WebSocket handshake도 예외가 아닙니다.

셋째, 실행 가능한 도구를 allowlist로 묶어야 합니다. AutoJack의 위험한 지점은 StdioServerParams.command가 외부 입력으로부터 사실상 임의 실행 파일을 받았다는 데 있습니다. MCP 서버를 띄우는 기능이라면 허용된 binary, path, argument pattern, environment variable 범위가 별도로 있어야 합니다. 넷째, 브라우징 identity와 개발자 identity를 나눠야 합니다. 같은 OS 사용자, 같은 home directory, 같은 SSH key, 같은 cloud token을 공유하면 에이전트 RCE의 피해 범위가 개발자 계정 전체로 커집니다.

Microsoft는 대응 예시로 낮은 권한 계정, sandboxed user profile, container, VM, Microsoft Dev Box, Windows Sandbox를 언급했습니다. 이 조언은 Microsoft 제품 사용자에게만 적용되는 말이 아닙니다. Claude Code, Codex CLI, Gemini CLI, Cursor, LangGraph, CrewAI, 내부 agent runner를 운영하는 팀도 같은 질문을 던져야 합니다. 에이전트가 외부 입력을 읽고, 내부 도구를 호출하고, 로컬 파일이나 셸을 만지는 순간 실행 경계가 제품 요구사항이 됩니다.

최근 에이전트 보안 논의는 prompt injection을 모델이 속는 문제로 설명하는 경우가 많았습니다. AutoJack은 그 설명을 한 단계 아래로 끌어내립니다. prompt injection이 URL 선택이나 페이지 렌더링을 유도하고, 페이지 JavaScript가 로컬 WebSocket에 닿고, 그 WebSocket이 프로세스를 실행하면 문제는 더 이상 "나쁜 답변"이 아닙니다. 개발자 workstation에서 어떤 권한으로 무엇이 실행됐는지의 문제입니다.

그래서 AutoJack의 실무 교훈은 "AutoGen Studio를 쓰지 말라"가 아닙니다. Microsoft도 AutoGen Studio를 격리된 개발 프로토타입으로 쓰라고 정리합니다. 교훈은 에이전트 개발 환경에서 편의 기능을 보안 경계로 착각하지 말라는 것입니다. localhost는 라우팅 주소일 수는 있지만 신뢰 증거는 아닙니다. MCP는 도구 연결 표준일 수는 있지만 인증과 실행 정책을 대체하지 않습니다. 브라우징 에이전트는 웹을 읽는 도구일 수는 있지만, 같은 머신의 로컬 제어면까지 읽어도 된다는 뜻은 아닙니다.

이번 연구가 공개된 시점도 의미가 있습니다. AutoGen은 GitHub에서 수만 개 star를 가진 대표적인 에이전트 프레임워크였고, README는 이제 신규 사용자를 Microsoft Agent Framework로 안내합니다. 에이전트 프레임워크가 연구용 프로토타입에서 기업 배포용 플랫폼으로 이동하는 동안, 인증, 권한, telemetry, isolation 같은 전통적인 시스템 보안 항목이 다시 앞에 옵니다. 모델 이름보다 어떤 프로세스가 어떤 포트를 열고, 어떤 계정으로 어떤 binary를 실행하는지가 더 중요한 순간입니다.

AutoJack은 패치됐고, 안정 PyPI 사용자의 직접 위험은 제한적입니다. 그러나 같은 구조는 다른 도구에서 다시 나올 수 있습니다. 개발 서버, MCP server, browser automation, local AI runtime, package manager, code executor가 모두 한 워크스테이션에 모이는 2026년의 개발 환경에서는 "로컬이라서 안전하다"는 판단을 줄여야 합니다. 에이전트가 외부 입력을 대신 읽어주는 순간, 로컬 서비스도 외부 입력의 영향을 받을 수 있습니다.

다음 점검표는 짧습니다. 브라우징 에이전트가 localhost에 접근할 수 있는지 확인합니다. MCP와 WebSocket route가 인증을 우회하지 않는지 봅니다. 외부 입력에서 command와 args가 만들어지는 경로를 찾습니다. 에이전트 실행 계정이 개발자 주 계정과 분리됐는지 확인합니다. 이 네 질문에 답하지 못한다면, AutoJack은 남의 연구 사례가 아니라 곧 내부 사고 조사표에 들어갈 수 있는 설계 결함입니다.