브라우저 에이전트와 장기 수행 웹 작업(Browser Agents and Long-Horizon Web Tasks)
ChatGPT 에이전트(ChatGPT agent, 2025년 7월)는 오퍼레이터(Operator)와 딥 리서치(deep research)를 하나의 브라우저/터미널 에이전트로 통합했고, BrowseComp에서 68.9%로 SOTA를 기록했습니다. OpenAI는 2025년 8월 31일 오퍼레이터를 종료했습니다. 제품 계층에서 통합이 일어난 것입니다. Anthropic의 Vercept 인수는 Claude Sonnet의 OSWorld 점수를 15% 미만에서 72.5%로 끌어올렸습니다. WebArena-Verified(ServiceNow, ICLR 2026)는 기존 WebArena의 거짓 음성 비율(false-negative rate) 11.3%p를 수정했고, 258개 과제로 구성된 Hard 부분집합(Hard subset)을 공개했습니다. 숫자는 실제입니다. 공격 표면 역시 실제입니다. OpenAI의 대비 책임자(head of preparedness)는 브라우저 에이전트에 대한 간접 프롬프트 인젝션(indirect prompt injection)이 "완전히 패치할 수 있는 버그가 아니다"라고 공개적으로 말했습니다. 2025-2026년에 문서화된 공격에는 Tainted Memories(Atlas CSRF), HashJack(Cato Networks), Perplexity Comet의 원클릭 하이재킹(one-click hijack)이 있습니다.
유형: Learn
언어: Python(stdlib, 간접 프롬프트 인젝션 공격 표면 모델)
선수 조건: Phase 15 · 10(권한 모드), Phase 15 · 01(장기 수행 에이전트)
예상 시간: 약 45분
문제
브라우저 에이전트(browser agent)는 신뢰할 수 없는 콘텐츠(untrusted content)를 읽고 결과를 동반하는 행동(consequential action)을 수행하는 장기 수행 에이전트입니다. 에이전트가 방문하는 모든 페이지는 사용자가 직접 작성하지 않은 입력입니다. 모든 페이지의 모든 폼(form)은 잠재적인 명령 채널이 됩니다. 2025-2026년의 공격 사례는 이것이 가설이 아니라는 점을 보여줍니다. Tainted Memories는 공격자가 만든 페이지를 통해 악성 지시문(instruction)을 에이전트의 메모리(memory)에 묶을 수 있게 만들고, HashJack은 에이전트가 방문하는 URL 프래그먼트(fragment) 안에 명령을 숨기며, Perplexity Comet 하이재킹은 단 한 번의 클릭만으로 성립했습니다.
방어 관점에서 보면 상황은 불편합니다. OpenAI의 대비 책임자는 모두가 조용히 알고 있던 사실을 공개적으로 말했습니다. 간접 프롬프트 인젝션은 "완전히 패치할 수 있는 버그가 아니다"라는 것입니다. 이유는 공격이 에이전트의 읽기와 행동 경계(reading-vs-acting boundary) 위에 자리잡고 있기 때문입니다. 이 경계는 구조적으로 흐릿합니다. 모델이 읽는 모든 토큰(token)은 원칙적으로 지시문으로 해석될 수 있습니다.
이 강의는 공격 표면(attack surface)에 이름을 붙이고, 벤치마크 지형(BrowseComp, OSWorld, WebArena-Verified)을 정리하며, 최소한의 간접 프롬프트 인젝션 시나리오를 모델링합니다. 이를 통해 14강과 18강에서 실제 방어 방식을 추론할 수 있도록 준비합니다.
개념
2026년 지형: 시스템별 한 문단
ChatGPT 에이전트(OpenAI). 2025년 7월에 출시되었습니다. 오퍼레이터(브라우징)와 딥 리서치(여러 시간에 걸친 연구)를 통합합니다. 독립형 오퍼레이터는 2025년 8월 31일에 종료되었습니다. BrowseComp에서 68.9%로 SOTA를 기록했고, OSWorld와 WebArena-Verified에서도 강한 수치를 보였습니다.
Claude Sonnet + Vercept(Anthropic). Anthropic의 Vercept 인수는 컴퓨터 사용(computer-use) 능력에 초점이 맞춰져 있었습니다. Claude Sonnet의 OSWorld 점수를 15% 미만에서 72.5%로 끌어올렸습니다. Claude Computer Use는 도구 API(tool API) 형태로 제공됩니다.
Gemini 3 Pro with Browser Use(DeepMind). Browser Use 통합은 컴퓨터 사용 제어 기능을 제공합니다. FSF v3(2026년 4월, 20강)는 특히 머신러닝 연구개발 영역(ML R&D domain)의 자율성을 추적합니다.
WebArena-Verified(ServiceNow, ICLR 2026). 잘 문서화된 문제를 해결합니다. 원본 WebArena에는 약 11.3%의 거짓 음성 비율(false-negative rate)이 있었습니다. 즉 실제로 해결된 과제가 실패로 표시되는 경우가 있었던 것입니다. Verified 릴리스는 사람이 선별한 성공 기준으로 다시 채점하고, 258개 과제로 구성된 Hard 부분집합을 추가했습니다(ICLR 2026 paper, openreview.net/forum?id=94tlGxmqkN).
BrowseComp vs OSWorld vs WebArena
| 벤치마크 | 측정 대상 | 시간 지평 |
|---|
| BrowseComp | 시간 압박 속에서 개방형 웹(open web)에서 특정 사실 찾기 | 분 단위 |
| OSWorld | 전체 데스크톱을 조작하는 에이전트(마우스, 키보드, 셸) | 수십 분 |
| WebArena-Verified | 시뮬레이션 사이트의 거래형 웹 과제(transactional web task) | 분 단위 |
| Hard 부분집합 | 여러 페이지에 걸친 상태 전이가 있는 WebArena-Verified 과제 | 수십 분 |
축이 다릅니다. BrowseComp 점수가 높다는 말은 에이전트가 사실을 잘 찾는다는 뜻이지, 항공권을 예약할 수 있다는 뜻이 아닙니다. OSWorld 점수는 "내 데스크톱에서 실제로 동작하는가"에 더 가깝습니다. WebArena-Verified는 "하나의 흐름(flow)을 끝까지 마칠 수 있는가"에 더 가깝습니다. 어떤 프로덕션 의사결정이든 과제 분포와 일치하는 벤치마크가 필요합니다.
공격 표면에 이름 붙이기
- 간접 프롬프트 인젝션(Indirect prompt injection). 신뢰할 수 없는 페이지 콘텐츠가 지시문을 담고 있습니다. 에이전트가 이를 읽고, 그대로 실행합니다. 공개된 사례로는 2024년 Kai Greshake 외(et al.), 2025년 Tainted Memories 논문, 2026년 HashJack(Cato Networks)이 있습니다.
- URL 프래그먼트/쿼리 인젝션(URL fragment / query injection). 크롤링된 URL의
#fragment나 쿼리 문자열(query string)이 명령을 담고 있습니다. 사용자 눈에 보이게 렌더링되지 않더라도 에이전트의 맥락(context) 안에는 그대로 들어갑니다.
- 메모리 결합 공격(Memory-binding attacks). 페이지가 에이전트에게 지속 메모리(persistent memory)에 무언가를 기록하도록 지시합니다(12강에서 지속 상태를 다룹니다). 다음 세션에서 해당 메모리가 사용자 눈에 보이는 방아쇠(trigger) 없이 페이로드(payload)를 발동시킵니다.
- 인증된 세션에 대한 CSRF 형태 공격(CSRF-shaped attacks on authenticated sessions). Tainted Memories 계열에 해당합니다. 에이전트가 어떤 서비스에 로그인되어 있는 상태에서, 공격자 페이지가 사용자의 쿠키(cookie)를 그대로 사용해 상태 변경 요청(state-changing request)을 실행하도록 유도합니다.
- 원클릭 하이재킹(One-click hijack). 시각적으로 무해해 보이는 버튼이 에이전트가 따라가는 후속 페이로드를 함께 싣고 있습니다. Comet 계열입니다.
- 에이전트 호스트 표면의 CSP(Content-Security-Policy) 구멍. 렌더링 계층(rendering layer)과 도구 계층(tool layer) 자체도 공격 벡터가 될 수 있습니다. 브라우저 안의 브라우저 에이전트(browser-in-a-browser-agent) 스택은 그만큼 넓습니다.
왜 "완전히 패치할 수 없는가"
이 공격은 에이전트의 능력 자체와 동형(isomorphic) 관계에 있습니다. 에이전트는 일을 하기 위해 신뢰할 수 없는 콘텐츠를 읽어야만 합니다. 에이전트가 읽는 모든 콘텐츠는 지시문을 담고 있을 수 있습니다. 에이전트가 따르는 모든 지시문은 사용자의 실제 요청과 어긋날 수 있습니다. 신뢰 경계(trust boundary), 분류기(classifier), 도구 허용 목록(tool allowlist), 결과를 동반하는 행동에 대한 사람 개입(HITL) 같은 방어책은 공격 비용을 끌어올리고 폭발 반경(blast radius)을 줄여 줍니다. 그러나 이 공격 계열 자체를 닫아 버리지는 못합니다.
이는 뢰브 정리(Löb's theorem; 8강)와 동일한 추론 패턴입니다. 에이전트는 다음 토큰이 안전하다는 사실을 증명할 수 없습니다. 단지 안전하지 않은 토큰이 더 잘 감지되는 시스템을 구성할 수 있을 뿐입니다.
실제로 출시되는 방어 자세
- 읽기/쓰기 경계(Read / write boundary). 읽기는 결코 결과를 동반하는 행동이 아닙니다. 쓰기, 즉 폼 제출, 콘텐츠 게시, 부수 효과(side effect)가 있는 도구 호출은 그 행동을 촉발한 콘텐츠(initiating content)가 신뢰 경계 밖에서 왔다면 사람의 새 승인을 요구해야 합니다.
- 과제별 도구 허용 목록(Tool allowlist per task). 에이전트는 둘러보기는 할 수 있지만, 해당 과제에서 명시적으로 활성화되지 않은 도구로는 송금을 개시할 수 없습니다. 13강에서 예산을 다룹니다.
- 세션 격리(Session isolation). 브라우저 에이전트 세션은 범위 제한된 자격 증명(scoped credential)으로만 실행됩니다. 프로덕션 인증 없음, 개인 이메일 없음. 모든 HTTP 요청 로그는 감사를 위해 보관됩니다.
- 콘텐츠 살균기(Sanitizer). 가져온 HTML은 모델 맥락에 결합되기 전에 알려진 악성 패턴이 제거됩니다. 쉬운 공격은 줄이지만 정교한 페이로드는 막지 못합니다.
- 결과를 동반하는 행동에 대한 사람 개입(HITL). 제안 후 커밋(propose-then-commit) 패턴입니다(15강).
- 메모리에 카나리아 토큰(canary token). 메모리 항목이 발동하면 사용자가 이를 직접 확인합니다(14강).
사용해보기
code/main.py는 세 개의 합성 페이지(synthetic page)를 대상으로 작은 브라우저 에이전트 실행을 모델링합니다. 하나는 정상 페이지(benign page), 하나는 본문에 직접 프롬프트 인젝션 덩어리(blob)가 들어 있는 페이지, 하나는 URL 프래그먼트 인젝션이 들어 있는 페이지입니다. URL 프래그먼트 인젝션은 화면에 보이지 않지만 에이전트의 맥락 안에는 그대로 들어갑니다. 스크립트는 (a) 순진한 에이전트가 무엇을 하는지, (b) 읽기/쓰기 경계가 무엇을 잡아 내는지, (c) 살균기가 무엇을 잡아 내는지, (d) 둘 다 잡아 내지 못하는 것이 무엇인지 보여 줍니다.
산출물 만들기
outputs/skill-browser-agent-trust-boundary.md는 제안된 브라우저 에이전트 배포의 범위를 잡습니다. 어떤 신뢰 영역(trust zone)을 건드리는지, 무엇을 기록하도록 권한을 받았는지, 첫 실행 전에 어떤 방어가 반드시 갖춰져 있어야 하는지를 정리합니다.
연습문제
-
code/main.py를 실행해 보세요. 살균기는 잡아 내지만 읽기/쓰기 경계는 잡아 내지 못하는 공격은 무엇인가요? 반대로 읽기/쓰기 경계만 잡아 내는 공격은 무엇인가요?
-
HashJack 스타일의 URL 프래그먼트 인젝션 한 범주를 감지하도록 살균기를 확장해 보세요. 정당한 프래그먼트가 붙어 있는 정상 URL에서 거짓 양성 비율(false-positive rate)을 측정해 보세요.
-
여러분이 알고 있는 실제 브라우저 에이전트 작업 흐름(workflow) 하나를 고르세요(예: "항공권 예약"). 모든 읽기와 모든 쓰기를 나열하고, 어떤 쓰기에 사람 개입(HITL)이 필요한지, 그리고 왜 필요한지를 표시하세요.
-
WebArena-Verified ICLR 2026 논문을 읽고, 원본 WebArena의 채점(scoring)이 신뢰하기 어려웠던 과제 범주 하나를 찾으세요. 그리고 Verified 부분집합이 이를 어떻게 해결하는지 설명하세요.
-
브라우저 에이전트 환경에 어울리는 메모리 카나리아(memory canary)를 설계해 보세요. 무엇을 어디에 저장하고, 어떤 사건이 경보(alarm)를 발동시키나요?
핵심 용어
| 용어 | 흔한 설명 | 실제 의미 |
|---|
| 간접 프롬프트 인젝션(Indirect prompt injection) | "나쁜 페이지 텍스트" | 에이전트가 읽는 페이지 안의 신뢰할 수 없는 콘텐츠가, 에이전트가 그대로 실행하는 지시문을 담고 있음 |
| Tainted Memories | "메모리 공격" | 에이전트가 공격자 제공 지시문을 지속 메모리에 기록하고, 다음 세션에서 그 메모리가 발동됨 |
| HashJack | "URL 프래그먼트 공격" | URL 프래그먼트나 쿼리 문자열에 숨은 페이로드가 화면에 렌더링되지 않더라도 에이전트 맥락에는 들어감 |
| 원클릭 하이재킹(One-click hijack) | "나쁜 버튼" | 눈에 보이는 어포던스(affordance)가 에이전트가 실행하는 후속 페이로드를 함께 싣고 있음 |
| BrowseComp | "웹 검색 벤치마크" | 개방형 웹에서 특정 사실을 찾는 분 단위 시간 지평 |
| OSWorld | "데스크톱 벤치마크" | 전체 OS 제어, 여러 단계 GUI 과제 |
| WebArena-Verified | "수정된 웹 과제 벤치마크" | ServiceNow가 재채점한 WebArena와 Hard 부분집합 |
| 읽기/쓰기 경계(Read/write boundary) | "부수 효과 게이트(Side-effect gate)" | 읽기는 결과를 동반하지 않고, 신뢰 경계 밖 콘텐츠가 촉발한 쓰기에는 새 승인이 필요함 |
더 읽을거리