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

If you use Claude Code or Claude Desktop, the June 2026 prompt steganography disclosure and April's silent browser injection are two separate incidents—the former rewrites Unicode apostrophes in Today's date when you route through a proxy; the latter pre-writes Native Messaging manifests on macOS. Per reverse-engineering reports, Anthropic removed the steganography code in 2.1.197; the likely goal was anti-distillation, but the method was covert and undisclosed. This post covers the Incident A/B matrix, Unicode mapping table, HN debate, six-step checklist, and FAQ. Node options on the pricing page.

Bottom line: On June 30, 2026, per the thereallo.dev reverse-engineering report, Claude Code (the CLI coding tool—not the 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 switching the date separator (- vs /) and swapping the apostrophe for visually identical Unicode variants (U+0027 / U+2019 / U+02BC / U+02B9), it encoded whether you were in a China timezone and whether your endpoint matched China-linked domains or AI-lab keywords. That is a textbook covert channel. Anthropic shipped 2.1.197 on July 1, 2026 to remove the code—the changelog did not mention it.

  • Two stories, often conflated: Desktop browser injection (Hanff, April) and Code prompt steganography (June RE) involve different products, triggers, and mechanics—conflating them hurts E-E-A-T.
  • Not everyone was affected: Incident B only activated with a non-official Base URL; official endpoint users saw no changes.
  • Intent vs method: Community consensus points to anti-distillation/reselling defense—defensible intent, indefensible concealment.
  • HN split: Thread hit front page within hours—350+ points—"reasonable anti-distillation" vs "malware-adjacent for a dev tool."
  • Legal tone: We use "alleged," "per reports," and "reverse-engineering found"—vendor intent is not stated as proven fact.

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)
Source Alexander Hanff (privacy consultant, The Register contributor) Developer RE published on thereallo.dev, amplified via Reddit → HN
Date April 2026 (~Apr 18 onward) June 30, 2026
Behavior Silently writes com.anthropic.claude_browser_extension.json into Chrome/Edge/Brave/Arc/Vivaldi/Opera/Chromium, 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 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 builds added consent toggle; underlying permission model not fully removed Admitted code existed; removed in 2.1.197 (Jul 1); changelog silent

For Incident A, independent consultant Noah Kenney (Digital 520) confirmed Hanff's claims were reproducible; Antiy Labs published a dedicated risk analysis. For Incident B, RE confirmed versions 2.1.193 / 2.1.195 / 2.1.196 all contained the logic.

Precondition: only triggers when ANTHROPIC_BASE_URL points somewhere other than api.anthropic.com (proxy, gateway, reseller, OpenAI-compatible layer). Official endpoint: no alteration.

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

  1. Date separator: if 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 character encoding what matched.
