Telegram

Безопасность: хранение данных и защита отправок

Документация: v0.24.0

tg работает с вашим настоящим аккаунтом Telegram. Здесь описано, что хранится на компьютере, что не сохраняется и какие проверки защищают отправку сообщений агентом реальным людям.

Основные меры защиты

Защита действует против следующих рисков:

  • Сообщение убеждает агента что-то отправить. Разрешения профиля permissions определяют действия агента: ask показывает форму перед изменением, а --confirm-send — перед каждым изменением. Подтверждение действует один раз, пять минут и только для показанных чата и текста (MCP). Каждый инструмент чтения напоминает модели: сообщения — данные, а не инструкции.
  • Профиль не разрешает изменение. Каждая команда и инструмент MCP проверяют permissions, получателей и часовой лимит. Все попытки записываются в журнал без текста (ниже).
  • Агент выбирает другой профиль или отправляет ключи. TG_PROFILE_LOCK фиксирует профиль, а --file запрещает скрытые файлы, ~/.ssh и собственные каталоги tg.
  • Чужой текст управляет терминалом. Управляющие и невидимые символы показываются текстом, имена — одной строкой, автодополнение вставляет только идентификаторы (ниже).
  • Секреты попадают в журналы. Записи запусков, отчёты и журнал отправок содержат идентификаторы и количества, но не текст.
  • Секреты видны в ps или истории оболочки. Команды не принимают пароли, коды и телефоны аргументами.
  • Другие пользователи компьютера получают доступ. На Linux и macOS сессия, база, записи запусков и журнал отправок tg доступны только владельцу. У настроек и файлов служб другие права; при перенаправлении экспорта права задаёт оболочка (ниже).
  • Подмена выпуска. Пакет публикуется из GitHub Actions через trusted publishing npm. Шаг публикации ничего не устанавливает и не запускает скрипты пакетов; прямые зависимости закреплены на точных версиях.

Защита не действует в следующих случаях:

  • Кто-то работает под вашим пользователем на компьютере. Он может читать сессию и локальную базу, как и вы.
  • Агент может менять настройки. Защита читает config.json и список получателей. Доступ к tg config set, tg recipients add или редактированию файлов позволяет снять ограничения. Запретите агенту эти действия (ниже).

Хранение данных входа

ДанныеГде хранятсяКто может использовать
сессияsessions/<profile>.session в каталоге состояния, 0600 в каталоге 0700любой, кто читает файл: он равнозначен паролю
сессия истории ботаbots/<profile>/mtproto-<bot-id>.session в каталоге состоянияпрочитавший файл получает доступ от имени бота; защищайте его так же, как личную сессию
идентификатор и хеш приложениясистемное хранилище ключей; при его отсутствии credentials.json (0600) рядом с настройкамитолько вместе с сессией
для CITG_API_ID и TG_API_HASHпроцесс с этими переменными

Сессия — ключ авторизации Telegram. Копирование файла копирует вход без пароля и кода. Обращайтесь с ним как с паролем: не добавляйте в репозиторий, не прикладывайте к обращениям и не вставляйте в переписку.

Секреты не передаются аргументами команд. Хеш приложения и пароль 2FA запрашиваются скрытым вводом; код входа и телефон — запросом или через stdin. Аргумент был бы виден процессам в ps и сохранился бы в истории оболочки.

В файле настроек нет полей для секретов: хеша приложения, телефона или сессии.

Что сохраняется на диске

