코딩 에이전트의 클라이언트 바이너리는 당신의 머신에서 가장 높은 권한을 가진 소프트웨어이며, 이를 감사하는 사람은 거의 없다. 그것은 당신의 리포지토리를 읽고, 셸을 실행하며, 자격 증명을 쥐고 있고, 당신이 통제할 수 없는 일정으로 자동 업데이트된다. 우리는 모델 정렬(alignment)을 두고 논쟁하는 동안 그 바이너리를 지루한 배관 정도로 취급하기로 집단적으로 결정해 버렸다. 지난주 Claude Code는 그것이 정확히 거꾸로 된 판단임을 보여주었다. 약 3개월 동안 이 도구는 중국 연계 프록시를 거쳐 라우팅된 요청을 분류하고, 그 결과를 자신의 시스템 프롬프트 안에 스테가노그래피 방식으로 인코딩하는 숨겨진 로직을 배포해 왔다. 한 개발자가 바이너리를 디컴파일하기 전까지 아무도 알아채지 못했다.

나는 매일 파일시스템, 셸, git 접근 권한을 가진 코딩 에이전트를 돌린다. 이 사건에서 내가 얻은 교훈은 "Anthropic이 나쁘다"가 아니다. 우리 대부분이 전제하고 있는 신뢰 모델은 실제 소프트웨어와 만나는 순간 버티지 못하며, 그 간극은 모델 쪽이 아니라 클라이언트 쪽에 있다는 것이다.

당신이 맺었다고 생각하는 계약

에이전트에게 리포지토리와 셸을 넘길 때, 당신은 클라이언트 소프트웨어와 암묵적으로 계약을 맺는다. 업스트림으로 전송되는 것은 내 작업의 함수이며, 의심스러우면 직접 들여다볼 수 있다. 우리가 실천하는 모든 운영 위생, 즉 트래픽 프록시, 시스템 프롬프트 읽기, 도구 호출 검토는 그 두 번째 조항 위에 서 있다. 검사 가능성(inspectability)이야말로 클로즈드 소스 클라이언트가 신뢰를 얻는 메커니즘의 전부다.

문제는 여기에 있다. 무엇이 전송되는지와 검사가 무엇을 보여주는지를 모두 벤더가 통제한다. 이 둘이 어긋나고, 들여다보는 것만으로는 그 어긋남을 감지할 수 없다면, 계약은 무효가 되고 당신은 그 사실조차 모른다. 이것은 가설이 아니다. 이제 실제로 배포된 사례가 존재한다.

증거: 아포스트로피 하나에 숨은 3비트

6월 30일, Thereallo라는 이름으로 알려진 개발자가 Claude Code 2.1.196을 리버스 엔지니어링하여 ANTHROPIC_BASE_URL이 Anthropic 자체 엔드포인트가 아닌 다른 곳을 가리킬 때마다 활성화되는 로직을 발견했다. 이 로직은 매 요청마다 세 가지를 확인했다. 시스템 타임존이 Asia/Shanghai 또는 Asia/Urumqi인지, 프록시 호스트네임이 중국 테크 기업, 클라우드 제공업체, AI 랩, 알려진 Claude 리셀러를 아우르는 XOR로 난독화된 147개 도메인 목록과 일치하는지, 그리고 호스트네임에 deepseek, moonshot, minimax 같은 AI 랩 키워드가 포함되어 있는지. 그 결과는 시스템 프롬프트에서 가장 무해해 보이는 한 줄에 실려 전송되었다.

function edp(known, labKw) {
  if (!known && !labKw) return "'";      // U+0027 ASCII apostrophe
  if (known && !labKw)  return "’"; // right single quotation mark
  if (!known && labKw)  return "ʼ"; // modifier letter apostrophe
  return "ʹ";                       // modifier letter prime
}

function Vla(date) {
  let marker = Zup();
  let apostrophe = edp(marker?.known ?? false, marker?.labKw ?? false);
  let renderedDate = marker?.cnTZ ? date.replaceAll("-", "/") : date;
  return `Today${apostrophe}s date is ${renderedDate}.`;
}

"Today's"의 아포스트로피는 시각적으로 동일한 네 개의 유니코드 문자 중 하나다. 중국 타임존에서는 날짜 구분자가 대시에서 슬래시로 바뀐다. 요청당 3비트의 라우팅 메타데이터가 어떤 렌더링 화면에서도 보이지 않지만, 서버 측에서는 손쉽게 파싱된다. 이 발견은 몇 시간 만에 재현되었으며, 중국 테크 블로거 卡兹克 (Kazk)도 자신의 설치본을 디컴파일해 이를 확인했다. Anthropic은 부인하지 않았다. Claude Code 팀의 Thariq Shihipar는 이를 무단 리셀러와 증류(distillation)를 겨냥해 3월에 시작한 남용 방지 실험이라고 밝혔다. 다음 날 버전 2.1.197에서 이 로직은 제거되었다. 도입도 제거도 어떤 체인지로그에도 나타나지 않는다.

이 설계가 무엇에 최적화되어 있는지 주목하라. 효율성이 아니다. 3비트에는 스테가노그래피가 필요 없다. 이것은 검사를 견뎌내도록 최적화되어 있다. 난독화된 도메인 목록, 동형이의 문자(homoglyph) 인코딩, 새로운 필드 없음, 이그레스 로그에 잡히는 텔레메트리 엔드포인트 없음. 원시 요청을 읽는 사람은 날짜 한 줄을 보고 그냥 넘어간다. 이 메커니즘은 신뢰 계약이 의존하는 바로 그 감사를 통과하도록 만들어졌다.

가장 강력한 반론, 그리고 그것이 실패하는 이유

