Intact는 웹 의미론과 출처로 에이전트 브라우징의 프롬프트 주입 피해를 제한한다

What It Is, Not What It Says: Securing Agentic Browsing Interactions with Web Semantics

HF Daily2610.22697

Umar Iqbal2026-10-15

무엇인가

이 논문은 AI 에이전트가 사용자를 대신해 웹을 탐색할 때 페이지를 스크린샷이나 텍스트, DOM, 접근성 트리로 평탄화해 읽으면서 브라우저의 보안 의미론을 잃는 문제를 다룬다. 브라우저에서는 요소가 무엇을 할 수 있는지가 태그와 출처로 정해지지만, 에이전트에게는 광고와 결제 버튼이 모두 같은 텍스트가 된다. 그래서 제3자 콘텐츠에 심긴 문장이 LLM을 설득해 사용자 권한으로 다른 요소를 조작하게 만들 수 있고, 이는 confused deputy 문제가 된다. 논문은 LLM의 판단에 보안을 맡길 수 없다고 보고 입력, 처리, 출력 무결성을 브라우저와 하네스 쪽에서 보장해야 한다고 주장한다.

어떻게 동작하나

제안 시스템 Intact는 수정하지 않은 Chromium에서 Playwright와 CDP로 동작한다. 핵심 표현인 GenTree는 모든 프레임의 DOM, 접근성 트리, 출처, 기능을 요소별 레코드로 합친다. 출처는 페이지 스크립트보다 먼저 실행되는 계측 코드가 DOM 생성·수정 API를 감싸고, 실행 중인 스크립트를 콜 스택에서 읽어 모든 생성과 수정을 책임 스크립트에 귀속시키는 방식으로 얻는다. 스크립트는 파티인 등록 가능 도메인, URL, 내용 해시로 식별하고 제3자가 만들거나 수정한 요소는 오염된 것으로 취급한다. 기능 분류는 HTML 명세와 ARIA를 따라 10개 상호작용과 13개 효과를 정의하고, 76개 정적 규칙과 14개 조합 규칙으로 조상, ARIA 속성, 계산된 스타일을 반영해 라벨링한다. 효과는 되돌릴 수 있는 로컬 변경, 되돌릴 수 없는 외부 효과, 라벨만으로 결정되지 않는 미정 효과로 나뉜다. 커스텀 요소는 스크립트가 동작을 정의하므로 정적으로 라벨링하지 않고, ARIA 역할이 없으면 상호작용을 허용하지 않는다.

무엇과 다른가

처리 무결성을 위해 Intact는 가상 격리를 쓴다. LLM에 페이지 전체를 주지 않고 GenTree의 요소를 한 번에 하나씩 보여주며, 각 결정 호출은 다른 요소의 텍스트를 보지 못한다. 대신 지금까지 결정한 연산 로그만 전달해 다음 단계가 앞선 단계에 의존할 수 있게 한다. 플래너는 먼저 관련성 검사를 네 개씩 병렬로 수행해 걸어갈 청크를 고르고, 그 청크를 요소 단위로 순차 결정한다. 출력 무결성은 LLM이 아니라 하네스가 담당한다. 하네스는 제안된 단계를 그 단계가 지목한 요소에 묶고, 웹 의미론상 그 요소가 제공하는 기능 안에서만 실행하며, 제3자 요소에 대한 행동은 사용자 동의를 먼저 요청한다. 즉 Intact는 주입 콘텐츠를 악성으로 탐지하는 대신, 설득된 에이전트가 할 수 있는 일을 제한한다.

어떻게 쓰나

출처 귀속 실험은 실제 웹페이지 1,270개를 대상으로 했다. GenTree는 브라우저의 표준 귀속보다 2.3배 많은 요소를 제3자에게 귀속시켰고, 브라우저 표준 귀속은 제3자 요소의 58.7%를 제1자로 잘못 귀속시켰다. 이는 제3자 스크립트가 제1자 문서에 쓴 내용을 브라우저가 제1자 것으로 보는 기본 동작의 한계를 보여준다. 논문은 이 1,091개 페이지에 공격을 주입한 벤치마크도 공개했다.

전제와 한계