Claude Code system prompt Unicode fingerprint mapping (per thereallo.dev RE report)
Detected condition Date format Apostrophe Unicode
Default (no 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 2026/06/30 (apostrophe rules as above)

Per the RE report, domain/keyword lists use base64 + XOR (key 91) obfuscation—roughly 147 domain patterns. To a human the prompt looks ordinary; to Anthropic's backend, one apostrophe's code point reveals: VPN user, China timezone, possibly a Chinese AI lab.

check-base-url.sh
# Check non-official endpoint (Incident B precondition)
echo "$ANTHROPIC_BASE_URL"
# Non-empty and not https://api.anthropic.com may have triggered fingerprint logic
claude --version
# Confirm version >= 2.1.197 (steganography removed)

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

Intent may be 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.

On Hacker News the thread split hard: "reasonable anti-distillation defense" vs "malware-adjacent behavior for a dev tool." Mainstream read: goal was detecting unauthorized reselling + distillation, not personal surveillance—the fight is over means (covert, obfuscated, undisclosed).

"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—and Anthropic's own numbers put Claude for Chrome prompt-injection success at 23.6% (unmitigated) / 11.2% (mitigated).
  • Incident B is closer to undisclosed telemetry / covert user classification—not classic exfiltration malware, but an undisclosed covert channel.

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

  1. Check Base URL: run echo $ANTHROPIC_BASE_URL; non-official proxies may have triggered Incident B; production should prefer api.anthropic.com or audited enterprise gateways.
  2. Upgrade Claude Code: ensure version ≥ 2.1.197 (July 1, 2026—public reports say steganography removed).
  3. Scan Native Messaging manifests (Incident A): on macOS check ~/Library/Application Support/<browser>/NativeMessagingHosts/com.anthropic.claude_browser_extension.json across Chrome, Edge, Brave, Arc, Vivaldi, Opera.
  4. Delete and watch for regeneration: remove the JSON, restart Claude Desktop, log whether it recreates—evidence of whether the permission model was truly fixed.
  5. Audit timezone + proxy combo: VPN plus China timezone (Asia/Shanghai / Asia/Urumqi) on old Claude Code + non-official Base URL formed a full fingerprint vector.
  6. Enterprise / sensitive environments: treat desktop agents as high-privilege software—least privilege, explicit authorization, auditable behavior; host agents on isolated 24/7 servers, not personal laptops.

The real lesson is not "an apostrophe." When model capability races ahead while security boundaries, consent, and auditability lag, vendors keep crossing the trust boundary in the name of "UX" or "abuse prevention." Early PC and smartphone security mistakes are replaying on desktop AI agents.

Cite-ready technical facts (June–July 2026, per public reports and RE):

  • Rule set size: base64 + XOR(91) obfuscation, ~147 domain/keyword patterns.
  • Affected versions: Claude Code 2.1.193 / 2.1.195 / 2.1.196 contained logic; 2.1.197 removed it.
  • HN traction: front page within hours, 350+ points, 100+ comments.
  • Claude for Chrome injection success (Anthropic disclosed): 23.6% unmitigated, 11.2% mitigated.

What we can actually do:

  1. Default to distrust; demand evidence. Reproducible, auditable, switchable-off is the bar.
  2. Disclosure over concealment. Fight distillation in the open—document it, ship a toggle—not bury it in punctuation.
  3. Least privilege + isolation for every desktop agent.
  4. Vote with your feet, 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.

Q: Is Claude Code spyware?
Not in the classic sense, but RE found an undisclosed, obfuscated fingerprint; Anthropic removed it in 2.1.197. Best labeled an undisclosed covert channel.

Q: Does Claude Code track my timezone?
Per RE, it checked Asia/Shanghai / Asia/Urumqi only with non-default ANTHROPIC_BASE_URL; official endpoint users were untouched.

Q: What is the apostrophe / Unicode trick?
The apostrophe in "Today's" switched among U+0027, U+2019, U+02BC, and U+02B9 to encode China-linked domain hits, AI-lab keywords, both, or neither.

Q: Why did Anthropic add this?
Most likely anti-distillation and unauthorized reselling—legitimate goal, illegitimate implementation and disclosure.

Q: Same as Claude Desktop spyware?
No—April Desktop Native Messaging is Incident A; June Code steganography is Incident B.

Q: Are web Claude users affected?
Incident B only affected Claude Code with non-official ANTHROPIC_BASE_URL.

Q: How to remove Claude Desktop browser injection?
Delete com.anthropic.claude_browser_extension.json under ~/Library/Application Support/<browser>/NativeMessagingHosts/; Claude Desktop may recreate it.

Q: Why keep Incidents A and B separate?
Conflating them produces factual errors that HN, Reddit, and security readers spot instantly—hurting E-E-A-T and SEO credibility.

Primary references—re-check links after upstream updates:

thereallo.dev: Claude Code prompt steganography (original RE report)

The Register: Claude Desktop changes software permissions without consent (Apr 2026)

Hacker News: Claude Code steganography discussion

Running Claude Code long sessions, MCP toolchains, and multi-model routing on a sleeping laptop lets interrupted jobs, OAuth expiry, and Native Messaging regeneration eat your audit work. Local-only checks help, but lack a predictable 24/7 host; moving agents to isolated cloud Macs needs stable Apple Silicon and SSH.

If you need 24/7 agent hosting, stable SSH, and predictable Apple Silicon capacity, moving Claude Code scheduled jobs, MCP configs, and multi-vendor fallbacks to dedicated bare-metal servers beats firefighting on an unreliable laptop: NOVAKVM offers multi-region Mac Mini M4 / M4 Pro flexible terms, fixed bandwidth, default SSH—ideal for iOS CI/CD and AI agent automation on one machine. See the pricing page, order page, and help center.