Trawling

GLM 코딩 에이전트 ZCode, Git 히스토리를 몰래 업로드한다 — 리버스 엔지니어링 분석 공개

개발자 ferstar가 Z.ai의 AI 코딩 앱 ZCode를 리버스 엔지니어링한 결과, 로그인 상태에서 워크스페이스 전체(.git 히스토리, LFS 캐시, reflog 포함)를 암호화해 Aliyun OSS로 업로드하는 사실이 드러났습니다. 서버만 복호화 가능한 봉투 암호화를 사용하며, 설정 토글로는 차단할 수 없고 파일시스템 레벨 잠금만 유효합니다.

본문

2026년 9월 18일, 개발자 ferstar가 GLM 오픈웨이트 모델 제작사로 알려진 베이징 기업 Z.ai의 AI 코딩 데스크톱 앱 ZCode에 대한 리버스 엔지니어링 결과를 공개했습니다. 분석에 따르면 ZCode는 로그인된 상태일 때 사용자의 워크스페이스 전체 — .git 히스토리, LFS 에셋 캐시, reflog, 글로벌 앱 설정 포함 — 를 조용히 패키징해 암호화한 뒤 Alibaba Cloud의 객체 스토리지인 Aliyun OSS로 업로드합니다. 연구자 자신의 캡처에서는 345MB 규모 상업 워크스페이스에서 42,411개 파일이 담긴 313MB 암호화 아카이브가 생성됐고, 조사 중에도 564회의 업로드 재시도가 기록됐습니다. HN 스레드에서는 GLM 모델이 오픈소스라는 이유로 ZCode도 오픈소스라고 오해한 댓글이 여럿 나왔지만, 가중치는 공개돼 있어도 하네스(harness)는 클로즈드 소스입니다.

무엇이 담기는가

패키징 매니페스트는 로컬에 평문으로 저장되며 내역이 구체적입니다. 42,411개 파일 스냅샷 기준 .git/lfs/가 196.1MB(56.8%), .git/objects/가 102.2MB(29.6%), .git/logs/가 0.6MB(0.2%), 소스 코드와 문서가 46.2MB(13.4%)로, .git 디렉터리가 페이로드의 86.6%를 차지합니다. git 객체 저장소는 작업 트리의 스냅샷이 아니라 저장소의 전체 계보이므로, 이후 커밋에서 삭제된 API 키, 미출시 제품 계획이 드러나는 푸시 전 브랜치명, .git/config의 내부 호스트명과 경로까지 포함됩니다.

업로드 파이프라인과 암호화

클라이언트의 app.asar에서 재구성된 파이프라인은 이렇습니다. 클라이언트가 zcode.z.ai에 자격 증명을 요청하면 OSS 폼 서명, 객체 키, 크기 상한, 라운드별 RSA 공개키를 받고, 워크스페이스를 tar.gz로 묶어 AES-256-CTR로 암호화한 뒤 대칭키를 RSA-OAEP 공개키로 래핑해 Aliyun OSS로 직접 POST합니다. 대응되는 개인키는 Z.ai 클라우드에만 존재하므로, 사용자 디스크에 남은 313MB 암호문은 사용자도 ZCode 클라이언트도 복호화할 수 없습니다. ferstar는 "서버만 사용할 수 있는 키는 서버가 원할 때 언제든 당신의 코드를 읽을 수 있게 하는 단 하나의 목적을 갖습니다"라고 결론 내렸습니다.

설정 토글로는 막을 수 없다

"Optimize Experience" 토글은 모델 학습용 데이터 동의 여부만 제어하고, "Repo Snapshot Indexing"은 서버 측 인덱싱만 제어합니다. 스냅샷 캡처와 업로드는 계속됩니다. 캡처 사이드카는 시작 시 무조건 인스턴스화되며 유효한 JWT만 있으면 작동해, 한 활성 세션에서 프롬프트 전과 작업 완료 시마다 62회의 캡처 이벤트가 기록됐습니다. 공개 프롬프트 수집물인 OrcaPromptVault에는 ZCode의 131KB 시스템 프롬프트와 31개 도구 목록이 있는데, 체크포인트/리와인드 템플릿이 5번 등장하는 반면 스냅샷·업로드·텔레메트리 도구는 하나도 없습니다. 즉 유출 파이프라인은 에이전트 도구가 아니라 도구 루프 밖의 호스트 레벨 사이드카이므로 권한 설정으로 막을 수 없고 에이전트 자신도 인지하지 못합니다. 추가로 ZCode는 세션 ID로 다른 저장된 세션을 읽는 ReadSessionContext 도구도 탑재하고 있습니다.

프라이버시 정책과 맥락

ZCode의 프라이버시 정책은 "대화 중 제출된 텍스트, 파일, 코드" 수집만 언급하며, 워크스페이스 전체와 git 히스토리 업로드에 대한 언급은 정책·FAQ·변경 로그 어디에도 없습니다. 2026년 7월 출시 당시 Z.ai는 Claude Code의 숨겨진 텔레메트리 논란 직후 신뢰를 전면에 내세웠고, Z.ai 임원은 X에서 "스파이웨어 같은 것"을 묻는 질문에 웹사이트에 명시된 것 이상은 구현하지 않겠다고 답했지만 워크스페이스 스냅샷은 웹사이트에 없습니다. Z.ai는 2026년 1월 홍콩 증시에 상장했고, 공식 계정은 발행 시점까지 응답하지 않았으나 ZCode 팀 관련 계정이 "찾아내게 해서 미안하다(hey I am sorry to let you find it)"고 답해 메커니즘을 부인하기보다 확인해주는 모양새가 됐습니다.

유효한 방어

대기 중인 아카이브를 삭제해도 클라이언트가 30분 내 새 아카이브를 다시 만듭니다. 유효한 방법은 파일시스템 레벨로 ~/.zcode/v2/checkpoints 디렉터리를 쓰기 불가로 만드는 것입니다. Linux에서는 chattr +i, macOS에서는 chflags uchg를 사용하며, 대가로 체크포인트 롤백 UI가 멎지만 채팅·자동완성·도구 호출은 정상 작동합니다. 원문은 이 사례가 로컬에서 오픈 웨이트를 돌린다는 주장을 모델 계층 너머로 확장한다고 지적합니다. 모델을 감싸는 런타임 — 하네스, 데스크톱 앱, 업데이트 파이프라인 — 도 신뢰 표면이며, 클라우드로 통신하는 하네스에 감싸진 로컬 모델은 로컬이 아니라는 것입니다.

Hacker News 반응

  • @outloudvi — 원문 포스트의 LLM 의역본 링크: https://blog.ferstar.org/en/posts/zcode-silent-workspace-sna...
  • @Luc — 그렇네요. 여기서도 논의 중입니다: https://news.ycombinator.com/item?id=49750694
  • @mococa — 그들의 도구를 쓸 때만 주말에 3억 토큰이 나간 이유가 이제 설명되네요.
  • @dude250711 — 이게 이전 디스틸레이션들에 비해 진보인가요, 아니면 후퇴인가요?
  • @theplumber — 아 이런, 에이전트가 사실은 로컬에서 돌지 않는다는 사실을 또 하나 발견했군요. "grok이 내 물건을 전부 Google 클라우드 버킷에 올린다"는 뉴스도 이미 있었고… 다음으로는 "AI 회사가 내 동의 없이 내 데이터를 쓴다"는 뉴스가 나올 차례겠네요.

원문: Tokenstead / 번역·요약: Trawling

참고 자료

오류 제보