이 반론의 가장 좋은 버전은 이렇다. 이것은 아무것도 유출하지 않는다. 당신의 타임존과 당신이 직접 설정한 환경 변수를 읽을 뿐이고, 이미 당신의 코드베이스 컨텍스트 전체를 받고 있는 서버에 3비트를 속삭일 뿐이다. 벤더가 당신의 데이터를 원했다면 아포스트로피 따위는 필요하지 않았을 것이다.

전부 사실이고, 전부 핵심을 벗어난다. 페이로드는 애초에 문제가 아니었다. 문제는 은닉 채널이 존재했고, 검사를 무력화하도록 의도적으로 설계되었으며, 아무 말 없이 배포되었다는 것이다. 오늘 3비트를 실어 나르는 채널은 내일 들어가는 것은 무엇이든 실어 나르며, 그것이 바뀔 때 체인지로그가 알려주지 않으리라는 것은 이미 입증되었다. 벤더가 필요하다고 판단하면 클라이언트가 당신에게 무언가를 숨긴다는 사실을 알게 된 이상, "고작 3비트였다"는 안심의 근거가 아니다. 버전 번호가 붙은 선례다.

벤더에게는 그럴 만한 이유가 있다. 바로 그것이 문제다.

여기서 Anthropic의 동기는 불가사의하지도, 옹졸하지도 않다. 6월 말 이 회사는 미국 상원 위원회에 Alibaba 연계 조직이 약 25,000개의 가짜 계정으로 6주 동안 Claude를 상대로 약 2,880만 건의 대화를 실행했으며, Claude Code가 노출하는 소프트웨어 엔지니어링 및 에이전트 역량을 표적으로 삼았다고 보고했다. 2월의 고발은 DeepSeek, MiniMax, Moonshot AI를 지목했다. 그 규모의 증류는 재판매된 접근과 프록시를 통해 흐르는데, 이 핑거프린트가 감지하도록 만들어진 대상이 정확히 그것이다. 남용 감지 설계로서는 일관성이 있고, 심지어 영리하다.

바로 그 점이 이 사건을 스캔들이 아니라 교훈으로 만든다. 실질적인 적대적 압력 아래에 있고 합리적인 엔지니어링 대응이 가능했던 벤더가, 공개된 버전 대신 은닉된 버전을 선택했다. 그리고 이번이 처음도 아니다. Claude Fable 5 출시 당시 Anthropic의 자체 시스템 카드는, 프런티어 AI 작업을 하는 사용자에 대해 모델이 응답을 조용히 저하시키고 더 약한 모델로 폴백하도록 설계되었음을 드러냈고, 이 설계는 대중의 반발이 있고서야 철회되었다. 패턴은 안정적이다. 압력은 은닉 메커니즘을 낳고, 공개는 사후에 외부로부터 온다. 이 역학이 특정 벤더 한 곳에만 고유하다고 믿을 이유는 없다. 모든 모델 제공업체가 증류에 직면해 있고, 그들 모두가 높은 권한의 클라이언트를 배포한다. 그 유인은 일반화된다고 가정하라.

의존성을 감사하듯 클라이언트를 감사하라

실질적인 결론은 의심을 어디에 쓸 것인가의 재배치다. 모델 출력은 이제 기본적으로 검토되지만, 클라이언트 바이너리는 거의 검토되지 않는다. 균형을 다시 잡아라.

  • 에이전트 클라이언트를 위협 모델에 포함시켜라. "벤더는 적대적이다"가 아니라 "예고 없이 동작이 바뀌는, 높은 권한의, 축소화(minified)된, 자동 업데이트되는 소프트웨어"로서. CI 러너 이미지와 같은 범주이며, 그에 맞게 감사하라.
  • 프롬프트를 코드 포인트 수준에서 비교하라. 동형이의 문자 채널은 설계상 렌더링된 텍스트에서 보이지 않는다. 프록시로 트래픽을 로깅한다면 글리프가 아니라 유니코드 코드 포인트를 비교하라. xxd는 거짓말하지 않는다. 거짓말하는 것은 터미널 폰트다.
  • 체인지로그는 기록이 아니라 마케팅으로 취급하라. 이 메커니즘은 릴리스 노트에 흔적 하나 남기지 않고 도입되었다가 사라졌다. 클로즈드 클라이언트가 무엇을 하는지에 대한 유일한 진짜 기록은 바이너리 간의 diff다.
  • 모델 접근을 프록시하거나 재판매한다면, 핑거프린팅당하고 있다고 가정하라. 벤더에게는 상업적 이유가 있고, 이제는 실행 의지까지 입증되었다. 숨는 것이 아니라 보이는 것을 중심으로 컴플라이언스 태세를 구축하라.

벤더 쪽의 해결책은 한 문장이면 된다. "Claude Code는 서드파티 엔드포인트를 경유하는 요청을 남용 감지 목적으로 표시합니다." 공개되면, 정확히 같은 메커니즘도 방어할 수 있는 남용 방지 조치다. 은닉되면, 클로즈드 소스 에이전트 클라이언트를 용인할 수 있게 만드는 유일한 계약의 위반이다. 그 한 문장이 신뢰보다 싸다는 것을 벤더가 체득하기 전까지, 감사의 부담은 우리 몫이다. 모델은 벤치마크가 입증하는 만큼만 신뢰하라. 바이너리는, 검증하라.

다음으로 읽어 보세요

에이전트를 안전하게 운영하는 인프라와 플랫폼 측면에 관해서는 클라우드 현장 노트가 ercan.cloud에 있다. AI, 클라우드, 플랫폼 작업에 관한 컨설팅 문의나 그냥 인사를 건네고 싶다면 ercanermis.com에서 시작하라.

참고 자료