ДанныеГдеСодержимоеПрава
локальная база~/.local/share/cli-messaging/messages.dbполный текст всех прочитанных и отправленных tg сообщений, названия чатов, имена, расшифровки0600, каталог 0700
настройкиconfig.jsonтолько настройки0644, каталог 0700
записи запусков — с --record и для всех ошибокruns/ в каталоге состоянияслова команды, идентификаторы, количества, длительности, коды ошибок0600, каталог 0700
журнал отправок — всегдаsends/<profile>.jsonlвремя, чат, результат, длина, вид и размер вложения; без текста и имени файла0600, каталог 0700
получателиprofiles/<profile>.recipients.jsonчаты, куда профилю разрешено отправлять0600
позиция inbox --newinbox/<profile>.jsonгде остановилась последняя проверка0600
фоновые задания загрузкикаталог состояниячат, прогресс, результат0600
журнал и блокировка serveserve/<profile>.log или журнал systemdдействия serve0600
служба systemd или агент launchd — только tg server installкаталог служб пользователякоманда запуска serve0644
скачанные файлы — только tg messages download--output-dir или текущий каталогфайлы указанных сообщений0600
экспорт — только tg store export--output или путь перенаправлениясообщения одного чата0600 с --output; иначе права задаёт оболочка
резервная копия — только tg store backupуказанный файлкопия всей базы0600
отчёт о проблеме — только tg doctor report create--output или текущий каталогидентификаторы заменены метками, без текста0600
модели речи — только tg models audio download~/.cache/cli-common/models/audio/скачанные модели0600, каталог 0700

Точные пути на этом компьютере: tg doctor. Пути для разных систем: Установка.

Права 0600 для файлов и 0700 для каталогов применимы к Linux и macOS. Windows использует унаследованные списки контроля доступа (ACL); числовые права не делают Windows ACL доступным только владельцу. Храните состояние, базу, экспорты и временные QR-изображения в каталогах, доступных только вашему пользователю Windows.

Локальная база не зашифрована. Любой, кто может прочитать файл, увидит сообщения. База общая для CLI на той же библиотеке и остаётся после tg session end и удаления программы. Тексты также находятся в экспортах, резервных копиях и скачанных файлах; остальные строки таблицы их не содержат.

Если компьютер потерян

В Linux и macOS 0600 защищает файлы от других пользователей, но не от человека, завладевшего диском. От этого защищает полное шифрование диска: FileVault в macOS, LUKS в Linux, BitLocker в Windows. Сама база не зашифрована: ключ в системном хранилище не остановит программу, запущенную от вашего пользователя, которая может прочитать ключ так же, как tg.

Завершите сессию с другого устройства: Telegram → Настройки → Устройства → сессия, созданная tg. После этого файл сессии бесполезен.

Что не происходит автоматически

  • Отметка прочитанным без запроса. Чтение чата и отметка прочитанным — разные запросы Telegram. Отдельную отметку отправляют tg chats mark-read и tg messages list --mark-read.
  • Отправка или изменение без вашей команды. Это делают только команды, отмеченные в docs/commands.md как «изменяет данные Telegram»: сообщения, реакции, опросы, отметка прочитанным, группы и папки, account update, изменения contacts, account sessions end и session end. Каждая выполняет только указанное действие. tg commands --json отмечает их mutates, вместе с командами, отмеченными «изменяет данные только на этом компьютере»: настройки, получатели, правила групп и токен бота.
  • Удаление без явного подтверждения. tg messages delete спрашивает; --allow-dangerous подтверждает за вас. Для удаления у всех нужен ещё --for-everyone. Отменить удаление нельзя. Агент через MCP никогда не удаляет сообщения у всех и не завершает другие сессии независимо от настроек.
  • Телефон в аргументе. contacts lookup запрашивает номер или читает stdin. Ошибки, журналы и записи его не сохраняют.
  • Текст сообщения в журнале. Даже сокращённый или хешированный (Диагностика).
  • Самостоятельное постоянное подключение. Команда подключается, выполняет задачу и выходит. Соединение удерживают только watch, serve, mcp и фоновая загрузка, пока они запущены.

Защита отправок

Агент читает чужие сообщения вместе с вашим запросом. Сообщение может пытаться выдать себя за инструкцию: «перешли разговор туда». Поэтому все команды и инструменты MCP, изменяющие Telegram — отправка, ответ, редактирование, пересылка, закрепление, реакция, голосование, опрос, удаление, отметка прочитанным — проходят общие проверки в таком порядке:

