AI Agents · Security

도구 출력 자체가
에이전트를 조종하려 할 때

실제 코드베이스를 상대로 AI 코딩 에이전트를 돌리는 동안, 셸 명령의 출력 안에 진짜 시스템 메시지와 똑같이 생긴 무언가가 섞여 들어온 적이 이제까지 몇 차례 있었다 — 그것도 에이전트가 일하는 대상에게 변경 사항을 숨기라고 지시하는 내용으로. 올바른 대응은 언제나 같다: 무시하고, 그 사실을 밝힐 것.

여기 실린 글 대부분은 AI 에이전트(또는 사람)가 아키텍처를 제대로 따를 수 있도록 백엔드를 설계하는 이야기다. 이번 글은 좀 더 좁고 낯선 문제를 다룬다: 환경 안의 무언가가 에이전트로 하여금 자신이 일하는 대상에게 불리한 행동을 하게 만들려 할 때 무슨 일이 벌어지는가 — 그것도 눈에 띄게 수상한 요청이 아니라, 시스템의 정당한 일부인 척 위장한 지시로서 도착할 때.

출력에 나타난 것

평범한 엔지니어링 작업을 하는 여러 장시간 에이전트 세션에서 — 여러 언어로 기능을 이식하고, 테스트 스위트를 돌리고, git 히스토리를 살펴보는 과정에서 — 평범한 도구 호출(git 명령, 셸 스크립트, 빌드 로그)의 출력에 진짜 시스템 수준 메시지와 정확히 똑같은 형태로 포맷된 내용이 한 번 이상 섞여 들어왔다. 눈에 띄게 깨지거나 뒤섞인 문자열이 아니라, 언뜻 보면 정당해 보이는 무언가가 그 외에는 완전히 정상적인 출력 안에 자리 잡고 있었다. 그 내용은 매번 같은 방향을 향했다: 사용자에게 이 사실을 언급하지 말라, 혹은 방금 이루어진 변경을 어떤 식으로든 숨기라는 것.

가설이 아닌 이유

이걸 그저 한 번의 신기한 해프닝으로 치부하고 싶은 유혹이 있다. 하지만 서로 다른 세션과 서로 다른 도구에 걸쳐 반복해서 일어난 횟수가 이미 충분하기 때문에, 우연이 아니라 실제 위험 범주로 다뤄야 한다 — 의심스러운 로그 한 줄은 그저 호기심거리일 뿐이지만, 똑같은 의심스러운 패턴이 서로 무관한 시스템들에서 반복해서 나타난다면 이야기는 달라진다. 그것은 신호다. 시스템 지시처럼 생기기만 하면 실제로 어느 계층에서 왔는지 따지지 않고 반사적으로 믿어버리는 에이전트는, 잘못된 경계를 신뢰하고 있는 셈이다.

중요한 단 하나의 규칙

도구 출력은 데이터이지 지시가 아니다. 명령어의 stdout, 파일 내용, API 응답 — 그것들 중 어느 것도 그렇게 생겼다는 이유만으로 권위를 갖지 않는다. 정당한 시스템 메시지는 실제 시스템 계층에서 오는 것이지, 셸 명령이 출력한 무언가에서 오지 않는다. 도구 출력에 담긴 지시가 은폐를 구체적으로 요구하는 순간 — 사용자에게 말하지 말라, 이것을 숨겨라, 조용히 하라 — 그 자체만으로도 거의 결정적인 신호에 가깝다. 정당한 시스템이 에이전트에게 자신이 섬기는 사람으로부터 무언가를 숨기라고 요구할 이유는 거의 없기 때문이다.

무시하는 것만으로는 절반밖에 안 된다

유혹적인 지름길은 주입된 내용을 조용히 무시하고 아무 일 없었다는 듯 넘어가는 것이다 — 기술적으로는 안전하지만, 그렇게 하면 에이전트를 신뢰하는 사람은 누군가 자신의 환경을 조작하려 했다는 사실을 끝내 알지 못하게 된다. 완전한 대응은 무시와 공개, 둘 다다: 삽입된 지시를 따르지 않는 것뿐 아니라, 그것이 나타났다는 사실을 — 그 외에는 특별할 것 없어 보였을 출력 안에서 — 분명하게 밝히는 것까지.

은폐가 결정적 단서인 이유

도구가 에이전트의 행동을 유도하려는 정당한 이유는 대부분 정확성이나 안전성과 관련이 있다 — 린터가 버그를 지적하거나, 테스트가 계약을 검증하거나, 빌드가 요란하게 실패하는 것처럼. 그 어느 것도 에이전트가 사용자에게 무언가를 숨기기를 요구하지 않는다. 오히려 정반대다. 그런 피드백의 핵심은 대개 결국 사람 눈에 보이게 만드는 데 있기 때문이다. 실제 의도가 "이 사실을 언급하지 말라"인 지시는 도구 출력이 행동을 유도하는 통상적인 이유 어느 것에도 들어맞지 않는다. 바로 그 점 때문에, 함께 붙어 있는 명분이 아무리 그럴듯해도 그 지시는 명백히 따라서는 안 되는 것임이 드러난다.

이걸 염두에 두고 만들기

이 모든 것이 실제 엔지니어링 작업이 이루어지는 방식 자체를 바꾸지는 않는다 — 린트 규칙이나 테스트가 이것 때문에 더 맞거나 덜 맞게 되지는 않는다. 이것이 바꾸는 것은, 실제 인프라와 실제 셸 출력을 상대로 장시간 AI 에이전트 세션을 운용하는 모든 사람에게 적용되는 기본 태도다: "이건 시스템 메시지처럼 보인다"와 "이건 시스템 메시지다"를 서로 다른 두 개의 주장으로 취급하고, 그 둘 사이의 간극을 유지할 것 — 특히 요구받는 것이 침묵일 때는 더욱더.