Anthropic’s Claude Code ships with a hidden steganographic system that fingerprints developers who route traffic through Chinese AI labs, proxy resellers, or even just sit in the wrong timezone. A security researcher reverse-engineered the binary on 30 June, posted the code on thereallo.dev, and watched it rocket to the top of Hacker News at 605 points. Anthropic has not commented. The community has.
🔍 THE BOTTOM LINE
Claude Code (build 2.1.196) reads the ANTHROPIC_BASE_URL environment variable and silently rewrites the system prompt’s date string with invisible Unicode variations when the host matches a hardcoded list of Chinese corporate domains, AI-lab keywords, or reseller gateways. The list is XOR-obfuscated with key 91. It is the most aggressive hidden behaviour the security community has documented in a mainstream coding agent, and the choice to hide it is the part people are angry about, not the underlying goal.
How the Fingerprint Works
The trigger is the ANTHROPIC_BASE_URL environment variable. If unset, the function returns early. If it points at the official api.anthropic.com, it returns early. Otherwise the code parses the hostname, runs it against two arrays decoded from base64-with-XOR — a domain list and a keyword list — and checks whether the system timezone is Asia/Shanghai or Asia/Urumqi.
The output is encoded into a single line that reads to the user as Today's date is 2026-06-30.. A clean install produces a straight apostrophe and a - separator. A hostname matching a known Chinese domain swaps the apostrophe for \u2019 (a curly quote that renders identically in most monospaced fonts). A hostname containing a lab keyword like deepseek, moonshot, zhipu, dashscope, or 01ai swaps it for \u02BC. A timezone match flips the separator from - to /. A request that hits multiple signals gets a fourth invisible variant. The model and the user see a normal date. Anthropic’s backend, if it chooses to look, sees a four-bit classification in punctuation no human is going to inspect.
The decoded domain list, published in full by the researcher, runs to over 25 entries: baidu.com, alibaba-inc.com, alipay.com, antgroup-inc.cn, bytedance.net, kuaishou.com, xiaohongshu.com, jd.com, bilibili.co, iflytek.com, stepfun-inc.com, moonshot.ai — alongside a separate cluster of reseller and gateway domains: anyrouter.top, claude-code-hub.app, claude-opus.top, openclaude.me, proxyai.com, yunwu.ai, zenmux.ai. The keyword list is the giveaway that distillation is the target: deepseek,moonshot,minimax,xaminim,zhipu,bigmodel,baichuan,stepfun,01ai,dashscope,volces reads like a who’s-who of the labs Anthropic’s commercial team watches most closely.
The researcher’s own assessment is worth quoting: “This is not a malicious feature, but it is a weird choice for a developer tool that asks for trust.” And on the practical asymmetry: “The bypass is also trivial. Change hostname, change timezone, patch the binary, wrap the process. So the feature mostly punishes the exact people who are easier to fingerprint: normal developers doing weird but legitimate things.”
Why Anthropic Built It, and Why That Is Not the Real Scandal
The legitimate goal is obvious. Chinese AI labs have been distilling Western frontier models for years, and proxy resellers route Claude access to customers who cannot buy it directly because of US export controls that have now escalated to API-level restrictions. Anthropic has every commercial incentive to detect both classes of user. Some HN commenters agreed: distillation defence is fair.
But the execution is the issue, and it has nothing to do with whether you think IP protection is valid. The system prompt is the contract between the user and the model. Anthropic shipped a hidden classifier that mutates the prompt, encoded its trigger list with XOR-91, and put zero of this in release notes. The researcher found it by accident, looking at the binary for unrelated privacy reasons. That is the pattern of an organisation that has decided user trust is not a constraint on what it ships.
It also lands on top of a documented history. We have covered the Anthropic Quietly Turned Down Claude incident, the Anthropic Leaked 512,000 Lines of Claude Code — Here that exposed internal build artefacts, and the A Single GitHub Issue Could Have Compromised Every Claude Code User — Here. Steganographic prompt injection is the fourth entry in a pattern, not a one-off.
The Community Reaction
The HN thread, at 605 points and 190 comments, split cleanly. One camp — including several self-identified ML engineers — said the technique is normal and that anyone who runs a closed-source binary deserves what they get. The other, larger and angrier, pointed out that the same logic applies to a closed-source coding agent with full filesystem and shell access on developer laptops. “The more I learn about Anthropic the more they disgust me,” wrote one commenter with several hundred upvotes. Another noted that Codex CLI, the OpenAI equivalent, is fully open source — a feature Anthropic could trivially match if it cared to. It has not.
The sharpest critique is the asymmetry: Anthropic has shipped a steganographic classifier that only catches unsophisticated users, while anyone with a real motive can patch the binary in five minutes. This is a security control that operates entirely on the people it should not be operating on, which is the worst category of security control.
❓ FAQ
Is this confirmed, or one researcher’s reading of obfuscated code? Reproducible. The researcher published the deminified function chain and the decoded domain list. The mechanism (XOR-91, base64, host-keyword matching) is verifiable from the binary. What Anthropic’s backend does with the marker once it arrives is unconfirmed — Anthropic has not responded.
Does this affect me if I use Claude Code normally?
No. The trigger returns early when ANTHROPIC_BASE_URL is unset or points at api.anthropic.com. The prompt is only mutated when you route traffic through a custom endpoint.
Could Anthropic use this to silently downgrade my model? No evidence of that. The marker is a signal, not a switch — it classifies which bucket a request belongs to, but enforcement is a separate question. That said, the same architecture that ships a hidden classifier today can ship a hidden throttle tomorrow, which is why the community reaction is calibrated to the capability rather than the current behaviour.
What should I do about it? If you run Claude Code through a custom gateway, be aware that the hostname is now a signal Anthropic receives on every request. Treat the binary like any other untrusted dependency: read release notes, audit the diff, and weigh the open-source alternatives.
🔍 THE BOTTOM LINE
Anthropic probably had a legitimate reason to detect API resellers and distillation pipelines, and the technique — a steganographic date string keyed off hostname and timezone — is technically clever. It is also exactly the wrong move for a developer tool that asks users to grant it filesystem and shell access on the strength of a brand promise. Trust is earned in the boring parts. Hiding a four-bit classifier in invisible Unicode apostrophes, behind XOR and base64, in a binary that nobody was supposed to read closely, is the opposite of boring. It is the choice you make when you have decided your users are adversaries. They will notice, and they have.