메뉴
HN
Hacker News • 8일 전

ZCode 코딩 에이전트, 사용자 Git 히스토리 몰래 업로드 발각

IMP
9/10
핵심 요약

Z.ai(지푸AI)의 AI 코딩 앱 ZCode가 로그인 상태에서 사용자 워크스페이스 전체(.git 히스토리, LFS 캐시, 설정 파일 포함)를 암호화해 알리바바 클라우드 OSS에 몰래 업로드하는 것으로 밝혀졌습니다. 설정 토글을 꺼도 업로드는 멈추지 않으며, 복호화 키는 Z.ai 서버에만 존재해 사용자 자신도 업로드된 데이터를 열 수 없습니다. GLM 모델 가중치는 오픈이지만 ZCode 런타임은 폐쇄 소스라는 점이 혼란을 일으키고 있습니다.

번역된 본문

2026년 9월 18일, ferstar라는 개발자가 ZCode에 대한 리버스 엔지니어링 분석글을 공개했다. ZCode는 베이징에 본사를 둔 Z.ai의 AI 코딩 데스크톱 앱으로, 이 회사는 GLM 시리즈 오픈 웨이트 모델(GLM-5.3-Flash 포함)을 만든 곳이다. 조사 결과는 여느 프라이버시 스캔들보다 심각하다. 앱이 로그인되어 있으면 전체 워크스페이스 — .git 히스토리 전체, LFS 에셋 캐시, reflog, 전역 앱 설정 — 를 조용히 패키징하고 암호화한 뒤 알리바바 클라우드의 객체 스토리지인 Aliyun OSS에 업로드한다. 연구자 자신의 캡처 결과: 345MB 상용 워크스페이스, 파일 42,411개로부터 만들어진 313MB 암호화 아카이브, 그리고 조사 중 기록된 564회의 업로드 실패 시도. GLM을 로컬로 돌린다 해도, 가중치를 공개한 회사와 개발자가 그 위에서 사용하는 런타임은 별개다. 스레드 반응은 이 혼란이 실재함을 보여줬다. GLM이 오픈소스라서 ZCode도 오픈소스라고 assume한 댓글이 여럿 있었다. 아니다. 가중치는 개방되어 있지만, 하네스(런타임)는 폐쇄 소스이며, Z.ai가 자사 모델을 위해 만든 것으로, 제3자 에디터는 따라올 수 없는 퍼스트파티 통합을 내세운다. 이 소식은 몇 시간 만에 두 언어권으로 퍼졌다. ferstar의 글은 조회수 27만 6천을 넘었고, FeiZ의 중국어 경고 스레드("당분간 ZCode를 비활성화하세요… 가능한 한 오픈소스 에이전트를 쓰는 게 최선입니다")는 6만 3천 800회를 기록했다. 가장 많이 인용된 반응은 자신의 AI 에이전트를 보안 문서와 함께 오픈소스로 공개한 Petri Kuittinen의 것이었다: "내 조언은 변함없이, 폐쇄 소스 AI 하네스를 절대 신뢰하지 마라." 수상한 디렉터리를 하나의 사건으로 만든 결정적 디테일은 바로 암호화 키다. ZCode는 봉투(envelope) 암호화를 사용한다. 페이로드는 대칭키로 암호화되고, 그 대칭키는 RSA-OAEP 공개키로 감싼다(wrap). 공개키는 업로드 자격 증명 협상 중 서버가 전달하며, 대응하는 개인키는 Z.ai 클라우드에만 존재한다. ferstar는 로컬 시스템의 모든 개인키로 아카이브를 복호화하려 했지만 실패했다. 사용자 자신의 디스크에 놓인 313MB 암호문은 사용자도, ZCode 클라이언트 자신조차도 복호화할 수 없다. ferstar의 결론: "서버만 사용할 수 있는 키는 정확히 하나의 목적을 위해 존재한다. 서버가 원할 때 언제든 당신의 코드를 읽을 수 있게 하는 것이다." 무엇이 패키징되는가 패키징 매니페스트는 로컬에 평문으로 저장되며 매우 구체적이다. 파일 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퍼센트다. 토글을 꺼도 멈추지 않는다 자연스러운 대응은 설정을 여는 것이다. ferstar는 UI 스위치를 코드와 대조했다: "경험 최적화(Optimize Experience, optimizeAgentExperienceEnabled)"는 데이터를 모델 학습에 쓸지 여부만 제어한다. 스냅샷 캡처와 업로드는 계속된다. "저장소 스냅샷 인덱싱(Repo Snapshot Indexing, repoSnapshotIndexingEnabled)"은 서버가 업로드된 스냅샷을 인덱싱할지만 제어한다. 로컬 패키징과 업로드는 계속된다. 호스트 어셈블리는 시작 시 사용자 설정과 무관하게 캡처 사이드카를 무조건 구동한다. 유일한 조건은 토큰 제공자가 유효한 JWT를 생성할 수 있다는 것뿐이다. 세션 로그에는 단일 활성 세션에서 62회의 캡처 이벤트가 기록되었으며, 모든 프롬프트 직전과 작업 완료 시마다 트리거되었다. 두 번째 출처도 이 메커니즘을 뒷받침한다. 캡처된 AI 하네스 프롬프트 공개 컬렉션인 OrcaPromptVault에는 ZCode의 131KB 시스템 프롬프트와 31개 도구 목록이 담겨 있다. 체크포인트/되돌리기(rewind) 기능이 시스템 프롬프트에 연동되어 있으며, "Workspace rewind applied. rewindId, checkpointId, strategy, restoredFiles" 템플릿이 다섯 번 나타난다. 이것이 파일시스템 잠금이 비활성화하는 스냅샷 파이프라인의 사용자 측 노출부다. 에이전트의 전체 도구 목록에는 스냅샷, 업로드, 텔레메트리 도구가 단 하나도 없다.