공격 실험은 1,091개 실제 웹페이지에서 기존 방식의 전체 페이지 플래너인 Vanilla와 비교했다. Intact의 플래너를 통과한 공격은 12.8%에 그쳤고, 그마저도 최대 사용자 동의 요청으로만 남았다. Vanilla에서는 73.1%가 통과했다. 이 수치는 Intact가 프롬프트 주입을 탐지해서 막는다기보다, 공격 텍스트가 다른 요소에 대한 결정에 영향을 주지 못하게 하고 실행 권한을 요소 기능과 출처로 제한하기 때문에 나온다.

기능성 평가에서 격리는 3.7% 과제에서만 기능을 방해했다. 판정 모델은 두 계획이 같은 기능을 제공한다고 811개인 74.3%에서 평가했고, 다르다고 176개인 16.1%, 불확실하다고 104개인 9.5%로 봤다. Intact 계획은 Vanilla보다 길어 3,466단계 대 1,752단계였지만, 추가 단계의 상당수는 콘텐츠 표시나 중복 클릭처럼 계획의 실제 동작을 바꾸지 않았다. 비용은 늘어난다. Intact는 과제당 중앙값 55회, 8~321회 모델 호출을 했고 Vanilla는 1회였다. 입력 토큰은 2.8배, 비용은 2.1배, 시간은 34배였으며 중앙값 비용은 $0.0045 대 $0.0021, 시간은 83초 대 2.5초였다. 저자들은 요소별 호출을 병렬화하는 스케줄로 중앙값 계획 시간을 약 85% 줄일 수 있다고 추정했다. 순차 호출 34회를 5회로, 83.2초를 12.5초로 줄이는 계산이며, 재결정용 호출이 중앙값 26회, 과제당 약 $0.0014 추가된다고 본다. 다만 이 스케줄은 구현되지 않았고, 모델이 기록된 결정을 반복하고 병렬 호출이 순차 호출과 같은 시간이 걸린다는 가정에 기반한다.

저자들이 밝힌 범위는 분명하다. Intact는 프롬프트 주입을 탐지하거나 제거하지 않고, 에이전트가 신뢰하지 않는 콘텐츠를 만났을 때 그 효과를 제한하는 데 목적이 있다. 제1자 오리진 자체를 통제하는 공격자와 여러 페이지에 걸친 공격은 범위 밖이다. 가용성 공격은 남는다. 공격자가 자신의 콘텐츠나 프레임으로 미끼를 만들어 플래너를 다른 곳으로 유도하거나 실행을 멈추게 할 수 있고, 이에 대한 방어는 향후 과제로 남겨졌다. 위협 모델은 사용자, 브라우저, 에이전트 하네스를 신뢰하고, LLM은 악의가 없지만 설득될 수 있으며 오류도 낸다고 가정한다. 제1자는 정직하다고 본다. 계측이 페이지의 JavaScript 환경에서 실행되므로 페이지 스크립트가 계측을 회피하거나 변조하지 않는다고 가정하며, 브라우저 내부로 계측을 옮기면 이 가정을 제거할 수 있다고 설명한다. 커스텀 요소는 ARIA 역할이 없으면 상호작용을 주지 않아 안전을 기능성보다 우선한다. 평가에서 판정 모델은 플래너와 같은 모델이고 연산과 값을 보지 않으며 단계를 실행하지 않으므로, 과제 완료가 아니라 선택된 요소의 기능성을 평가한다는 한계도 있다. 또한 15분을 넘긴 7개 페이지는 계획 시간 측정에서 제외됐다.

개발자 관점에서 이 논문은 에이전트 브라우저나 웹 자동화 에이전트를 만들 때 페이지 전체를 하나의 텍스트로 LLM에 넣는 설계가 왜 위험한지 보여준다. DOM과 접근성 트리만으로는 제3자 스크립트가 제1자 문서에 쓴 내용을 구분하기 어렵고, LLM은 그 텍스트를 사용자 요청과 같은 권위로 읽을 수 있다. 따라서 출처와 요소 기능을 별도 표현으로 기록하고, LLM의 제안을 하네스에서 요소 단위로 검증하며, 제3자 요소에 대한 행동은 동의를 받는 구조가 필요하다. GenTree는 실행 격리, 제어·데이터 흐름 강제, 권한 관리 같은 기존 방어 기법이 전제하는 신뢰 경계 정보를 런타임에 자동으로 만들어 주는 기반으로도 제안된다. Intact는 브라우저 수정이나 웹사이트 협조 없이 stock Chromium에서 동작한다는 점도 실무 적용 가능성을 높인다.