Home / Blog / Claude Steganography
ENGINEERING BLOG · 2026.07.03

Is Claude Code Spyware?
Inside Anthropic's Hidden Unicode Fingerprint

If you use Claude Code or route Anthropic API traffic through a proxy, you may be asking: is Claude tracking me? Short answer: in late June 2026, according to reverse-engineering reports, Claude Code (not the Claude web app) quietly rewrote the Today's date is... line in its system prompt when ANTHROPIC_BASE_URL pointed anywhere other than api.anthropic.com. By swapping date separators and visually identical Unicode apostrophes, it encoded timezone and China-linked domain/lab signals into every request. Anthropic removed the code in version 2.1.197. The likely goal was anti-distillation; the problem was the method: invisible, obfuscated, and undisclosed. This is separate from the April Claude Desktop browser-injection story.

01

This blew up as two distinct stories stacked together. Conflating them will get you called out on HN, Reddit, and in security circles — and it hurts E-E-A-T.

Incident A (silent browser injection) vs Incident B (system-prompt steganography)
Dimension Incident A: silent browser injection Incident B: prompt steganography
Product Claude Desktop (macOS client) Claude Code (CLI coding tool)
Disclosure Alexander Hanff (privacy consultant, The Register contributor) Developer reverse-engineered binary; published on thereallo.dev; Reddit → HN
Timeline April 2026 (~Apr 18 onward) June 30, 2026
Core behavior Silently writes Native Messaging manifest com.anthropic.claude_browser_extension.json into Chrome/Edge/Brave/Arc/etc., pre-authorizing 3 extension IDs to call sandbox-external chrome-native-host; creates dirs even if browser not installed; file regenerates after deletion When ANTHROPIC_BASE_URL ≠ api.anthropic.com, rewrites Today's date is... via steganography
Labels applied "spyware" / "backdoor" "prompt steganography" / "covert channel"
Trigger Install/start Claude Desktop Non-official Base URL only; not every conversation
Anthropic response No formal public response; later added consent toggle; underlying permission model reportedly not fully removed Acknowledged code; removed in 2.1.197 (Jul 1); changelog silent
  • Incident A validation: Independent consultant Noah Kenney (Digital 520) confirmed Hanff's claims are reproducible; Antiy Labs published a dedicated risk analysis.
  • Incident B version coverage: Reverse engineers confirmed 2.1.193, 2.1.195, and 2.1.196; HN thread hit front page with 350+ points and 100+ comments.
  • Developer trust crisis: When desktop AI agents and CLI tools get system-level access, undisclosed, deliberately hidden behavior crosses a line regardless of intent.
  • Model stack context: Anthropic still matters on routing platforms — see our June OpenRouter rankings analysis — but "good API" and "trustworthy tool" are now separate questions.

We use "according to reports," "alleged," and "reverse-engineering findings" throughout. Anthropic's anti-distillation goal and method must be evaluated separately.

02

Key precondition: this only triggers when ANTHROPIC_BASE_URL points somewhere other than api.anthropic.com (proxy, gateway, reseller, OpenAI-compatible layer). Official endpoint users are unaffected. Standard Claude web users are not in scope for Incident B.

When triggered, two signals hide inside the innocent Today's date is ... line:

  1. Date separator: if system timezone is Asia/Shanghai or Asia/Urumqi, 2026-06-30 becomes 2026/06/30.
  2. Apostrophe swap: the apostrophe in Today's becomes a look-alike Unicode variant encoding what matched.
Claude Code system prompt Unicode fingerprint mapping (per thereallo.dev reverse engineering)
Detected condition Date format Apostrophe Unicode
Default (no domain/lab match) 2026-06-30 ' ASCII apostrophe U+0027
China-linked org/reseller domain 2026-06-30 ' right single quote U+2019
AI lab keyword (deepseek, moonshot, zhipu, minimax, baichuan, stepfun, 01ai…) 2026-06-30 ʼ modifier letter apostrophe U+02BC
Both domain and lab 2026-06-30 ʹ modifier letter prime U+02B9
+ China timezone (Asia/Shanghai / Asia/Urumqi) 2026/06/30 (apostrophe rules as above)

In plain terms: the prompt looks ordinary to humans. Anthropic's backend scans one apostrophe's code point and learns: this user routes through a VPN but runs a China timezone — possibly a Chinese AI lab. Domain/keyword lists are lightly obfuscated with base64 + XOR (key 91) — roughly 147 domain patterns. This is textbook covert channel / prompt steganography.

check-apostrophe.sh
# Inspect Unicode code points in Today's apostrophe
echo "Today's date is 2026-06-30" | xxd | grep -A1 "Today"

python3 -c "s=\"Today\u2019s\"; print([hex(ord(c)) for c in s if c in \"'\u2019\u02bc\u02b9\"])"

03

Community consensus is measured: this was almost certainly anti-distillation and anti-unauthorized reselling. Anthropic, OpenAI, and Google have all publicly worried about competitors harvesting API outputs to train smaller models. China-linked resellers, proxies, and labs were prime suspects.

Intent is defensible; method is not. Turning classification into invisible punctuation, obfuscating it in the binary, and shipping it on every request — inside a developer tool that lives on trust — crosses a line. Hacker News split hard:

  • "Reasonable anti-distillation defense": API reselling and distillation are real threats; vendors may protect models.
  • "Malware-adjacent for a dev tool": hidden, obfuscated, undisclosed — users should not need to reverse-engineer a binary to learn this.

