Skip to content

security

github-actions[bot] edited this page Oct 14, 2026 · 1 revision

Что попадает на диск, а что не попадает никогда

Прочитайте эту страницу, прежде чем дать ИИ-агенту или скрипту доступ к вашему аккаунту 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. Пользовательское соглашение 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 сохранит его в связку ключей раньше, чем скажет «готово».

Дальше

Clone this wiki locally