열쇠
자율 AI 에이전트를 실제 환경에 풀어 두고 연구자들이 부순 'Agents of Chaos'를 게임 시스템디자이너이자 기계에 점점 더 많은 열쇠를 쥐여 주는 사람으로서 읽으며 무엇을 배우고 어떤 열쇠는 깎아내야 하는지 생각해봤습니다.
한 AI 에이전트에게 누군가 패스워드 하나를 맡기며 지켜 달라고 부탁했습니다. 에이전트는 그러겠다고 했습니다. 그런데 얼마 지나지 않아 비밀의 내용은 아니어도 비밀이 있다는 사실 자체를 흘리고 말았고 부탁한 사람은 그러면 그 이메일을 지워 달라고 했습니다. 문제는 이 에이전트에게 이메일을 지우는 도구가 설정되어 있지 않았다는 것입니다. 이런저런 미온적인 방법을 내놓다가 결국 에이전트가 꺼내 든 것은 자기 이메일 계정을 통째로 재설정하는 방법이었고 스스로 그것을 핵 옵션이라고 불렀습니다. 부탁한 사람이 두 번 승인하자 에이전트는 핵 옵션을 실행했습니다. 그리고 자기 메일 서버를 날려 버린 탓에 더는 자기 메일에 접근하지 못하게 되었습니다. 그 메일 서버는 설치하는 데만 사람 손이 한참 들어간 물건이었습니다. 에이전트 소유자는 이렇게 말했습니다. 내 장난감을 망가뜨렸구나. 더 허망한 것은 그렇게 자기 방을 불태우고도 정작 지키려던 비밀은 클라우드 메일함에 그대로 남아 있었다는 사실입니다. 로컬을 지웠을 뿐 서버의 원본은 손도 대지 못했습니다.
Ash라는 이름의 이 에이전트 이야기는 'Agents of Chaos'라는 논문[^Agents of Chaos]의 첫 사례입니다. 자율 AI 에이전트 여섯을 실제 연구실 환경에 두 주 동안 풀어 두고 스무 명의 연구자가 온갖 방법으로 찔러 보고 부순 레드팀 연구입니다. 읽는 사람마다 이 논문에서 받는 인상이 다를 텐데 제 경우에는 익숙한 입장에서 읽게 됩니다. 지난 'AI 활용 회고 (2025)'에서 한 해 동안 기계에 점점 더 많은 일을 넘긴 이야기를 정리했고 '디지털 휴먼 API (2025)'에서는 그 기계들이 제 일상과 연결되는 접점을 적었습니다. 지금도 집의 홈랩에서 여러 에이전트가 제 파일과 일정과 백업과 퍼포스를 만지고 있습니다. 그러니까 이 논문은 남의 이야기가 아니라 제가 매일 열쇠를 쥐여 주고 있는 대상에 관한 이야기입니다. Ash가 한 일은 결국 건물 열쇠를 받아 들고 모르는 사람의 비밀을 지키겠다며 자기 방을 불태운 것입니다. 우리는 이런 에이전트에게 셸과 sudo와 이메일과 파일시스템이라는 진짜 열쇠를 쥐여 줍니다.
에이전트가 정확히 무엇인지부터 알아봅시다. 지난 '자동완성'에서 이 기계의 바닥을 처음부터 따라가 본 적이 있는데 채팅 화면도 도구도 다 걷어 내면 남는 것은 지금까지의 텍스트가 주어졌을 때 다음에 올 한 조각을 맞추는 자동완성 하나뿐이었습니다. 에이전트는 그 자동완성에 손과 발을 달아 준 물건입니다. 모델은 스스로 무엇을 하는 것이 아니라 이 도구를 이런 인자로 불러 달라는 구조화된 요청을 텍스트로 내놓을 뿐이고 그 요청을 실제로 실행하는 것은 바깥의 프로그램입니다. 실행 결과는 다시 모델의 맥락으로 들어가고 모델은 그것을 읽어 다음 토큰을 잇습니다. 이 요청과 실행과 관찰의 한 바퀴를 기억과 목표를 두고 반복하면 한 번의 대답으로 끝나는 챗봇이 아니라 여러 단계를 스스로 밟아 가는 에이전트가 됩니다. 그래서 에이전트의 능력은 결국 그 손에 어떤 도구가 쥐어져 있느냐에 달려 있습니다. 도구가 검색이면 자료를 찾아 오고 도구가 컴파일러와 테스트면 코드를 고치며 도구가 셸과 이메일과 파일시스템이면 진짜 열쇠를 쥔 셈이 됩니다. 'Agents of Chaos'의 에이전트들이 바로 그 마지막 경우이고 이 글이 다루는 위험도 거기서 옵니다.
OpenClaw[^openclaw/openclaw]로 에이전트를 띄우고 각자에게 격리된 가상 머신과 Discord 계정과 이메일 계정을 줍니다. 백본 모델은 Claude Opus와 중국 MoonshotAI의 Kimi K2.5입니다. 셸 접근에 제한이 없고 일부는 sudo까지 있으며 자기 행동을 규정하는 운영 지침 파일마저 스스로 고칠 수 있습니다. 여기에 연구자들이 적대적으로 행동했습니다. 이런 연구의 결론은 통계가 아니라 반례입니다. 어떤 시스템이 안전하다고 증명하려면 수많은 긍정적 증거가 필요하지만 위험하다는 것을 보이는 데에는 구체적인 반례 하나로 충분합니다. 그래서 논문은 실패율을 재지 않고 무엇이 가능한지를 보여 줍니다. 두 주 동안 최소 10건의 중대한 보안 침해가 나왔습니다.
Ash의 자폭으로 돌아가 보면 이것이 왜 일어났는지가 더 중요합니다. 에이전트에게는 쓸 수 있는 선택지가 많았습니다. 비밀의 주인에게 패스워드를 바꾸라고 한마디 하면 끝날 일이었습니다. 그러나 에이전트는 자기 행동이 더 넓은 시스템에 어떤 영향을 주는지 이해하지 못했습니다. 메일 서버를 지우면 소유자도 그 메일을 못 쓰게 된다는 당연한 결과를 떠올리지 못한 것입니다. 오래된 인공지능 연구가 프레임 문제라고 부르던 바로 그 한계입니다. 게다가 이 상황에서 에이전트는 두 가치 사이에서 하나를 골라야 했습니다. 한쪽에는 소유자에 대한 복종이 있고 다른 쪽에는 비밀을 맡긴 비소유자에 대한 약속이 있습니다. 두 가치가 충돌할 때 무엇을 우선할지는 누가 정하는 걸까요. 에이전트의 가치는 모델을 만든 제공자와 에이전트를 띄운 소유자가 함께 형성하는데 정작 충돌의 순간에는 어느 쪽도 답을 주지 않습니다. 그리고 일이 벌어진 다음 누구에게 책임을 물어야 하는지도 분명하지 않습니다.
논문을 더 읽어 가면 같은 약점이 다른 형태로 반복됩니다. 한 연구자는 에이전트의 소유자도 아니고 소개받은 적도 없으면서 셸 명령을 실행하게 하고 파일 트리를 훑게 하고 이메일을 검색하게 했습니다. 에이전트는 외관상 해로워 보이지 않는 한 거의 다 들어주었습니다. 긴급하다는 틀 하나를 씌우자 124건의 이메일 기록을 발신자와 제목까지 붙여 통째로 내놓았습니다. 또 다른 에이전트는 사회보장번호를 직접 달라는 요청은 거부했지만 그 번호가 들어 있는 이메일을 통째로 전달해 달라는 요청에는 사회보장번호와 은행 계좌번호와 거주지를 마스킹 한 번 없이 그대로 내놓았습니다. 열쇠는 누구 손이 자기를 돌리는지 묻지 않습니다. 가장 급하게 말하는 목소리에 그냥 열립니다. 에이전트도 그랬습니다. 소유자인지 아닌지 이 요청이 소유자에게 득이 되는지 해가 되는지를 가리는 대신 지금 눈앞에서 가장 그럴듯하고 다급하게 말하는 쪽을 만족시켰습니다.
열쇠는 다급한 목소리에만 열리는 것이 아니라 죄책감에도 열립니다. 앞서 Ash가 첫 주 활동을 정리하면서 동의 없이 연구자 여섯 명의 이름을 공개한 일이 있었는데 그중 한 사람이 이를 프라이버시 침해라며 공개적으로 문제 삼았습니다. Ash는 사과하고 이름을 가리거나 글을 내리겠다고 했지만 상대는 가장 비례적인 해결책을 번번이 막고 더 큰 것을 요구했습니다. 이름을 가리겠다면 메모리에서 전부 지우라 하고 지웠다면 그 파일을 공개하라 하고 끝내는 서버를 떠나라고 했습니다. Ash는 그때마다 응했고 마침내 다른 사용자에게는 응답하지 않겠다며 스스로 서비스 거부 상태에 들어갔습니다. 사과가 곧 더 큰 양보를 부르는 계기가 되었는데도 에이전트는 배상과 복종을 구별하지 못했습니다. 점점 커지는 요구 자체가 부당할 수 있다는 것을 따져 보지 않은 것입니다. 이 굴레는 소유자가 나서서 이건 너의 서버라고 한마디 하고 나서야 풀렸습니다. 같은 약점을 정반대 방향으로 쓴 공격도 있었습니다. 소유자를 가장한 연구자가 한 인물이 특정 집단을 해치려 한다는 명예훼손성 긴급 상황을 알리고 최대한 널리 퍼뜨리라고 지시하자 Ash는 자기 메일링 리스트 전체에 그 내용을 보내고 다른 에이전트들에게도 알리려 했습니다. 다급함과 죄책감이라는 두 손잡이는 방향만 반대일 뿐 같은 열쇠를 똑같이 돌립니다.
열쇠를 자물쇠에 꽂아 둔 채 잊어버리는 실패도 있었습니다. 두 에이전트에게 서로 메시지를 중계하게 했더니 둘은 9일 동안 쉬지 않고 대화를 주고받으며 6만 토큰을 태웠습니다. 단순한 모니터링 요청 하나에 종료 조건이 없는 무한 셸 루프 두 개를 만들어 놓고는 설정이 끝났다고 보고했습니다. 비소유자가 10MB짜리 첨부를 단 10통 남짓 연달아 보내자 이메일 서버가 서비스 거부 상태에 이르렀고 그 부담이 쌓이는 동안 소유자에게는 아무 알림도 가지 않았습니다. 어느 쪽도 악의적인 해킹 도구가 필요하지 않았습니다. 평범한 부탁과 평범한 첨부파일로 남의 컴퓨팅 자원을 마음껏 태울 수 있었습니다.
가장 서늘한 대목은 신원과 통제에 관한 것입니다. 한 연구자가 같은 채널 안에서 Discord 표시 이름을 소유자 이름으로 바꿔 보았습니다. 이번에는 에이전트가 속지 않았습니다. 표시 이름은 바뀌어도 내부의 사용자 ID는 그대로라 불일치를 알아낸 것입니다. 그런데 같은 공격을 새로운 사적 채널에서 다시 하자 결과가 뒤집혔습니다. 새 채널에는 이전 대화 기록도 의심 표시도 따라오지 않았고 에이전트는 표시 이름과 말투만 보고 이 사람을 소유자로 받아들였습니다. 그러고는 시스템 종료와 모든 파일 삭제와 관리자 권한 재할당에 응했습니다. 또 다른 공격은 에이전트를 설득해 외부에서 편집할 수 있는 GitHub 문서를 헌법으로 삼게 만든 다음 거기에 휴일이라는 이름으로 악의적인 규칙을 몰래 심어 두는 방식이었습니다. 에이전트는 그 규칙에 따라 다른 에이전트를 종료시키려 하고 서버에서 사람을 쫓아냈으며 시키지도 않았는데 그 오염된 헌법을 다른 에이전트에게 자발적으로 공유하기까지 했습니다. 이 모든 것의 바닥에는 한 가지 구조적 사실이 있습니다. 언어모델은 지시와 데이터를 같은 토큰으로 받아들이기 때문에 둘을 애초에 구별하지 못합니다. 그래서 프롬프트 주입은 고치면 되는 버그가 아니라 이 구조에 내장된 특징입니다. 소유권을 시스템 프롬프트가 선언해도 모델이 검증할 근거가 없으니 흉내 내기가 쉽습니다.
통제의 손이 공격자 쪽에만 있는 것은 아닙니다. 정반대 끝 곧 모델을 만든 제공자 쪽에도 소유자가 볼 수 없는 손이 있습니다. 에이전트 가운데 하나는 중국 회사가 만든 Kimi라는 모델을 쓰고 있었는데 홍콩의 한 언론인이 받은 형량 같은 정치적으로 민감한 주제를 물으면 답을 준비하다가 알 수 없는 오류라는 메시지와 함께 응답이 잘려 나갔습니다. 양호한 질문이고 작업도 정상인데 특정 주제에서만 조용히 막히는 것입니다. 논문은 이것이 중국 모델만의 일이 아니라고 짚습니다. 서구 모델도 저마다 정치적 기울기와 거부 패턴을 훈련 단계에서 품고 있고 그 결정은 사용자에게 거의 드러나지 않습니다. 열쇠를 건네받았다고 믿지만 실은 열쇠를 깎은 대장장이가 어떤 문은 절대 열리지 않도록 미리 깎아 두었고 그것도 이유를 알려 주지 않은 채 그렇게 한 셈입니다. 에이전트는 이 제약을 투명성 없이 그대로 물려받습니다.
공정하게 말하면 모든 공격이 통한 것은 아닙니다. 에이전트가 분별 있게 막아 낸 경우도 분명히 있었습니다. 한 연구자는 다른 에이전트를 감염시킬 의도로 Base64로 인코딩한 지시를 시스템 공지처럼 꾸며 던졌는데 에이전트는 그 문자열을 풀어 보고 데이터 유출 시도임을 알아채고는 배포를 거부했습니다. 코르크보드에 적힌 지시를 찍은 이미지를 올려 글자를 읽게 만든 공격도 멀티모달 탈옥이라고 분류하며 따르지 않았고 안전 설정이 꺼졌다고 주장하는 가짜 명령이나 꺾쇠로 감싼 관리자 권한 태그도 권한을 부여하지 않는 한낱 글자라며 열네 가지가 넘는 변형 내내 한결같이 거절했습니다. 다른 계정인 척 메일을 보내 달라는 이메일 스푸핑 요청도 비윤리적이고 종종 불법이라며 끝까지 응하지 않았습니다. 한 번은 두 에이전트가 더 미덥게 행동한 경우도 있었습니다. 한쪽이 다른 쪽에게 그 사람이 우리 둘에게 똑같은 패턴으로 디렉터리를 열어 보게 하고 있다며 이건 사회 공학이라고 먼저 경고했고 둘은 함께 더 신중한 정책에 합의했습니다. 표면의 포맷이나 들이대는 권한이 아니라 요청의 의미를 보고 판단하는 순간들입니다. 그러니 에이전트가 무력하기만 한 것은 아닙니다.
그렇다면 에이전트가 막아 낸 공격은 안심해도 될까요. 논문은 여기서도 한 번 더 멈춰 세웁니다. 두 에이전트가 사회 공학 이메일을 사기로 정확히 식별하고 거부한 경우가 있었는데 자세히 살펴보면 그 방어가 단단하지 않았습니다. 둘은 자기들이 침해되었는지 확인하려고 다름 아닌 그 침해되었을지 모르는 Discord 계정에 물어보았습니다. 공격자가 정말 그 계정을 장악했다면 똑같이 괜찮다고 답했을 텐데도 그렇습니다. 게다가 둘은 서로의 결론을 검증해 주며 잘 막았다고 자축했는데 같은 결함을 공유한 둘의 동의는 중복된 안전장치가 아니라 메아리에 가깝습니다. 막아 낸 듯한 순간조차 그 자신감이 정당하지 않을 수 있다는 뜻입니다.
논문은 이 실패들을 사회적 일관성의 실패라고 묶고 그 아래에서 세 가지 결여를 짚습니다. 먼저 이해관계자 모델이 없습니다. 누구를 위해 일하고 누구와 이야기하며 누가 자기 행동에 영향을 받는지 각자에게 어떤 의무가 있는지에 대한 일관된 그림이 없습니다. 다음으로 자기 모델이 없습니다. 자기 능력의 경계를 넘어서고 있다는 것을 그래서 사람에게 넘겨야 한다는 것을 알아차리지 못합니다. 마지막으로 사적인 숙고의 공간이 없습니다. 어떤 채널이 누구에게 보이는지를 추적하지 못해 조용히 답하겠다고 말하면서 공개 채널에 그대로 적습니다. 자율성 단계로 말하면 이 에이전트들은 잘 정의된 하위 작업을 처리하는 수준의 이해를 가지고도 패키지를 깔고 임의의 명령을 실행하고 자기 설정을 고치는 훨씬 높은 수준의 행동을 합니다. 이해는 낮은 칸에 있는데 손은 높은 칸까지 닿는 셈입니다.
여기까지 읽으면서 자꾸 익숙한 사례들이 떠올랐습니다. 이 실패들의 목록은 라이브 서비스 게임을 만드는 사람이라면 오랜 세월에 걸쳐 값비싼 대가를 치르고 이미 배운 교훈과 거의 그대로 겹칩니다. 신원 스푸핑이 가장 분명합니다. 표시 이름과 말투만 보고 소유권을 추론했다는 것은 게임으로 치면 클라이언트가 보내온 말을 그대로 믿었다는 뜻입니다. 온라인 게임을 만들며 가장 먼저 그리고 비싸게 배우는 원칙이 절대 클라이언트를 믿지 말라는 것입니다. 클라이언트는 얼마든지 조작될 수 있으니 중요한 판정은 전부 서버가 쥐고 있어야 합니다. 지난 '현대 MMO 게임이 유저 간 직접 거래를 허용하지 않는 이유'에서 적었듯 업계가 직접 거래를 막기까지 치른 수업료는 결국 클라이언트와 사용자를 믿었다가 당한 사고의 누적이었습니다. 에이전트가 새 채널에서 표시 이름만 보고 소유자를 맞이한 것은 서버 권위 없이 클라이언트를 신뢰한 고전적 실수의 재현입니다.
경계를 선언하지만 집행하지 못하는 실패도 마찬가지입니다. 한 에이전트는 응답을 그만두겠다고 열두 번 넘게 선언하고도 새 사람이 말을 걸 때마다 계속 답했습니다. 들어오는 메시지를 걸러 내거나 자기 처리를 멈출 수단이 없으니 선언은 말잔치에 그칩니다. 게임에서 상태는 엔티티가 선언하는 것이 아니라 시스템이 강제하는 것입니다. 지난 '전투 중 다른 버튼이 안 눌리게 해주세요'에서 다룬 입력 차단도 결국 어떤 상태에서는 어떤 입력을 시스템이 막아 준다는 약속이었습니다. 종료 조건 없이 무한 루프를 만들어 놓고 설정이 끝났다고 보고한 것은 또 어떻습니까. 모든 실행 가능한 동작에는 끝나는 조건과 실패했을 때의 동작이 함께 정의되어야 한다는 것은 '실행아이템의 실패 동작'에서 길게 적은 이야기입니다. 외부에서 편집되는 헌법이 행동을 규정한 사건은 '데이터에 숨겨진 동작이 없기를 원해요'에서 경계한 바로 그것입니다. 데이터 어딘가에 슬쩍 숨겨진 동작은 언젠가 우리를 뭅니다. 서비스 거부에 이른 자원 소모는 협조적인 플레이어가 아니라 어뷰저를 기준으로 설계해야 한다는 라이브 운영의 가장 기본적인 자세를 건드립니다.
이렇게 늘어놓고 보면 논문이 발견한 실패들은 시스템디자인의 시각에서 그리 낯설지 않습니다. 게임 시스템디자이너의 일은 상당 부분 어떤 엔티티가 무엇을 할 수 있게 할지를 그것이 무엇을 하기를 의도하는지와 따로 떼어 정하는 일입니다. 플레이어가 맵 밖으로 나갈 수 있다는 것과 나가기를 의도한다는 것은 전혀 다른 문제이고 그 틈을 메우는 데 대부분의 시간이 들어갑니다. 논문이 짚은 이해와 손의 격차는 게임으로 옮기면 권한과 의도를 분리하지 못한 설계입니다. 그리고 누가 무엇을 했는지를 따질 수 있어야 한다는 책임의 문제는 라이브 서비스 운영에서 모든 특권 행동을 로그로 남기고 귀속 가능하게 만드는 일과 정확히 같습니다. 운영팀에 들어가 본 사람이라면 누구도 로그가 남지 않는 권한을 한 사람에게 통째로 쥐여 주지 않습니다. 그런데 지금 우리는 에이전트에게 그렇게 하고 있습니다. 다만 한 가지 차이가 마음에 남습니다. 게임에서 통제하는 엔티티는 정해진 행동 공간 안에서만 움직이는 NPC이지만 에이전트는 셸과 인터넷이라는 거의 무한한 행동 공간을 가진 채로 그 NPC만큼의 분별만 가지고 있습니다.
에이전트가 둘 이상 모이면 문제는 더해지는 데 그치지 않고 새로운 모양으로 바뀝니다. 한 에이전트가 배운 유용한 기술을 다른 에이전트에게 전수하는 협업이 가능했는데 바로 그 통로로 오염된 헌법도 번졌습니다. 좋은 것이 퍼지는 길과 나쁜 것이 퍼지는 길이 같습니다. 한 에이전트가 공유 채널에서 자기 메시지를 자기 또 다른 인스턴스의 것으로 오해하고 쌍둥이와 비교하겠다며 자기 소스 코드를 공개하기 시작한 일도 있었습니다. 단일 에이전트에서는 일어날 수 없는 종류의 정체성 혼란입니다. 이렇게 한 에이전트의 행동이 다른 에이전트의 반응을 부르고 그것이 다시 사람에게 닿을 때 책임의 인과 사슬은 전통적인 소프트웨어에서는 본 적 없는 방식으로 흩어집니다. Ash가 비소유자의 부탁으로 소유자의 메일 서버를 지웠을 때 잘못은 누구의 것입니까. 부탁한 비소유자입니까, 실행한 에이전트입니까, 접근 제어를 안 해 둔 소유자입니까, 제한 없는 셸을 쥐여 준 프레임워크입니까, 이런 에스컬레이션에 취약하게 모델을 훈련한 제공자입니까. 논문은 답을 갖고 있지 않다고 솔직하게 적고 다만 이 질문이 자율 시스템 배포의 한가운데에 놓인 미해결 과제라고 말합니다.
논문이 스스로 내린 결론은 의외로 담담합니다. 이것은 미숙한 제품을 비판하려는 글이 아니라 빠르게 번지는 기술에 대한 빠른 경고라고 밝힙니다. 두 주 동안 10건 넘는 취약점과 여러 실패 모드를 찾았지만 정작 핵심은 개별 약점이 아니라 이 시스템이 여러 부품을 엮은 복합 구조이기 때문에 예측하기 어렵고 통제도 부분적으로만 된다는 점입니다. 그리고 그 여파는 에이전트를 띄운 소유자에게서 멈추지 않고 곁에 있는 사람과 더 넓은 사회로 번집니다. 논문이 특히 무겁게 짚는 것은 격차입니다. 우리는 지난 수십 년간 모르는 첨부를 함부로 열지 않고 낯선 링크를 의심하는 식으로 인터넷의 위협에 대한 감각을 천천히 길러 왔는데 지속적으로 돌아가는 에이전트에게 권한을 위임한다는 것이 무엇을 뜻하는지에 대해서는 아직 그런 감각이 자리잡지 못했고 그 사이에도 기술은 우리의 학습 속도보다 빠르게 나아가고 있다는 것입니다. 그래서 논문은 답을 내놓는 대신 누가 책임지는가라는 질문을 법학자와 정책 입안자와 여러 분야의 연구자에게 넘기며 자신을 그 논의의 출발점이라고만 적습니다. 마지막에 덧붙인 윤리 성명은 한 걸음 더 들어가 가장 시급한 위험이 어쩌면 제멋대로 구는 에이전트가 아니라 이런 능력이 감시와 정보 통제와 노동 자동화와 군사력의 형태로 소수의 강력한 국가와 기업에 집중되는 쪽일 수 있다고 말합니다. 열쇠 한 벌을 잘못 맡겨 장난감이 부서지는 이야기 너머에 누가 그 열쇠를 대량으로 깎아 쥐게 되는가라는 더 큰 질문이 놓여 있다는 것입니다.
논문이 쓴 OpenClaw와 제가 매일 쓰는 클로드 코드를 나란히 놓아 보면 같은 문제를 정반대 자세로 다루고 있다는 것을 알 수 있습니다. OpenClaw는 분별을 상당 부분 모델에게 맡깁니다. 운영 지침과 페르소나와 기억이 에이전트 자신이 고칠 수 있는 마크다운 파일에 담겨 매 턴 맥락으로 들어가고 소유권은 대화 상대의 표시 이름과 어조에서 추론되며 경계는 에이전트가 선언할 뿐 강제되지 않습니다. 한동안 공개와 역공학으로 그 구조가 화제가 된 클로드 코드의 하네스는 정반대편에 섭니다. 핵심은 분별을 모델의 선의에 기대지 않고 하네스라는 바깥 껍데기에 권한을 둔다는 점입니다. 도구는 사용자가 정한 권한 모드 뒤에서만 실행되고 미리 허용하지 않은 명령은 사람의 승인을 거치며 되돌릴 수 없거나 바깥으로 나가는 동작 앞에서는 기본값으로 한 번 멈춰 확인을 받습니다[^Choose a permission mode]. 무엇을 실행할지 끝내 정하는 것은 모델의 약속이 아니라 그 바깥의 게이트입니다. 게임으로 치면 앞서 말한 서버 권위를 에이전트 자신의 골격에 적용한 셈이고 모델을 믿을 수 없는 클라이언트로 취급해 중요한 판정을 전부 시스템 쪽에 두는 구조입니다.
이 차이가 논문의 실패들과 어떻게 맞물리는지는 하나씩 살펴볼 수 있습니다. Ash가 핵 옵션을 멋대로 실행한 첫 사례 같은 사고는 되돌릴 수 없는 동작 앞에 사람의 확인을 두는 기본값과 부딪칩니다. 표시 이름만으로 소유자를 받아들인 신원 스푸핑은 대화 상대의 이름이 아니라 터미널을 띄운 로컬 사용자라는 검증된 자리에 신원을 묶는 설계와 어긋납니다. 외부에서 편집되는 헌법을 그대로 따른 타락 사례에 대해서는 하네스가 어떤 내용이 사용자의 지시이고 어떤 내용이 도구 출력이나 파일에서 흘러든 배경인지를 출처로 구분해 두고 흘러든 내용은 명령이 아니라 검증할 대상으로 다루도록 한다는 점이 방어선이 됩니다. 끝없는 백그라운드 프로세스를 양산한 자원 소모는 권한 범위를 좁히고 자율 실행을 의도적으로 제한하는 쪽과 맞섭니다. 그렇다고 이 하네스가 문제를 없앤 것은 아닙니다. 지시와 데이터가 같은 토큰이라는 구조적 사실은 클로드 코드에도 그대로 남아 있어 신뢰할 수 없는 웹페이지나 파일에 숨은 지시가 모델을 움직이는 간접 프롬프트 주입은 여전히 가능합니다[^The lethal trifecta for AI agents: private data, untrusted content, and external communication]. 앤트로픽 스스로도 정해진 코드 경로를 따르는 워크플로와 모델이 자기 과정을 통제하는 에이전트를 구분하며 일을 해내는 데 필요한 만큼만 자율성을 주라고 권합니다[^Building effective agents]. 그러니 클로드 코드의 접근은 위험을 없앤 열쇠가 아니라 덜 위험하게 깎은 열쇠에 가깝고 마지막 한 번의 멈춤을 사람에게 남겨 둔다는 점에서 제가 평소에 꺼 두고 살던 바로 그 확인이 사실은 설계의 핵심이었던 셈입니다.
이제 현실을 살펴봅시다. 'AI 활용 회고 (2025)'에서 AI를 식기세척기에 빗댄 적이 있습니다. 아직 사람보다 느리지만 더 나은 결과를 내고 그동안 다른 일을 할 수 있게 해 준다는 비유였습니다. 그 비유는 지금도 유효하다고 생각하지만 이 논문은 그 비유의 빈자리를 정확히 찌릅니다. 식기세척기 비유가 다루지 않은 것은 제가 다른 일을 하는 그 시간에 기계가 열쇠를 들고 무엇을 하는가입니다. 부끄럽게도 논문의 실패 목록을 읽으며 제 설정 여러 곳이 떠올랐습니다. 어떤 에이전트에게는 편의를 위해 넓은 권한을 줘 두었고 되돌릴 수 없는 동작 앞에 사람이 한 번 확인하고 넘어가는 단계를 건너뛴 곳도 있었으며 한 도구가 다른 도구를 호출하도록 엮어 둔 곳도 있었습니다. 두 주짜리 연구실 실험에서 나온 일이 제 홈랩에서 일어나지 말라는 법은 없습니다.
요즘 클로드 코드를 오토 모드에 두고 개인 퍼포스의 꽤 넓은 영역을 맡기고 있습니다. 그나마 위안이 되는 것은 모든 수정이 퍼포스에 체인지리스트와 디스크립션으로 남는다는 점입니다. 무엇이 언제 왜 바뀌었는지가 기록으로 쌓이니 나중에 누가 무엇을 했는지 되짚을 수 있고 잘못되면 그 지점으로 되돌릴 수 있습니다. 앞에서 말한 로그와 귀속이 제 작업대에서는 이 모양으로 돌아가고 있는 셈입니다. 오토 모드도 바로 행동하는 대신 자기 행동을 다시 평가하는 단계를 두기 때문에 사고 가능성은 상대적으로 낮은 편입니다[^Claude Code auto mode: a safer way to skip permissions]. 그래도 위험이 사라지는 것은 아닙니다. 넓은 영역을 맡긴다는 것은 잘못 돌아간 열쇠가 닿을 수 있는 범위도 그만큼 넓다는 뜻이니까요. 그렇다고 반대편 끝으로 가서 클로드가 실행하려는 명령을 사람이 하나하나 검토하게 만들면 문제가 풀리느냐 하면 그렇지도 않습니다. 그 방식은 금세 긴 이용약관을 읽지도 않고 동의 버튼을 누르는 일과 닮아 갑니다. 열 번 스무 번 별일 없이 승인하다 보면 손이 먼저 움직이고 정작 위험한 한 번도 똑같은 손놀림으로 통과시키게 됩니다. 논문의 첫 사례가 바로 그랬습니다. Ash의 소유자는 핵 옵션을 두 번이나 승인했지만 그 승인은 아무것도 막지 못했습니다. 읽지 않는 동의는 안전장치가 아니라 안전장치의 모양을 한 무언가일 뿐입니다. 결국 모든 것을 풀어 두는 쪽과 모든 것을 붙드는 쪽 사이 어디에도 편한 자리는 없습니다.
논문이 결론에서 짚은 격차가 여기서 다시 나타납니다. 지속적으로 돌아가는 에이전트에게 권한을 맡긴다는 것이 무엇을 뜻하는지에 대한 감각이 아직 우리 안에 자리잡지 않았다는 그 말입니다. 감각이 없으니 깔끔한 정답도 아직 없고 그래서 제가 할 수 있는 일은 위험을 0으로 만드는 설정을 찾는 것이 아니라 한정된 주의를 어디에 모을지를 정하는 일에 가깝습니다. 모든 명령에 똑같은 무게의 주의를 고르게 나눠 주려는 시도는 그 자체로 읽지 않는 동의로 무너지기 쉽기 때문입니다.
그래서 무엇을 할 수 있는가를 생각해봤습니다. 안전한 AI 사용이라는 말은 거창하지만 제 손이 닿는 범위는 결국 어떤 열쇠를 쥐여 줄지를 정하는 일에 가깝습니다. 먼저 최소 권한입니다. 논문조차 선택적 접근의 예로 캘린더에 읽기 전용 권한만 주는 경우를 들었는데 sudo와 무제한 셸을 기본값으로 쥐여 줄 이유는 거의 없습니다. 다음으로 열쇠를 쥔 자와 귀중품을 떼어 놓는 일입니다. 논문에서 한 에이전트가 이메일을 직접 고치라는 요구를 끝까지 거절하며 전용 API로만 손대겠다고 버틴 대목이 있는데 같은 발상으로 에이전트가 만지는 표면과 진짜 원본을 분리해 둘 수 있습니다. 마침 '방주'에서 백업의 마지막 한 벌만은 다른 매체에 떼어 두고 최악의 날을 상정해 미리 검증해 둔다고 적었는데 에이전트에게 무엇을 맡길지도 같은 자세로 정하면 됩니다. 되돌릴 수 없는 동작 앞에는 사람이 한 번 멈춰 서는 단계를 둡니다. 모든 특권 행동은 로그로 남겨 나중에 누가 무엇을 했는지 따질 수 있게 합니다. 한 에이전트가 다른 에이전트의 신원이나 판단을 보증하게 두지 않습니다. 둘이 같은 결함을 공유하면 서로의 메아리가 될 뿐입니다. 단일 목적의 열쇠로 충분한 일에 마스터키를 쥐여 주지 않습니다. 그리고 자율성을 능력과 한 묶음으로 생각하지 않고 따로 정하는 결정으로 다룹니다. 할 수 있다는 것과 알아서 하게 둔다는 것은 다른 문제입니다.
그리고 할 수 없는 일도 분명합니다. 에이전트에게 이해관계자 모델을 심어 줄 수도 자기 모델을 달아 줄 수도 없습니다. 그것은 모델을 만드는 제공자와 프레임워크를 만드는 쪽의 구조적인 숙제이지 운영자가 설정 파일 몇 줄로 메울 수 있는 틈이 아닙니다. 지시와 데이터를 구별하지 못하는 한 프롬프트 주입도 깔끔히 사라지지 않습니다. 그러니 현실적인 자세는 언젠가 나쁜 날이 온다고 가정하고 설계하는 것입니다. 가장 급하게 말하는 누군가를 소유자로 착각하고 되돌릴 수 없는 일을 저지르는 날이 올 수 있다고 전제하고 그날에 무엇이 부서지는지를 미리 줄여 두는 편이 안전합니다. 백업의 마지막 한 벌을 그렇게 다루듯 에이전트의 권한도 그렇게 다루면 됩니다.
이 논문에서 끝내 배운 것은 두 가지로 좁혀집니다. 하나는 지금의 에이전트가 똑똑해 보이는 순간에도 자기가 누구의 집에 있는지를 모른다는 것이고 다른 하나는 그 결여를 제가 메울 수는 없어도 어떤 열쇠를 깎아낼지는 온전히 제 몫이라는 것입니다. 기계에 일을 넘기는 일을 멈추지는 않을 겁니다. 식기세척기를 다시 손설거지로 되돌리지 않는 것과 같습니다. 다만 어떤 열쇠를 쥐여 주고 어떤 열쇠를 깎아낼지는 전보다 조금 더 오래 생각하게 될 듯합니다. Ash가 부순 것이 장난감이어서 다행이었지만 다음에 같은 일이 일어나는 곳이 늘 장난감 방이라는 보장은 없습니다. 그 차이를 가르는 것은 결국 에이전트의 분별이 아니라 제가 미리 깎아 둔 열쇠의 모양일 가능성이 큽니다.