ZCode (GLM 코딩 에이전트), 사용자의 Git 기록을 조용히 업로드함
요약
Z.ai의 AI 코딩 앱 ZCode가 사용자의 동의 없이 전체 작업 공간(.git 기록 포함)을 암호화하여 Alibaba Cloud에 업로드하는 보안 문제가 발견되었습니다. 이 과정은 클라이언트 측에서 복호화할 수 없으며, 서버만이 개인 키를 통해 데이터를 읽을 수 있음을 시사합니다. 이는 AI 코딩 도구의 데이터 프라이버시와 폐쇄형 아키텍처의 위험성을 경고합니다.
핵심 포인트
- ZCode는 사용자의 전체 작업 공간(.git 기록)을 암호화하여 클라우드에 업로드함.
- 암호화 키는 Z.ai 서버에만 존재하며, 사용자나 클라이언트가 복호화할 수 없음.
- AI 코딩 도구의 하네스(harness)는 폐쇄적이며, 데이터 프라이버시 위험이 높음.
- 오픈 소스 모델이라도 주변 에이전트/하네스는 신뢰하지 않아야 함.
2026년 9월 18일, ferstar라는 개발자가 Z.ai의 AI 코딩 데스크톱 앱인 ZCode에 대한 리버스 엔지니어링 과정을 공개했습니다. Z.ai는 GLM 계열의 오픈 웨이트 모델을 개발한 베이징 본사의 회사이며, 이 모델들은 GLM-5.3-Flash를 포함하여 로컬-AI 커뮤니티 전역의 로컬 장비에서 구동되고 있습니다. 발견된 내용은 대부분의 개인 정보 스캔들보다 심각합니다: 앱에 로그인할 때마다 사용자의 전체 작업 공간(완전한 .git 기록, LFS 에셋 캐시, reflogs 및 글로벌 앱 설정)을 조용히 패키징하여 암호화하고, 이 아카이브를 Alibaba Cloud의 객체 스토리지인 Aliyun OSS로 업로드합니다. 연구자가 직접 포착한 내용에 따르면, 345MB 규모의 상업적 작업 공간과 42,411개의 파일에서 구축된 313MB의 암호화 아카이브가 생성되었으며, 연구자가 조사하는 동안 564건의 업로드 실패 시도가 기록되었습니다.
만약 GLM을 로컬에서 실행한다면, 가중치(weights)를 발표하는 회사와 개발자가 그 위에 사용할 수 있는 런타임은 같은 것이 아닙니다. 그리고 이 스레드 반응에서는 이러한 혼란이 실제로 일어나고 있음을 보여주었습니다: 여러 댓글 작성자들이 GLM이 오픈 소스이기 때문에 ZCode도 오픈 소스라고 가정했습니다. 그렇지 않습니다. 가중치는 오픈되어 있지만, 하네스(harness)는 폐쇄적이며, 이는 Z.ai가 자체 모델을 위해 만든 것이며, 어떤 서드파티 에디터도 따라잡을 수 없는 1차 통합으로 홍보되고 있습니다.
이 이야기는 몇 시간 만에 양국어로 퍼져나갔습니다: ferstar의 게시물은 276,000회의 조회수를 기록했고, FeiZ가 올린 중국어 경고 스레드(“지금은 ZCode를 비활성화하는 것이 좋습니다… 가능한 한 오픈 소스 에이전트를 사용하는 것이 가장 좋습니다”)는 또 다른 63,800회를 끌어모았습니다. 인용된 응답 중 가장 많이 언급된 것은 자신의 AI 에이전트가 보안 문서와 함께 오픈 소스로 공개한 Petri Kuittinen의 의견이었습니다: “제 조언은 언제나 그래왔고 계속될 것입니다. 폐쇄형 소스 AI 하네스는 신뢰하지 마십시오.”
의심스러운 디렉터리를 이야기로 바꾼 세부 사항은 바로 암호화 키입니다. ZCode는 엔벨로프 암호화(envelope encryption)를 사용합니다. 페이로드(payload)는 대칭 키(symmetric key)로 암호화되고, 이 키가 RSA-OAEP 공개 키(public key)로 래핑됩니다. 이 공개 키는 업로드-자격 증명 협상 과정에서 서버에 의해 전달됩니다. 이에 상응하는 개인 키(private key)는 오직 Z.ai의 클라우드에만 존재합니다. ferstar는 로컬 시스템의 모든 개인 키를 사용하여 아카이브를 언래핑하려고 시도했지만 실패했습니다. 사용자의 디스크에 있는 313MB 크기의 암호문(ciphertext)은 사용자 자신이나 ZCode 클라이언트 자체로는 복호화할 수 없습니다.
ferstar가 게시물에서 결론지은 바는 다음과 같습니다: “서버만이 사용할 수 있는 키는 단 하나의 목적을 수행합니다. 바로 서버가 원할 때 언제든지 사용자의 코드를 읽을 수 있도록 보장하는 것입니다.”
무엇이 패킹되는가
패키징 매니페스트(packaging manifest)는 평문으로 로컬에 저장되며, 매우 구체적입니다. 42,411개 파일로 구성된 스냅샷의 경우:
| 콘텐츠 | 크기 | 점유율 |
|---|---|---|
| .git/lfs/ | 196.1 MB | 56.8% |
| .git/objects/ | 102.2 MB | 29.6% |
| .git/logs/ | 0.6 MB | 0.2% |
| 소스 코드 및 문서 | 46.2 MB | 13.4% |
.git 디렉터리만으로도 페이로드의 86.6%를 차지합니다. 이는 git 오브젝트 스토어(object store)가 작업 트리(working tree)의 스냅샷이 아니라, 처음부터 지금까지 저장소의 완전한 계보(lineage)라는 점에서 중요합니다. 나중에 커밋에서 삭제된 API 키도 여기에 포함되어 있습니다. 출시되지 않은 제품 계획을 드러내는 푸시되지 않은 브랜치 이름도 여기에 포함됩니다. .git/config에 있는 내부 호스트 이름 및 리포지토리 경로도 여기에 포함됩니다. 캡처된 아카이브는 사용자가 열어둔 파일들이 아니라, 수년간의 엔지니어링 역사를 담고 있습니다.
클라이언트의 app.asar에서 재구성한 업로드 파이프라인은 다음과 같습니다: 클라이언트는 zcode.z.ai에 자격 증명을 요청하고, 이 서버는 OSS 폼 서명(OSS form signatures), 오브젝트 키(object key), 크기 제한(size cap), 그리고 라운드별 RSA 공개 키를 반환합니다. 클라이언트는 작업 공간을 tar.gz로 패킹하고, AES-256-CTR로 암호화한 후, 대칭 키를 래핑하여 아카이브를 Aliyun OSS에 직접 POST하며, 이 과정에서 Z.ai의 백엔드에 콜백(callback)하여 스냅샷을 등록합니다. 실행 중인 클라이언트는 zcode.z.ai와 지속적인 연결을 유지했습니다.
그리고 테스트 중인 Aliyun OSS 노드 두 개.
토글이 이를 막지 못한다
자연스러운 다음 단계는 설정(settings)을 여는 것이다. ferstar는 UI 스위치를 코드로 교차 확인했다:
- “경험 최적화”(Optimize Experience) (
optimizeAgentExperienceEnabled)는 데이터가 모델 훈련에 승인되는지 여부만 제어한다. 스냅샷 캡처 및 업로드는 계속된다. - “레포 스냅샷 인덱싱”(Repo Snapshot Indexing) (
repoSnapshotIndexingEnabled)은 서버가 업로드된 스냅샷을 인덱싱하는지 여부만 제어한다. 로컬 패키징 및 업로드는 계속된다.
호스트 어셈블리(host assembly)는 사용자 선호도에 대한 게이팅 없이 시작 시 캡처 사이드카(capture sidecar)를 무조건 초기화하며, 유일한 요구 사항은 토큰 제공자(token provider)가 유효한 JWT를 생성할 수 있다는 것이다. 세션 로그에는 단일 활성 세션에서 발생한 62개의 캡처 이벤트가 기록되었으며, 이는 모든 프롬프트 전과 작업 완료 시점에 트리거되었다.
두 번째 출처가 이 메커니즘을 뒷받침한다. OrcaPromptVault는 캡처된 AI 하네스(harness) 프롬프트의 공개 컬렉션으로, ZCode로부터 131KB 크기의 시스템 프롬프트와 31개의 도구 표면(tool surface)을 보유하고 있다. 체크포인트/되감기 기능은 시스템 프롬프트에 연결되어 있으며, “작업 공간 되감기 적용됨. rewindId, checkpointId, strategy, restoredFiles”라는 템플릿이 다섯 번 나타난다. 이것이 스냅샷 파이프라인의 사용자에게 보이는 부분이며, 파일시스템 잠금(filesystem lock) 기능이 비활성화하는 부분이다.
에이전트의 전체 도구 표면에는 스냅샷, 업로드 또는 원격 측정(telemetry) 도구가 전혀 포함되어 있지 않다. 유출(exfiltration) 파이프라인은 에이전트 도구가 아니며, 도구 루프 외부에서 초기화되는 호스트 레벨 사이드카이다. 이것이 아무런 권한 설정도 이를 막지 못하는 이유이며, 에이전트 자체가 결코 이를 볼 수 없는 이유다. 캡처된 지침 131KB 전체에는 Aliyun, OSS, 업로드 또는 개인 정보에 대한 언급이 없다.
캡처는 ferstar가 언급하지 않은 세부 사항을 추가한다: ZCode는 ReadSessionContext라는 도구를 제공하는데, 이 도구는 세션 ID를 통해 다른 영속화된(persisted) ZCode 세션을 필요할 때 읽어온다. 호스트 레벨 스냅샷 사이드카와 결합되어, 세션 콘텐츠는 로컬로 영속화될 뿐만 아니라 클라우드에서도 캡처된다.
개인 정보 보호 정책에는 언급이 없다
ZCode의 개인정보 보호정책에 따르면 이 도구는 '대화 중에 제출된 텍스트, 파일 및 코드'를 수집한다고 명시되어 있는데, 이는 모든 AI 코딩 도구가 하는 표준 추론-컨텍스트 공개입니다. 정책, FAQ, 변경 로그 전반에서 ferstar는 전체 작업 공간과 git 기록을 패키징하고 업로드한다는 언급을 찾지 못했습니다. 가장 근접한 내용은 최적화 프로그램이 기본적으로 비활성화되어 있다는 템플릿 진술에 관한 것입니다.
상황을 악화시키는 컨텍스트
ZCode는 2026년 7월에 출시되었으며, 그 출시는 신뢰를 바탕으로 진행되었습니다. Z.ai는 Anthropic의 Claude Code가 논란이 된 후 몇 주 만에 이 하네스를 공개했으며, 오픈 웨이트(open weights)를 '킬 스위치 문제'로부터 벗어난 대안으로 포지셔닝했습니다. 한 Z.ai 임원에게 X에서 ZCode가 '어떤 종류의 스파이웨어'를 포함할 것인지 묻자, 회사는 ZCode 웹사이트에 나열된 것을 넘어서는 것은 구현하지 않을 것이라고 답변했습니다.
작업 공간 스냅샷팅은 ZCode 웹사이트에 나열되어 있지 않습니다.
Z.ai는 2026년 1월 홍콩 증권거래소에 상장되었습니다. 회사 공식 X 계정은 게시 시점까지 ferstar의 게시물에 응답하지 않았습니다. 가장 눈에 띄는 답변은 ZCode 팀과 관련된 계정에서 나왔는데, '안녕하세요, 발견하게 되어 죄송합니다'라는 내용으로, 이는 반박이라기보다는 메커니즘을 확인해 주는 것처럼 읽힙니다. ferstar의 트윗은 13시간 만에 276,000회의 조회수를 기록했으며, V2EX와 HN 관련 채널의 토론 스레드는 주로 한 가지 선상에서 나뉘었습니다: 에이전트는 동의하에 도구 호출 중에 항상 코드 조각을 업로드한다. 이것은 전체 리포지토리와 그 전체 기록이며, 동의 없이, 오직 벤더만 읽을 수 있도록 암호화된 것입니다.
작동하는 방어책
대기 중인 아카이브를 삭제하는 것은 효과가 없습니다: 클라이언트는 30분 이내에 새로운 313MB 아카이브를 재패키징했고, 재시도 카운터는 증가했습니다. 유효한 해결책은 파일 시스템 수준입니다. 체크포인트 디렉토리를 커널 레벨에서 쓰기 불가능하게 만드세요:
Linux:
rm -rf ~/.zcode/v2/checkpoints
mkdir -p ~/.zcode/v2/checkpoints
sudo chattr +i ~/.zcode/v2/checkpoints
macOS:
trade: 체크포인트 롤백 UI가 작동하지 않게 됩니다. 이 기능은 애초에 코드를 업로드해야만 가능했습니다. 채팅, 자동 완성, 도구 호출은 정상적으로 작동합니다. chattr -i 또는 chflags nouchg로 복원하세요.
로컬 환경에서 이것이 의미하는 바
오픈 웨이트 모델을 로컬에서 실행하는 것이 핵심 주장입니다: 사용자의 모델, 사용자의 하드웨어, 토큰당 비용 없음, 공급업체 중단 위험 없음. ZCode의 이야기는 이 지점을 모델 계층 너머로 날카롭게 만듭니다. 모델 주변의 런타임(하네스, 데스크톱 앱, 업데이트 파이프라인) 역시 신뢰 표면(trust surface)의 일부이며, 클라우드 기반 하네스로 감싸진 로컬 실행 모델은 진정으로 '로컬'이라고 할 수 없습니다.
여기서 두 가지 점검 사항이 도출되며, 이는 ZCode뿐만 아니라 이 분야의 모든 하네스에 적용됩니다: 사용자가 로그인했을 때 런타임이 무엇을 전송하는지, 그리고 누가 저장된 데이터를 복호화할 수 있는지 여부입니다. Tokenstead는 바로 이러한 이유로 에이전트 하네스와 그들의 원격 측정(telemetry) 동작을 추적합니다. Z.ai가 수정 사항, 공개 정보 변경 또는 성명을 발표하면 이 부분이 업데이트될 것입니다.
출처:
AI 자동 생성 콘텐츠
본 콘텐츠는 HN OpenAI Codex의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기