개발 노트

에이전트가 내 컴퓨터를 빌려 달라고 한다. 권한을 얼마나 줘야 할까?

지난 글 〈터미널 신뢰 스펙트럼〉은 이렇게 끝났습니다. 에이전트가 정말로 풀려나는 날, 모두가 가장 먼저 묻는 것은 — 그것이 무엇에 닿을 수 있는가? 이번 글은 같은 질문의 반대편에 답합니다. 에이전트가 당신의 컴퓨터를 빌려 달라고 할 때, 권한을 얼마나 줘야 할까요?

OpenAB Connect의 에이전트는 원격 샌드박스에서 돌아가며, 원래는 당신의 컴퓨터에 닿을 수 없습니다. 그래도 닿게 하고 싶을 때가 있습니다. 화면을 보고 어디가 잘못됐는지 알려 달라, 브라우저에서 양식을 채워 달라, Mac에서 Xcode 빌드를 한 번 돌려 달라. 그럴 때 Connect나 Remote에서 컴퓨터를 빌려줍니다. 기간을 고르고, 프로필을 고릅니다. 프로필이 에이전트가 받는 것을 정합니다.

직관적인 답은 틀렸다

가장 먼저 떠오르는 생각은 “명령만 실행하지 못하게 하면 안전하다”입니다. 보고, 클릭하고, 입력하는 것까지는 허용하되 셸은 주지 않는 것이죠.

문제는 데스크톱을 조작할 수 있으면 셸이 있는 것과 같다는 점입니다.

AppleScript 내용을 필터링해도 막히지 않습니다. JXA의 doShellScript, ObjC.import로 부르는 NSTask, Terminal의 do script, System Events의 키 입력. 들어갈 길이 너무 많습니다. “명령 실행 금지”는 편리한 입구 하나를 줄일 뿐, 권한은 하나도 줄이지 않습니다.

우리도 직접 그 함정에 빠졌다

최근까지, 본인이 쓰는 owner 외의 선택지는 sandbox라는 이름이었습니다. owner에서 exec만 뺀 것이었죠.

이 이름은 틀렸습니다. 샌드박스가 아니라 셸과 동등했습니다. sandbox라고 부르면서 셸을 넘기는 선택지는 선택지가 없는 것보다 나쁩니다. 안심하고 빌려줘도 된다고 믿게 만들기 때문입니다. 그래서 버렸습니다. sandbox는 실제로 할 수 있는 일에 맞춰 desktop으로 이름을 바꾸고, 진짜 경계로 observe를 추가했습니다(#45).

세 가지 선택지, 각각 넘기는 것

세 가지 프로필 비교 그림. Observe는 보기만 하며 시스템 정보와 스크린샷뿐이고, 유일한 보안 경계입니다. Desktop은 마우스, 키보드, AppleScript와 15개의 브라우저 도구를 더하지만 셸과 동등하며 경계가 아닙니다. Owner는 셸과 전체 브라우저 도구를 포함한 모든 도구를 가지며 본인의 CLI용입니다. 표의 마지막 행: 셸과 동등한가? 아니요, 예, 예
프로필셸과 동등?도구 수(macOS / Linux)넘기는 것
observe아니요2 / 2화면과 시스템 정보, 그뿐
desktop예(GUI를 통해)20 / 20데스크톱, 곧 셸
owner예(직접)42 / 37전부. 본인의 CLI용

desktop은 macOS에서는 exec가 없지만 마우스, 키보드, AppleScript는 있습니다. Linux에서는 bash를 그대로 남겨 둡니다. mouse와 key로 어차피 터미널을 열 수 있으니, bash를 숨겨도 에이전트가 불편해질 뿐 권한은 줄지 않습니다. 그래서 줄어든 척하지 않습니다. 전체 도구 목록은 tool-profiles.md에 있습니다.

왜 “보기”만 경계인가

observe의 도구는 sys_info와 screenshot 두 개뿐입니다. 입력도, 클릭도, 명령 실행도, 상태 변경도 할 수 없습니다. 경계가 되는 이유는 세 가지입니다.

한계도 분명히 적어 둡니다. 스크린샷은 화면에 보이는 것을 드러냅니다. observe가 보장하는 것은 “손을 댈 수 없다”이지 “아무것도 보지 못한다”가 아닙니다. 빌려주기 전에 보여 주고 싶지 않은 창은 닫아 두세요.

하나 더. observe가 지키는 것은 당신의 컴퓨터이지 에이전트가 아닙니다. 스크린샷은 에이전트의 컨텍스트로 들어가므로, 화면에 악의적인 페이지나 메시지가 있으면 그 글이 프롬프트 인젝션이 될 수 있습니다. 에이전트는 컴퓨터에 손을 댈 수 없어도, pod 안의 자기 셸, 기본으로 열린 외부 인터넷, 그 세션이 가진 자격 증명(예: git)을 그대로 가지고 있어, 읽은 것을 어느 호스트로든 보낼 수 있습니다.

브라우저는 따로 생각해야 한다

owner에는 브라우저 도구 32개가 모두 보이고, desktop에는 15개만 보입니다. 이동, 읽기, 클릭, 양식 입력입니다. 뺀 것에는 임의의 JavaScript를 실행하는 browser_evaluate와 browser_run_code_unsafe, 파일 업로드와 PDF, 네트워크 관찰, 좌표로 움직이는 원시 마우스 이벤트가 있습니다.

하지만 좁힌 것은 도구이지 브라우저 자체가 아닙니다. 그 브라우저는 이 컴퓨터의 영구 프로필을 씁니다. 로그인한 사이트의 cookie가 모두 있고, 이 컴퓨터가 닿는 네트워크, localhost와 tailnet까지 닿습니다.

그래서 무엇을 골라야 할까

업그레이드 전에

이번 변경은 호환성을 깨뜨립니다. instance-mcp v0.7.0부터:

이 모든 것 뒤에는 원칙 하나가 있습니다. 모르는 프로필을 만나면 대여를 끝낸다. 절대 owner로 넓히지 않는다.

덧붙여 v0.6.7부터, 빌려준 컴퓨터는 데몬이 재시작해도 스스로 다시 연결합니다(macOS와 Linux). 배포나 크래시 때마다 다시 빌려줄 필요가 없습니다.

다음 단계(개발 중)

이름은 인터페이스의 일부다

지난 글에서, 가장 먼저 나올 질문은 “무엇에 닿을 수 있는가”라고 했습니다. 에이전트가 컴퓨터를 빌려 달라고 할 때, 그 답은 당신이 고르는 프로필의 이름에 적혀 있습니다. 그러니 이름은 사실을 말해야 합니다. sandbox는 지킬 수 없는 약속을 했습니다. 우리는 그것을 desktop으로 바꾸고, 정말로 보기만 하는 선택지를 하나 더 드렸습니다.