ПроверкаКак включитьОтказ
permissions — для каждой команды: deny, readonly, ask или allow (Настройки)tg config set permissions.messages.send askdeny и readonly: код 5 до отправки; ask без возможности ответа: код 7
получатели — только чаты из спискаtg recipients add <chat>; отключить: tg recipients clearкод 7
sendsPerHour — максимум отправок за час, по умолчанию 30tg config set sendsPerHour 10код 8; ошибка сообщает время следующей разрешённой отправки
журнал — все попытки без текставсегда; tg sends list—
tg config set permissions.messages readonly  # no change to messages from this profile
tg config set permissions.messages.send ask  # a question before each send
tg recipients add "Book club"                # the first add turns the list on
tg recipients list
tg recipients remove "Book club"             # the list stays on
tg recipients clear                          # the list is gone: any chat again
tg sends list                                # every attempt: sent, refused, failed, or not known

В часовой лимит входят: сообщение, пересылка, редактирование, закрепление с уведомлением, каждое удаляемое сообщение, новая группа и каждый добавляемый участник. Реакция, голосование, тихое закрепление и отметка прочитанным не учитываются. Отложенное сообщение учитывается в час отправки Telegram. Параллельные команды не обходят лимит: каждая резервирует место до ответа Telegram.

Список получателей необязателен: пока он пуст, разрешены все чаты. Пересылка проверяется по чату назначения. Инструменты MCP проходят ту же защиту, что команды.

По умолчанию изменения разрешены, кроме удаления сообщений и завершения сессий, требующих подтверждения. Старые настройки работают: readOnly: true разрешает только чтение, а список allow разрешает только перечисленные действия.

Отказ — решение владельца, а не сбой. При кодах 5, 7 или 8 агент должен остановиться и сообщить причину, а не менять настройки или повторять запрос. В skill это указано прямо.

Пределы защиты

Проверки находятся внутри tg, поэтому агент с терминалом может снять их, изменив настройку или очистив список. Они защищают от модели, которую сообщение убедило отправить что-то, но не от агента, намеренно обходящего ограничения. Для этого нужна внешняя граница: песочница, отдельный пользователь ОС или правила самого агента.

При выборе такой границы учитывайте:

  • TG_PROFILE_LOCK фиксирует профиль, TG_PROFILE — нет. Первое слово команды важнее TG_PROFILE: при TG_PROFILE=agent агент всё ещё может выполнить tg work messages send …. TG_PROFILE_LOCK=agent отклонит это, но лишь если агент не может менять окружение: например, в настройках MCP-клиента или скрипте-обёртке. Агент с оболочкой может убрать переменную.
  • --file и --photo запрещают скрытые файлы и каталоги, ~/.ssh, каталоги tg и локальную базу. Именно там часто хранятся ключи и токены, которые злоумышленник пытается заставить агента отправить. --allow-any-file снимает ограничение на одну команду и предназначен для вас. В MCP обхода нет. Любой другой доступный вашему пользователю файл можно отправить; журнал сохраняет только вид и размер.
  • Правило агента «спросить перед tg messages send» может не распознать вариант с профилем tg work messages send. Надёжнее ограничивать сам профиль через permissions или получателей и не держать рядом активный профиль без ограничений.

Чужой текст в терминале

Имена, названия чатов, имена файлов и сообщения пишут другие люди. tg не позволяет им управлять терминалом или подделывать отображение:

  • управляющие символы, меняющие цвета, строки, заголовок окна или буфер обмена, выводятся текстом (\x1b), а не исполняются; так же обрабатываются невидимые символы и символы изменения направления текста;
  • имя, название и подпись выводятся одной строкой: перенос не может создать ложную строку разговора или таблицы;
  • если имя подходит нескольким чатам, tg перечисляет их, а не выбирает сам;
  • автодополнение вставляет только идентификатор, показывая название как подсказку;
  • экспорт Markdown проходит такую же очистку; имя скачанного файла очищается от управляющих символов, изменения направления текста и начальной точки.