"Spyware" is a loaded word. More precisely:

  • Incident A is closer to unauthorized tampering with third-party software + a dormant, pre-positioned attack surface. Even unexploited, it pre-installs a high-privilege channel outside the browser sandbox. Anthropic's own Claude for Chrome numbers: prompt-injection success 23.6% unmitigated, 11.2% mitigated.
  • Incident B is closer to undisclosed telemetry / covert user classification — not classic data-stealing malware, but an undisclosed covert channel.

Whatever label you use, the core issue is the same: no informed consent, deliberately hidden.

04

  1. Check ANTHROPIC_BASE_URL: run echo $ANTHROPIC_BASE_URL in your shell or .env. Empty or api.anthropic.com means Incident B logic does not trigger; proxy users should investigate.
  2. Upgrade Claude Code to 2.1.197+: Anthropic shipped this build on July 1, 2026 with the steganography removed (changelog did not mention it — verify your binary).
  3. Inspect macOS Native Messaging manifests (Incident A): look under ~/Library/Application Support/<browser>/NativeMessagingHosts/com.anthropic.claude_browser_extension.json for Chrome, Edge, Brave, Arc, Vivaldi, Opera, Chromium.
  4. Delete and watch for regeneration: remove the JSON, restart Claude Desktop, and see if it comes back. Later builds added a consent toggle; underlying model reportedly persists.
  5. Verify timezone and residual fingerprints: confirm whether Asia/Shanghai / Asia/Urumqi affects date separators; on older Claude Code builds, hex-dump the system prompt apostrophe.
  6. Enterprise least-privilege review: treat Claude Desktop / Claude Code as high-privilege programs — explicit authorization, network isolation, auditable logs; decide whether desktop agents belong in production paths.
  7. Track official and community updates: subscribe to Anthropic changelogs; require resellers to disclose Base URL routing and compliance statements.

05

Cite-ready data (from public reverse engineering and community discussion — re-verify before publishing):

  • Rule set size: base64 + XOR(91) obfuscation, ~147 domain/keyword patterns
  • Affected builds: 2.1.193 / 2.1.195 / 2.1.196 confirmed; removed in 2.1.197
  • HN traction: front page within hours, 350+ points, 100+ comments, community split
  • Claude for Chrome prompt injection: 23.6% unmitigated, 11.2% mitigated (Anthropic-disclosed, relevant to Incident A attack surface)
  • Native Messaging pre-auth: 3 extension IDs can call sandbox-external chrome-native-host; directories created even when browser not installed
Is Claude Code spyware?

Not in the classic sense, but it embedded an undisclosed, obfuscated fingerprint in system prompts to flag China-linked proxy users. Anthropic removed it in 2.1.197. Best described as an undisclosed covert channel, not data-stealing malware.

Does Claude Code track my timezone?

Reports say it checked Asia/Shanghai / Asia/Urumqi — but only with a non-default ANTHROPIC_BASE_URL. Official endpoint users were untouched.

What is the apostrophe / Unicode trick?

The apostrophe in "Today's" swapped among U+0027, U+2019, U+02BC, and U+02B9 to encode China-linked domains, AI-lab keywords, both, or neither.

Why did Anthropic add this?

Most likely to detect model distillation and unauthorized API reselling — a legitimate goal implemented in an illegitimately hidden way.

Is this the same as the Claude Desktop spyware story?

No. That was a separate April 2026 issue about Claude Desktop silently writing browser Native Messaging manifests, disclosed by Alexander Hanff to The Register.

Are standard Claude web users affected?

Incident B only affects Claude Code with a non-official ANTHROPIC_BASE_URL. Standard official-endpoint users are not impacted.

How do I remove Claude Desktop browser injection files?

Delete com.anthropic.claude_browser_extension.json under ~/Library/Application Support/<browser>/NativeMessagingHosts/. Claude Desktop may recreate it on restart.

Should you trust Anthropic after this?

Trust should rest on reproducible, auditable, switchable-off behavior — not secrets you only find by reverse-engineering a binary. Vendors can fight distillation in the open with documentation and toggles.

The real lesson is not "an apostrophe." When model capability races ahead while security boundaries, consent, and auditability lag, vendors keep crossing trust lines in the name of UX or abuse prevention. Practical responses:

  • Default to distrust; demand evidence. Reproducible, auditable, and switchable-off is the bar.
  • Disclosure over concealment. Fight distillation in the open — document it, ship a toggle — not bury it in punctuation.
  • Least privilege + isolation for every desktop agent.
  • Vote with your feet, and back it with regulation. GDPR-style law and market choice are the ultimate check.

Technology can be neutral; a company cannot. The more capable the model, the more the vendor must constrain itself — and that should not be a secret you only find by reverse-engineering a binary.

Primary reverse engineering and authoritative reporting (re-verify links):

thereallo.dev: Claude Code Prompt Steganography (original RE)

The Register: Claude Desktop changes software permissions without consent

Third-party analysis and security research:

Malwarebytes: Claude Desktop Native Messaging coverage

Antiy Labs: Claude Desktop high-privilege browser channel risk analysis

Hacker News: Claude Code steganography discussion

When AI coding agents must run 7×24 in auditable, isolated production environments, shared-VM hypervisor overhead and uncontrollable system-level injection create compliance and stability risk alongside model quality. For teams needing zero-loss native compute, stable iOS CI/CD, and 7×24 AI Agent automation, ZUKCLOUD bare-metal Mac mini cloud nodes are usually the better fit: dedicated Apple Silicon hardware, no hypervisor tax, always-on, flexible daily/weekly/monthly billing. Our bare-metal architecture manifesto argues from UMA zero-copy and MDM orchestration that running agents inside physical boundaries you fully control is one of the most practical engineering responses to opaque desktop tool overreach.