В Android-приложении Claude нашли скрытое меню для своих

Внутреннее меню инженеров Anthropic в Android-приложении Claude открывается по почте на @anthropic.com: приложение замечает такой адрес и ставит в локальных настройках ключ is_ant в true. Ключ нашёл автор разбора, опубликованного на Github. Он пересобрал APK, обошёл проверку и прошёл по меню целиком.
Коротко
- Автор начал с примерно 100 ключей SharedPreferences, которые остаются читаемыми даже после оптимизации R8, и по одному из них вышел на условие, открывающее вход во внутреннее меню.
- Внутри меню есть подмена фича-флагов GrowthBook, имитация плохой сети, оверлей с метриками подтормаживаний, тест push-уведомлений, подмена возрастных сигналов и выбор сервера: Production, Staging, Localhost или свой адрес.
- Защита при этом устроена по-разному: меню открывает правка одного условия на телефоне, а staging-сервер доступен из интернета, но закрыт Cloudflare Access, который требует авторизации.
Если вы не следили, у Anthropic уже была история с клиентом, внутренности которого оказались на виду. По данным InfoQ, 31 марта 2026 года исследователь Chaofan Shou обнаружил, что пакет Claude Code v2.1.88 в npm вышел с source map, ссылавшимся на полный необфусцированный исходник на TypeScript. Как пишет InfoQ, в Anthropic назвали случившееся ошибкой упаковки релиза по вине человека и подчеркнули, что взлома не было. Там же приводится мнение комментатора: любой фронтенд-клиент стоит заранее считать доступным для обратной разработки.
Ключ is_ant ставится по одному признаку: почте на @anthropic.com
Автор разбирает Android-приложения, которые его зацепили, и занимался этим ещё в магистерской диссертации. Об инженерной стороне Android-клиента Claude в блоге Anthropic он почти ничего не нашёл и распаковал приложение сам. Релизные сборки обычно проходят через R8: он выбрасывает недостижимый код и заменяет имена классов, полей и методов короткими, так что приложение становится меньше, а декомпилированный код труднее читать.
Строки ключей SharedPreferences, где приложение хранит локальные настройки, при этом часто остаются читаемыми. Автор насчитал около 100 таких ключей. Код, который ставит is_ant в true, проверяет, заканчивается ли почта аккаунта на @anthropic.com, и автор делает вывод, что ключ служит локальной отметкой сотрудника Anthropic.
Одно из мест, где ключ читается, решает, показывать ли в Settings отдельный пункт, ведущий во внутреннее меню. В реконструкции автора на Kotlin это одна проверка: если getBoolean для is_ant возвращает true, вызывается showInternalSettingsEntry().
Меню открылось после правки одного условия в пересобранном APK
На телефоне с root можно было бы просто переписать сохранённое значение. Но автор параллельно изучал другие части приложения и выбрал пересборку: распаковал APK, внёс правки, собрал заново и подписал, чтобы поставить на тестовое устройство. Первой правкой стала надпись «New chat»: заметное изменение подтверждает, что в сборке стоят его правки, и отличает её от оригинала.
Затем он сделал так, чтобы проверка перед пунктом меню проходила всегда. После пересборки пункт появился в настройках, но сам по себе ничего не гарантировал: экран за ним мог не пережить оптимизацию R8. Экран уцелел, и меню открылось целиком.
Внутри нашёлся и более короткий путь. Пункт «Internal Settings bubble» добавляет плавающую кнопку с муравьём: её можно таскать пальцем, она прилипает к краям экрана и открывает внутренние настройки. Автор называет её мелким удобством, которое избавляет от походов через Settings, когда раз за разом меняешь отладочную опцию.
Меню ломает сеть по заказу и переключает сервер на Staging или Localhost
«Show jank overlay» выводит статистику производительности интерфейса и опирается на библиотеку JankStats и Android API FrameMetrics. Jank значит подтормаживание: кадр рисуется дольше положенного, и прокрутка дёргается. Когда цифры видны прямо в приложении, медленное место проще разобрать, пока вы его воспроизводите.
Ещё в меню есть «Age Signal override» для имитации разных возрастных сигналов и отдельный экран для проверки push-уведомлений. Экран «Network Simulation» добавляет задержку и принудительно ломает запросы, загрузки и таймауты.
«Select API Endpoint» предлагает Production, Staging, Localhost и вариант со своим бэкендом. Адрес staging доступен из интернета, но перед ним стоит Cloudflare Access, который требует авторизации. Больше всего автора впечатлила проработка: внутренние инструменты обычно выглядят сыро, а эти, по его словам, аккуратные и хорошо продуманные.
Экран флагов GrowthBook меняет их значения прямо на телефоне
В приложении нашлась интеграция с GrowthBook и экран «Override feature flag», где можно менять локальные значения и конфигурации флагов. Автор называет его одним из самых интересных: по флагам можно догадаться об экспериментах и, возможно, о будущих функциях.
Фича-флаги похожи на выключатели в щитке уже построенного дома: проводку не трогают, а свет в нужных комнатах включают и выключают. Как сказано в документации GrowthBook, флаги отделяют выкладку кода от включения функций и управляют поведением приложения без нового деплоя.
В документации GrowthBook также описано, что флаг можно выдавать пользователям по атрибутам и условиям, раскатывать изменение постепенно, ставить A/B-тесты на клиенте или сервере и задавать свой набор функций для dev, staging и production. Кто увидит функцию, зависит от атрибутов пользователя.
Автор показывает экран флагов, но не перечисляет, какие флаги там нашёл и что они значат, поэтому о будущих функциях Claude из разбора ничего не узнать. На наш взгляд, само меню прикрыто слабо: почта проверяется прямо на телефоне, и одно изменённое условие в пересобранном APK открывает его целиком. Сервер staging при этом закрыт Cloudflare Access с авторизацией.
Что ещё прячет is_ant
Автор пишет, что в меню ещё есть что изучать, и выделяет экран флагов как один из самых интересных, так что список экспериментов может всплыть в следующих разборах. Дата продолжения не называется. Неизвестно и то, перенесёт ли Anthropic проверку is_ant на сервер или уберёт меню из релизной сборки.
Читайте также
- Разбор Claude Desktop: MCP-сервер работает вне песочницы
- Проспект Anthropic: модели могут сопротивляться отключению
- Разрешение жульничать спасло модель Anthropic от саботажа
- У отраслевого органа Anthropic, OpenAI и Google есть имя
- OpenAI и Anthropic разбирают десятки тысяч выходок ИИ
- Anthropic снова берёт деньги за заблокированные запросы
Комментарии
Пока никто не написал. Будьте первым.
Присоединяйтесь к разговору
Войдите через Google, чтобы оставить комментарий. Имя и аватар подставятся из вашего профиля Google, а комментарий появится после модерации.
