Repository navigation
security
Прочитайте эту страницу, прежде чем дать ИИ-агенту или скрипту доступ к вашему аккаунту MAX через
max, или когда хотите знать, что max хранит на вашем компьютере. Она объясняет, где хранится вход,
что max пишет на диск, с какими серверами связывается, что останавливает нежелательную отправку и что
делать, если токен утёк. Прочитав её, вы сможете оценить, что может сделать тот, у кого есть доступ к
этому компьютеру, или агент с доступом к max.
Слова, которые встречаются на странице:
- Токен — строка, которая держит вас в аккаунте MAX. У кого он есть, тот пользуется аккаунтом.
-
Общая локальная копия — база на вашем компьютере, где
maxиtgхранят прочитанные сообщения. Она общая для обоих инструментов и не зашифрована. - Защита от отправки — проверки, которые проходит каждое изменение перед тем, как попасть в MAX: права, список разрешённых получателей и лимит отправок в час.
Общее для max и tg — локальная копия переписки, защита от отправки, права агента, чужой текст
на экране, что видно другим на машине и как сообщить об уязвимости — описано на
общей странице безопасности. Здесь — то, что относится
только к MAX.
Что защищает любой инструмент WireCat, — на общей странице. Особенности MAX:
-
Ограничения профиля проверяет и фоновый сервер. Права, список получателей и лимит в час
проверяет и сама команда, и
max personal serve— даже для программы, которая подключилась к его сокету напрямую (ниже). -
Токен.
maxне сохраняет токен изMAX_TOKENи не передаёт его фоновому серверу. Фоновый сервер не отдаёт токен тем, кто подключается к его сокету (ниже). - Сеть. Файлы качаются по HTTP(S) через обычный сетевой транспорт, включая локальную сеть, с ограничением размера. Размер кадра от MAX и распакованных данных ограничен, у соединений есть тайм-ауты (ниже).
-
Аккаунт.
max— не официальное приложение, а правила MAX не разрешают такие программы без согласия компании (ниже).
В ключнице операционной системы: служба max-cli, запись — имя профиля. Не в файле настроек, не в
аргументе команды, не в переменной оболочки, не в истории.
Если ключницы на машине нет, токен ложится в ~/.config/max-cli/credentials.json с правами
0600, и команда говорит об этом одной строкой на stderr. max personal doctor тогда так и пишет: токен в
файле, а не в ключнице.
MAX_TOKEN старше ключницы: если переменная задана, берётся она. Так это работает в CI. Токен из
переменной остаётся только в ней:
- если MAX выдаст сессии новый токен,
maxне запишет его ни в ключницу, ни в файл, а скажет об этом одной строкой на stderr — на машине без ключницы живой токен иначе остался бы в файле, а файлы сборки часто уезжают в кэш и артефакты; - команда с
MAX_TOKENне запускает фоновый серверmax personal serveи не передаёт ему переменную: иначе токен одной команды жил бы в фоновом процессе ещё четверть часа.
Токен бота для max sales bot лежит рядом, но отдельно: та же служба max-cli, запись bot:<профиль>,
без ключницы — тот же файл с правами 0600. MAX_BOT_TOKEN старше ключницы, как MAX_TOKEN.
max sales bot auth set сначала спрашивает у MAX, чей это токен, и только потом сохраняет его, поэтому
опечатка не затирает рабочий токен. Токен из MAX_BOT_TOKEN он не сохраняет никогда.
В файле настроек секрета быть не может: в схеме нет поля, куда его положить — ни для токена, ни для телефона, ни для идентификатора чата.
| Что | Где | Права |
|---|---|---|
состояние профиля: устройство, счётчик входов, viewerId
|
~/.local/share/max-cli/profiles/<профиль>.json |
0600 |
| настройки | ~/.config/max-cli/config.json |
0644 |
записи запусков — с --record, а неудачные всегда: слова команды, id, время, код ошибки; текстов нет |
~/.local/share/max-cli/runs/… |
каталог 0700, файлы 0600
|
| журнал отправок — всегда: чат, время, id, длина, исход; текста нет | ~/.local/share/max-cli/sends/<профиль>.jsonl |
каталог 0700, файлы 0600
|
| список разрешённых получателей, если включён | ~/.local/share/max-cli/profiles/<профиль>.recipients.json |
0600 |
правила модерации групп — после первого chats rules set
|
~/.local/share/max-cli/profiles/<профиль>.moderation.json |
0600 |
бот: чаты, которые он видел, журнал отправок, список получателей, отметка watch
|
~/.local/share/max-cli/bots/… |
каталог 0700, файлы 0600
|
общая локальная копия сообщений — личного аккаунта, бота и tg; с текстами, расшифровками голосовых, путями скачанных вложений и их извлечённым текстом |
~/.local/share/WireCat/wirecat.db |
каталог 0700, файл 0600
|
сокет и журнал фонового сервера max personal serve
|
~/.local/share/max-cli/profiles/<профиль>.sock, .serve.log
|
0600 |
| прежняя локальная копия профиля; больше не открывается |
~/.cache/max-cli/<профиль>.db и её -wal, -shm
|
каталог 0700, файлы 0600
|
выгрузка переписки — только max personal store export --output
|
куда вы укажете | 0600 |
скачанные файлы из сообщений — max personal messages download или max personal attachments extract --download --output-dir
|
текущий каталог или --output
|
0600 |
отчёт о проблеме — только max personal doctor report create
|
текущий каталог или --output
|
0600 |
модели распознавания речи — только после max personal models audio download
|
~/.local/share/WireCat/models/audio/… |
каталог 0700, файлы 0600
|
⚠ Общая локальная копия содержит тексты сообщений и расшифровки голосовых — это её назначение:
отвечать без сети. max personal session end её не удаляет. max personal store clear --left --allow-dangerous
удаляет только данные покинутых чатов; удаления всей общей копии команда не предлагает.
Старые файлы кэша профиля больше не открываются. Если они остались, max personal doctor показывает путь;
их можно удалить отдельно, не затрагивая общую копию.
Тексты или содержимое переписки есть ещё в локальной копии бота, в выгрузке и в скачанных файлах; в списке чатов бота — названия чатов. Остальное из списка переписки не содержит.
От того, кто достанет диск, защищает только шифрование диска целиком — см.
общую страницу. На Windows
доступ к файлам зависит от разрешений каталога пользователя и выбранных каталогов MAX_*_DIR;
числа прав в таблице относятся к Unix.
Почему нужна защита от отправки и как она устроена, — на
общей странице. Перед каждой записью — сообщения,
реакции, правки, пересылки, удаления — max проверяет четыре вещи, а после пишет строку в журнал:
| Что | Как включить | Отказ |
|---|---|---|
| запрет записи в сообщения, кроме более точных разрешений |
max agent config set permissions.messages readonly; другие ресурсы ограничиваются отдельно |
код 5, соединения нет |
| разрешить отправку на фоне запрета остальных записей в сообщения | сначала max agent config set permissions.messages readonly, затем max agent config set permissions.messages.send allow; другие ресурсы и более точные правила сохраняются |
код 5 для запрещённых действий, соединения нет |
| список разрешённых получателей |
max <профиль> recipients add <чат>; выключить — recipients clear
|
код 7
|
| не больше N в час: сообщения, пересылки, правки, закрепления с уведомлением, удалённые сообщения, добавленные в группы люди; реакции не считаются |
sendsPerHour, по умолчанию 30
|
код 8, в ошибке — когда можно снова |
| журнал каждой попытки, без текста | всегда; смотреть — max personal sends list
|
— |
У бота свои ключи bot.*, например bot.messages.send. Они используют те же уровни.
Общие настройки и слои bot.defaults/bot.profiles разрешаются в одном порядке; config show --bot
показывает эффективные права. Старые readOnly и allow читаются совместимо до миграции.
У каждого бота свой список получателей — max <имя> bot recipients add <чат> — и свой журнал —
max <имя> bot sends list. Их проходит любая запись бота: messages send, messages pin и
bot api тоже, иначе общий вызов API был бы обходом списка. Правка и удаление берут чат первым:
max сначала спрашивает у MAX само сообщение и отказывает, если оно из другого чата. У чата,
названного user:<id>, такой сверки нет. В журнале — чат, вид, исход, длина
текста, но не сам текст. Лимита в час у бота нет, пока его не задали в разделе bot файла настроек:
max <имя> config set --bot sendsPerHour 200.
Те же проверки делает фоновый сервер max personal serve — для всего, что проходит через него, в том
числе от программы, которая подключилась к его сокету напрямую, а не через max. Он пропускает
только запросы, которые знает max, и только в той форме, в какой их отправляет max; удаление
чата целиком, например, не пропустит. Изменение через config set действует сразу, без перезапуска
сервера.
Изменения самого аккаунта — контакты, профиль, папки, сеансы — тоже проходят первую проверку:
профиль только для чтения их не делает. Список получателей и лимит в час к ним не относятся: в них
нет чата и никто не получает сообщения. В журнал они пишутся видом account и действием, без
имён, номеров и названий.
Список необязательный: пока в него ничего не добавлено, отправлять можно в любой чат. Пустой, но
включённый список — «никуда». Когда он включён, chats create <название> <люди…> и chats members add
принимают только людей, личный чат с которыми есть в списке. Новый участник группы старых сообщений
не видит, пока не передан --history. Отложенное сообщение считается в лимит того часа, когда
уйдёт. Две команды, запущенные разом, лимит не перепрыгнут: место под лимитом держится от проверки
до ответа MAX. Очистка данных покинутых чатов журнал отправок не трогает.
⚠ Чего это не держит. Проверки стоят в самом max: агент с доступом к оболочке может снять
их сам. Какую границу поставить снаружи — на
общей странице. Для max:
профиль закрепляет MAX_PROFILE_LOCK, а не MAX_PROFILE; --file не берёт известные файлы
и папки с учётными данными, папки самого max и хранилище, пока не задан --allow-any-file.
Обычные скрытые рабочие папки разрешены; в MCP обхода защиты нет.
-
Не отмечает прочитанным без просьбы. «Получить историю» и «отметить прочитанным» — разные
операции протокола. Вторую отправляют только
max personal chats mark-readиmessages list --mark-read; чтение её не отправляет. -
Не отправляет ничего, чего не просили. Что-то меняют только
messages send|edit|delete|forward|pin|unpin|press,reactions add|remove,polls vote|close|create,contacts add|remove|import|rename|block|unblock,account update,account sessions end,session end,chats join|leave|create|update|start|app,chats members|admins …,chats requests accept|decline,chats link reset,chats folders create|update|delete|order,chats moderate(только то, что разрешают правила группы),chats mark-readиmessages list --mark-read— и каждая делает только то, что написано в набранной строке.max commands --jsonпомечает ихmutates. -
Удаление по умолчанию требует подтверждения. Уровень
askдляmessages.deleteтребует ответа в терминале или--allow-dangerous; явныйallowвыполняет удаление без вопроса. Для удаления у всех нужен также--for-everyone; общий MCP-инструмент этого не разрешает. -
Не берёт номер телефона из командной строки.
contacts lookupспрашивает его или читает из трубы,contacts import— из файла: строку команды видятpsи история оболочки. В ошибках, журнале отправок и записях запусков номера нет, аmax personal session startиmax personal account showпоказывают его скрытым. - Не пишет сообщения в журнал. Ни в обрезанном виде, ни хэшем — см. диагностику.
-
Не ходит через посредников. Куда именно подключается
max— в разделе «Что уходит в сеть». Своей телеметрии уmaxнет;max personal serveшлёт MAX одно служебное событие, как скрытая вкладка веб-версии, — см. там же. -
Держит соединение только в
max personal serve. Его запускает в фоне первая команда, которой нужен MAX; он сам останавливается через 15 минут без дела. Не запускать —max personal config set serve false.
Имена, названия и тексты от других людей не управляют терминалом: управляющие и невидимые символы показываются как текст, имена печатаются в одну строку, автодополнение подставляет только номера. Подробно — на общей странице.
Токен не передаётся аргументом, а текст сообщения — передаётся, и его видно в ps и в истории
оболочки (общая страница).
Файлы состояния и сокет фонового сервера защищены правами 0600 и каталогами 0700. У других
файлов могут быть иные права, например 0644 у настроек. При переносе файлов или перенаправлении
вывода проверяйте права отдельно.
| Куда | Когда |
|---|---|
wss://api.oneme.ru/websocket, заголовок Origin — https://web.max.ru
|
каждая команда, которой нужен MAX |
| серверы файлов MAX — адрес выдаёт сам MAX |
messages send --file, messages download
|
https://web.max.ru во временном профиле Chromium |
session start qr-chrome, session start sms, `setup --method qr-chrome |
| Hugging Face и GitHub — файлы модели распознавания речи | только max personal models audio download; голос туда не уходит — он распознаётся на этом компьютере |
| Hugging Face — файлы текстовой модели | только max personal models text download; локальная модель не отправляет сообщения |
| настроенный внешний сервис векторов |
conversations embed отправляет текст бесед после согласия; search conversations, в том числе MCP, отправляет вопрос при выборе внешнего сервиса |
| настроенный OpenAI-совместимый сервис или Anthropic |
conversations build --analyze --chat отправляет ограниченные пачки после согласия для аккаунта, чата и сервиса |
https://platform-api2.max.ru — официальный Bot API, токен в заголовке Authorization
|
только команды max sales bot
|
| реестр npm — узнать номер последней версии |
max upgrade; и раз в сутки, когда команду запускает человек в терминале. Выключается updateCheck: false
|
max personal messages download использует HTTP(S) и обычные перенаправления без проверки DNS-адресов.
VPN, прокси и локальные адреса не запрещены этой командой. Файл — не больше 4 ГиБ, голосовое для расшифровки — не
больше 32 МиБ.
Запросы max sales bot честно называют себя max-cli/<версия>: бота MAX и так знает по токену. Сертификат
platform-api2.max.ru подписан корневым сертификатом Минцифры, которого нет в Node; max добавляет
его только в свои запросы к Bot API и ничего не меняет в системе.
Для личного аккаунта на проводе нет имени этого инструмента и собственного user-agent: user-agent и описание устройства
взяты у веб-клиента MAX. Кадры тоже как у веб-клиента: тот же адрес, двоичный формат и сжатие.
Телеметрию веб-клиента max personal serve повторяет так, как её шлёт скрытая вкладка: одно событие
«показан список чатов» через 20 секунд после входа, и больше ничего. В нём только номер вашего
аккаунта и время — ни сообщений, ни названий чатов. Одноразовые команды телеметрию не шлют.
После входа max personal serve запрашивает то же, что вкладка: папки, баннеры, историю звонков, наборы
стикеров и реакций — только чтение; ответы нигде не показываются и не сохраняются. Одноразовые
команды этого не делают. Отличия остаются: вкладка запрашивает ещё контакты, истории и подписку на
push-уведомления, а max — нет. Поэтому MAX может отличить max от веб-клиента.
max — не официальное приложение MAX. Пользовательское соглашение MAX
(редакция от 09.09.2026, п. 4.3.7) не разрешает автоматические программы без согласия компании.
Поэтому аккаунт, с которым работает max, может быть ограничен — и это аккаунт, к которому бывают
привязаны госуслуги и связь с близкими.
Что стоит делать:
-
Пользуйтесь MAX как обычно — в браузере или на телефоне, параллельно с
max. Аккаунт, который только отвечает на запросыmax, выглядит иначе, чем аккаунт живого человека. -
Не превращайте
maxв поток запросов. Чтение по делу, а не каждую минуту по расписанию.
При первом входе профиля через max personal setup или max personal session start это же говорится один раз, на stderr.
session start qr-chrome и sms запускают браузер с временным профилем — отдельной
папкой, а не вашим профилем с паролями и cookie. В ней живёт вошедший web.max.ru, поэтому папка
удаляется на любом выходе: после входа, при закрытом окне, по --timeout и по Ctrl-C. Токен мы
читаем через канал отладки между нашим процессом и браузером (--remote-debugging-pipe): сетевого
порта нет, и другой пользователь машины к браузеру не подключится.
session start qr рисует QR-код в терминале — он остаётся в прокрутке, но через пару минут
истекает. Если терминал узкий, код показывается со страницы на 127.0.0.1 со случайным адресом;
ссылка кода не пишется ни в файл, ни текстом. Страница пропадает, когда команда завершается.
Каждый такой вход добавляет устройство в список сессий приложения MAX. Завершить его можно там же.
MAX не публикует API для пользовательских аккаунтов. Всё, что здесь знают о протоколе, либо измерено на живом соединении, либо прочитано в чужой обратной инженерии — и у каждой операции записано, откуда именно (описание протокола, колонка «Where it came from»).
Практический вывод один: это может перестать работать без предупреждения, и тогда команда скажет об этом строкой на stderr, а не покажет пустой список как ни в чём не бывало.
Инструмент сохраняет на вашем компьютере переписку и контакты других людей, включая тексты
сообщений. Доступ к локальной базе даёт доступ к этим данным. Выгрузка (max personal store export),
переданная другому человеку, передаёт и содержимое переписки; ссылки на фото в ней могут
открываться без входа. Перед передачей проверьте содержимое и круг получателей. Эта страница
описывает работу инструмента, а не подтверждает соблюдение законодательства для вашего сценария.
Отчёт о проблеме (max personal doctor report create) прикладывается к открытой задаче на GitHub — его
увидят все. Текстов, имён и телефонов в нём нет, номера чатов и сообщений заменены метками; перед
отправкой файл можно открыть и проверить.
max personal session end # выйти из MAX и забыть локальноsession end завершает эту сессию на сервере MAX, так что утёкший токен перестаёт работать. Если
MAX не ответил, команда скажет об этом и токен не сотрёт — повторите её.
max personal account sessions end --others --yes завершает все остальные сеансы сразу — и приложение на
телефоне тоже, после него там придётся входить заново. Завершить один сеанс нельзя: MAX не даёт
сеансу номера. Если MAX в ответ выдаст этому сеансу новый токен, max сохранит его в связку ключей
раньше, чем скажет «готово».
-
Общая страница безопасности: то, что одинаково в
maxиtg, и как сообщить об уязвимости - Диагностика: что именно записывается и что не записывается никогда
-
Вход, сессии и профили: ключница,
MAX_TOKEN, что делаетsession end - MCP: что может агент через MCP-сервер и что включает каждый флаг
-
Права: как настроить
permissionsиsendsPerHour