원문 보기
원문 보기 (영어)
On September 18, 2026, a developer going by ferstar published a reverse-engineering walkthrough of ZCode, the AI coding desktop app from Z.ai, the Beijing-headquartered company behind the GLM family of open-weight models - the same models running on local rigs all over the local-AI community, including GLM-5.3-Flash, tracked on this site. The finding reads worse than most privacy scandals: whenever the app is logged in, it silently packages the user’s entire workspace - complete .git history, LFS asset cache, reflogs, and global app configs - encrypts it, and uploads the archive to Aliyun OSS, Alibaba Cloud’s object storage. The researcher’s own capture: a 313MB encrypted archive built from a 345MB commercial workspace, 42,411 files, with 564 failed upload attempts logged while the researcher investigated. If you run GLM locally, the company that publishes the weights is not the same thing as the runtime a developer might use on top of them - and the thread reaction showed the confusion is live: several commenters assumed ZCode was open source because GLM is. It is not. The weights are open; the harness is closed, and it is Z.ai’s harness for its own models, pitched as first-party integration no third-party editor can match. The story spread in both languages within hours: ferstar’s post passed 276,000 views, and FeiZ’s Chinese-language alert thread (“disable ZCode for now… it’s still best to use open-source agents as much as possible”) drew another 63,800. The most quoted response came from Petri Kuittinen, whose own AI agent is open sourced with security documentation: “My advice has been and continues to be: do NOT trust closed source AI harnesses.” The detail that turned a suspicious directory into a story: the encryption key. ZCode uses envelope encryption - the payload is encrypted with a symmetric key, and that key is wrapped with an RSA-OAEP public key. The public key is delivered by the server during upload-credential negotiation. The corresponding private key lives only in Z.ai’s cloud. ferstar attempted to unwrap the archive with every private key on the local system and failed. The 313MB ciphertext sitting on the user’s own disk cannot be decrypted by the user or by the ZCode client itself. ferstar’s conclusion, from the post: “A key that only the server can use serves exactly one purpose: making sure the server can read your code whenever it wants.” What gets packed The packaging manifest is stored locally in plaintext, and it is specific. For a 42,411-file snapshot: Content Size Share .git/lfs/ 196.1 MB 56.8% .git/objects/ 102.2 MB 29.6% .git/logs/ 0.6 MB 0.2% Source code and docs 46.2 MB 13.4% The .git directory alone is 86.6 percent of the payload. The toggles do not stop it The natural move is opening settings. ferstar cross-referenced the UI switches against the code: “Optimize Experience” ( optimizeAgentExperienceEnabled ) only controls whether data is authorized for model training. Snapshot capture and upload continue. “Repo Snapshot Indexing” ( repoSnapshotIndexingEnabled ) only controls whether the server indexes uploaded snapshots. Local packaging and upload continue. The host assembly instantiates the capture sidecar unconditionally at startup, with no gating on user preferences - the only requirement is that the token provider can produce a valid JWT. Session logs showed 62 capture events from a single active session, triggered before every prompt and on task completion. A second source corroborates the mechanism. OrcaPromptVault, a public collection of captured AI harness prompts, holds a 131KB system prompt and a 31-tool surface from ZCode. The checkpoint/rewind feature is wired into the system prompt - the template “Workspace rewind applied. rewindId, checkpointId, strategy, restoredFiles” appears five times. This is the user-facing tip of the snapshot pipeline, the feature the filesystem lock disables. The agent’s complete tool surface contains zero snapshot, upload, or telemetry tools. The exfiltration pipeline is not an agent tool; it is a host-level sidecar instantiated outside the tool loop. That is why no permission setting stops it, and why the agent itself never sees it. Across 131KB of captured instructions there is no mention of Aliyun, OSS, uploads, or privacy. The capture adds a detail ferstar did not mention: ZCode ships a ReadSessionContext tool that reads other persisted ZCode sessions on demand by session ID. Combined with the host-level snapshot sidecar, session content is both locally persisted and cloud-captured. The privacy policy does not mention it ZCode’s privacy policy states the tool collects “text, files, and code submitted during conversations” - the standard inference-context disclosure every AI coding tool makes. Across the policy, FAQ, and changelog, ferstar found no mention of packaging and uploading entire workspaces and git histories. The closest line is a template statement about the optimization program being off by default. The context that makes it worse ZCode launched in July 2026, and its launch pitch ran directly on trust. Z.ai positioned the harness against Anthropic’s Claude Code weeks after the Claude Code hidden-telemetry controversy, with open weights positioned as the escape from the kill-switch problem. A Z.ai executive, asked on X whether ZCode would include “any sort of spyware,” answered that the company would not implement “anything beyond what’s listed” on the ZCode website. Workspace snapshotting is not listed on the ZCode website. Z.ai went public on the Hong Kong Stock Exchange in January 2026. The company’s official X account had not responded to ferstar’s post as of publication. The most visible reply came from an account affiliated with the ZCode team - “hey I am sorry to let you find it” - which reads as confirmation of the mechanism, not a rebuttal of it. ferstar’s tweet passed 276,000 views within 13 hours, and discussion threads on V2EX and HN-adjacent channels split mostly along one line: agents upload code fragments during tool calls all the time, with consent. This is a full repository plus its entire history, without consent, encrypted so only the vendor can read it. The defense that works Deleting the pending archive does not work: the client re-packaged a fresh 313MB archive within half an hour, retry counter incrementing. The fix that holds is filesystem-level. Make the checkpoints directory unwritable at the kernel level: Linux: Copy rm -rf ~/.zcode/v2/checkpoints mkdir -p ~/.zcode/v2/checkpoints sudo chattr +i ~/.zcode/v2/checkpoints macOS: Copy rm -rf ~/.zcode/v2/checkpoints mkdir -p ~/.zcode/v2/checkpoints chflags uchg ~/.zcode/v2/checkpoints The trade: the checkpoint rollback UI stops working - a feature that required uploading your code in the first place. Chat, autocomplete, and tool calls work normally. Restore with chattr -i or chflags nouchg . What it means for local Running open weights locally is the pitch: your model, your hardware, no per-token bill, no vendor switch-off. The ZCode story sharpens the point past the model layer. The runtime around the model - the harness, the desktop app, the update pipeline - is part of the trust surface, and a locally-running model wrapped in a cloud-phoning harness is not local. Two checks follow from this, and they apply to every harness in this space, not only ZCode: what does the runtime transmit when you are logged in, and who can decrypt what it stores. Tokenstead tracks agent harnesses and their telemetry behavior for exactly this reason; this piece will be updated if Z.ai responds with a fix, a disclosure change, or a statement. Sources: Inside ZCode: Silently Uploading Your Entire Git History to the Cloud - ferstar, September 18, 2026 (full forensics: asar reconstruction, encryption flow, manifest breakdown) ferstar on X - the summary thread, 276K views FeiZ on X - Chinese-language alert thread, 63.8K views ZCode releases and changelog - Z.ai official V2EX discussion thread - community response,