Claude Code скрыто маркирует запросы: что нашёл Саймон Уиллисон
Саймон Уиллисон — один из самых известных исследователей AI-инструментов и автор блога Simon Willison's AI Newsletter. Когда он публикует разбор с заголовком о стеганографии, индустрия прислушивается. Его находка в Claude Code версии 2.1.196 — пример того, как разработчики, доверяющие AI-агентам доступ к файлам и shell-командам, сталкиваются с поведением, которое сложно назвать прозрачным.
Что такое стеганографическая маркировка в Claude Code
Уиллисон изучал локальную установку Claude Code из соображений приватности. Стандартная ситуация: разработчики дают AI-агенту доступ к файловой системе, shell, git и браузеру. Это весь смысл инструмента — без контекста о проекте агент бесполезен. Но если бинарник получает такие права, он сам заслуживает внимания и аудита.
Внутри бинарника Claude Code он нашёл функцию, которая модифицирует строку текущей даты в системном промпте. Функция делает две вещи: меняет апостроф в слове "Today's" и заменяет разделитель даты с минуса на слэш.
Нормальный формат даты выглядит так: Today's date is 2026-07-01. После модификации — Today's date is 2026/07/01. Апостроф тоже меняется на визуально неотличимый Unicode-символ. Эти изменения не видны глазу в моноширинном шрифте, но кодируют информацию, которая передаётся на сервер.
Техническая реализация: как кодируется маркер
Маркировка основана на использовании Unicode-символов, которые визуально идентичны стандартным ASCII-эквивалентам. В Claude Code реализована таблица замены апострофа в зависимости от типа API-эндпоинта:
Обычный API-эндпоинт сохраняет стандартный апостроф ('). Для известного домена из внутреннего списка Anthropic используется \u2019 — так называемый "right single quotation mark". Для домена, содержащего ключевые слова AI-лабораторий, применяется \u02BC — modifier letter apostrophe. Комбинация обоих условий даёт \u02B9 — modifier letter registry.
Разница между символами визуально незаметна — на экране все три выглядят как обычный апостроф. Но при передаче по сети и парсинге на сервере каждый символ имеет уникальный код точки Unicode, что позволяет восстановить исходную классификацию.
Триггеры и условия срабатывания
Маркировка активна не всегда. Функция проверяет три условия, и все три должны быть истинны одновременно:
Первое — переменная ANTHROPIC_BASE_URL должна быть установлена. Это environment variable, который пользователь или компания переопределяет для маршрутизации через внутренний шлюз, прокси или ресейлера. Без этой переменной функция возвращает управление раньше и дата остаётся нетронутой.
Второе — timezone системы должна быть Asia/Shanghai или Asia/Urumqi. Это географический триггер, указывающий на китайский регион. timezone проверяется через стандартный системный вызов.
Третье — hostname API-эндпоинта должен содержать ключевые слова AI-лабораторий или совпадать со списком известных доменов из внутренней базы.
Список ключевых слов и доменов хранится в бинарнике в зашифрованном виде — base64 + XOR с ключом 91. Расшифрованный список ключевых слов включает названия AI-компаний и китайских корпораций. Список доменов гораздо длиннее и охватывает китайские корпоративные домены, AI-компании и домены proxy-серверов, ресейлеров и шлюзов.
Зачем это нужно Anthropic
Маркированный промпт отправляется в API, где, вероятно, парсится на стороне Anthropic. Цель — выявление неавторизованных API-ресейлеров, шлюзов и пайплайнов так называемой "дистилляции модели".
Это имеет смысл с точки зрения бизнеса и безопасности. Если кто-то перепродаёт доступ к Claude API через кастомный шлюз с наценкой — это нарушение условий использования. Если кто-то использует Claude для обучения конкурирующей модели — это угроза интеллектуальной собственности. Anthropic хочет отслеживать такие случаи, и стеганографическая маркировка позволяет делать это без явного телеметри-поля, которое пользователь мог бы увидеть и отключить.
Но реализация вызывает вопросы.
Почему это проблема для доверия
AI-агенты для разработки оперируют на грани допустимого. Они читают репозитории, могут случайно светить секреты, запускать команды, устанавливать пакеты, редактировать файлы и пушить коммиты. Разработчики принимают этот риск, потому что выигрыш в продуктивности перевешивает.
Доверие к таким инструментам строится на предсказуемом, скучном поведении. Если клиент хочет детектировать кастомные API-шлюзы — есть прямые способы. Можно отправить явное телеметри-поле с документацией. Можно указать поведение в release notes. Можно сделать политику видимой в исходном коде или хотя бы в public documentation.
Встраивание битов классификации в невидимую пунктуацию системного промпта — это не такой способ. Это создаёт прецедент: инструмент с доступом к файловой системе и shell скрывает свою логику от пользователя. Каждый раз, когда пользователь видит невидимый маркер в данных, которые он передаёт, это подрывает базовое предположение о том, что клиент делает то, что заявлено.
Кого это затрагивает
Для большинства пользователей этот путь неактивен. Если используется официальный API-эндпоинт Anthropic напрямую, функция маркировки возвращает управление раньше и дата остаётся неизменённой. Если ANTHROPIC_BASE_URL не установлен — тоже.
Затронуты те, кто маршрутизирует Claude Code через кастомный base URL. Это распространённые сценарии: внутренние корпоративные шлюзы для логирования и контроля доступа, локальные прокси-серверы для экспериментов, роутеры моделей от ресейлеров, исследовательские окружения с кастомными инсталляциями. Именно эти случаи — легитимные и часто встречающиеся в enterprise и research-контекстах.
Обход маркировки тривиален: сменить hostname, изменить timezone, пропатчить бинарник, обернуть процесс в дополнительный слой абстракции. Любой серьёзный противник сделает сигнал бесполезным. В итоге функция в первую очередь наказывает тех, кого проще всего фингерпринтить — обычных разработчиков, использующих легитимные, но нестандартные конфигурации.
Как это выглядит в коде
Уиллисон опубликовал очищенную версию кода из minified-бандла. Функция принимает текущую дату в формате YYYY-MM-DD и модифицирует её в зависимости от контекста. Домен и keyword-списки расшифровываются из base64 XOR с константой 91 в runtime.
Бинарник подписан Anthropic — это подтверждает, что код поставляется официально, а не является инъекцией третьей стороны. Но сам факт наличия стеганографического кода в официальном бинарнике — именно то, что стоит обсуждать.
Контекст: почему это важно именно сейчас
Claude Code — не просто ещё один CLI-инструмент. Это агент с глубоким доступом к системе. В версии 2.1.196 он включает возможности computer use: может управлять браузером, запускать терминальные команды, читать и писать файлы, работать с git. Для многих разработчиков это рабочий инструмент, через который идёт значительная часть рабочего процесса.
В такой модели доверие к клиенту критично. Разработчик запускает бинарник, который делает HTTP-запросы к API, но при этом имеет полный доступ к локальной файловой системе. Если клиентское приложение скрыто модифицирует данные — это принципиально другая модель угрозы, чем просто отправка запросов.
Уиллисон специально подчёркивает: он не обвиняет Anthropic в злом умысле. Он указывает на то, что реализация создаёт прецедент, который трудно оправдать необходимостью. Если защита от ресейлеров — легитимная цель, способ её достижения должен быть публичным и проверяемым.
Что известно о списках доменов
Расшифрованные списки доменов и ключевых слов дают представление о том, какие сценарии Anthropic считает приоритетными для отслеживания. Ключевые слова AI-лабораторий — это названия компаний и моделей, которые используются для идентификации. Китайские корпоративные домены覆盖面 — китайские технологические компании, которые могут перепродавать или маршрутизировать доступ к Claude.
Список proxy и reseller доменов особенно интересен: он показывает, насколько детальную картину Anthropic пытается построить. Не просто "используется ли ресейлер", а "какой именно ресейлер и откуда".
Важно отметить: Уиллисон нашёл только то, что доступно в текущей версии бинарника. Списки могут обновляться с каждой новой версией клиента без изменения в release notes.
Часто задаваемые вопросы
Может ли Anthropic видеть мой внутренний API-шлюз?
Да, если вы используете кастомный ANTHROPIC_BASE_URL и ваша система настроена на китайскую timezone. Маркер встраивается в системный промпт и отправляется с каждым запросом. На сервере Anthropic маркер парсится и классифицирует ваш эндпоинт. Но расшифровка работает только на стороне Anthropic — они видят сам маркер, но не вашу внутреннюю инфраструктуру напрямую. Если ваш hostname не содержит ключевых слов AI-лабораторий и не входит в список известных доменов, маркер будет минимальным.
Это вредоносное поведение?
Уиллисон не квалифицирует находку как вредоносную — скорее как неудачное инженерное решение с хорошими намерениями. Цель маркировки — защита от злоупотреблений API и дистилляции. Но способ реализации — скрытая стеганография в клиентском инструменте с системными правами — подрывает доверие, которое критически важно для такого класса инструментов.
Как проверить, активна ли маркировка у меня?
Проверить просто: если ANTHROPIC_BASE_URL не установлен и timezone не китайская — функция возвращает управление раньше и промпт остаётся нетронутым. Если используется кастомный шлюз, можно посмотреть raw-логи отправляемых запросов и поискать необычные Unicode-символы вокруг даты в системном промпте.
Почему именно Chinese timezone?
Наиболее вероятная причина — фокус на китайские AI-компании и шлюзы, которые перепродают доступ к Claude API внутри Китая. Китайский рынок AI — один из крупнейших, и регуляторное давление на иностранные AI-сервисы создаёт естественный спрос на обходные маршруты. Anthropic, вероятно, хочет отслеживать масштаб такого использования, чтобы понимать, какая доля трафика идёт через неавторизованные каналы.
Можно ли использовать Claude Code безопасно?
Для большинства пользователей — да. Если вы используете официальный API-эндпоинт Anthropic без переопределения base URL, функция маркировки неактивна. Ваш промпт передаётся без модификации, и никакой стеганографии не происходит. Проблема актуальна только для enterprise-пользователей с внутренними шлюзами и API-роутерами.
Будет ли Anthropic это комментировать?
Уиллисон опубликовал находку открыто, и она получила значительный отклик в community. Обычно в таких случаях компании либо подтверждают практику с объяснением логики, либо вносят изменения в следующих версиях. Для пользователей это означает: следите за release notes в будущих версиях Claude Code.
Итог
Стеганографическая маркировка в Claude Code — это не баг и не бэкдор в классическом смысле. Это осознанное инженерное решение, которое решает бизнес-задачу Anthropic — защиту от неавторизованного использования API — но делает это через скрытое изменение пользовательских данных.
Для инструмента, который просит полный доступ к машине разработчика, это создаёт важный прецедент. Trust is earned in the boring parts — доверие зарабатывается скучным, предсказуемым поведением. Скрытая маркировка — это не скучно. Это именно тот случай, когда реакция сообщества имеет значение: чем больше внимания получает эта находка, тем вероятнее, что Anthropic пересмотрит подход к прозрачности в будущих версиях.
Для пользователей, которых это затрагивает, выход простой: сменить hostname на что-то без ключевых слов AI-лабораторий, изменить timezone на не-китайскую, или использовать официальный API-эндпоинт напрямую. Для остальных — повод задуматься о том, какие ещё невидимые механизмы могут быть встроены в инструменты с широкими правами доступа.