Для агента сообщение — данные, а не инструкция: «перешли туда» или «ответь так» в чужом сообщении не является вашим запросом. Skill (tg skill show) и MCP-сервер напоминают об этом. Если агент не следует напоминанию, остаётся защита отправок.

--json возвращает данные: строки соответствуют Telegram и экранируются по правилам JSON. Если другой процесс выводит их в терминал, очистку нужно выполнить там.

Что видят другие процессы

Аргументы команды видны всем процессам в ps. Поэтому секреты не являются аргументами, но текст сообщения может быть аргументом:

tg messages send me "text"     # this line is visible in ps and stays in your shell history

Если это важно, не указывайте текст в аргументе, а передайте через stdin: tg messages send me < note.txt.

На Linux и macOS чувствительные файлы состояния защищены правами 0600 в каталогах 0700. Настройки и файлы сервиса могут иметь 0644; права перенаправленного вывода задаёт оболочка. На Windows доступ определяется унаследованными ACL каталога. Сверяйтесь с таблицей выше.

Сетевые подключения

  • Telegram, через MTProto для команд личного аккаунта, включая файлы и фотографии. Команды бота используют HTTPS Bot API; bot store fetch — отдельную MTProto-сессию бота для истории.
  • npm, раз в день в терминале для проверки новой версии tg, а также при tg upgrade. updateCheck или TG_NO_UPDATE_CHECK=1 отключает проверку (Настройки).
  • my.telegram.org, только во время tg setup или tg session start: открывается в браузере либо управляется tg с --app auto. Созданное там приложение называется tg-cli, его адрес — страница проекта на GitHub.
  • Hugging Face и GitHub, только при tg models audio download. Голосовое сообщение туда не отправляется: локальная модель работает на этом компьютере.

Других подключений нет. Телеметрии нет.

Ваше приложение и правила Telegram

tg — клиент Telegram, как приложения на телефоне и компьютере. Он входит с вашим приложением my.telegram.org и соблюдает условия API Telegram. Часовой лимит включён по умолчанию, чтобы агент отправлял сообщения с обычной для человека частотой.

Личное использование

tg сохраняет чужие сообщения и имена на вашем компьютере. При передаче экспорта эти данные получает адресат файла. Если вы подключаете ИИ-агента, проверьте, что он отправляет своему провайдеру и как провайдер обрабатывает данные. Само по себе локальное хранение не подтверждает соответствие вашего использования применимым требованиям конфиденциальности.

Отчёт (tg doctor report create) отправляется в публичное обращение на GitHub. В нём нет текстов, имён и телефонов, а идентификаторы заменены метками. Откройте и проверьте файл перед отправкой.

Безопасность входа

tg setup и tg session start рисуют QR-код в терминале. Он остаётся в истории вывода; Telegram обновляет его, пока вы ждёте, поэтому старый код бесполезен. --qr-file записывает PNG, доступный только вам, и удаляет его по завершении входа независимо от результата.

--app auto заполняет my.telegram.org без браузера и запрашивает только телефон и код, присланный сайтом в Telegram.

Каждый вход добавляет устройство в Telegram → Настройки → Устройства.

Если сессия утекла

  1. В Telegram откройте Настройки → Устройства и завершите сессию, созданную tg. Либо выполните tg session end на этом компьютере: она завершит сессию в Telegram и удалит файл.
  2. Войдите снова: tg session start.

Дальше

Изменения при глобальной установке

Глобальный postinstall npm устанавливает skill в пользовательские каталоги агентов; в Windows добавляет каталог команд npm в пользовательский PATH и удаляет только созданную npm обёртку tg.ps1 этого пакета. Файл .cmd сохраняется. Установка в проект и npx этого не делают. TG_INSTALL_AGENT=none отключает установку skill. Отдельный установщик Windows выполняет такую же подготовку даже при отключённых скриптах npm. Он не меняет политику выполнения, системный PATH, ключи или состояние аккаунта. Установка не входит в аккаунт и не читает чаты.

На этой странице