Безопасность: хранение данных и защита отправок
Документация: 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) рядом с настройками | только вместе с сессией |
| для CI | TG_API_ID и TG_API_HASH | процесс с этими переменными |
Сессия — ключ авторизации Telegram. Копирование файла копирует вход без пароля и кода. Обращайтесь с ним как с паролем: не добавляйте в репозиторий, не прикладывайте к обращениям и не вставляйте в переписку.
Секреты не передаются аргументами команд. Хеш приложения и пароль 2FA запрашиваются скрытым вводом; код входа и телефон — запросом или через stdin. Аргумент был бы виден процессам в ps и сохранился бы в истории оболочки.
В файле настроек нет полей для секретов: хеша приложения, телефона или сессии.
Что сохраняется на диске
Точные пути на этом компьютере: 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 ask | deny и readonly: код 5 до отправки; ask без возможности ответа: код 7 |
| получатели — только чаты из списка | tg recipients add <chat>; отключить: tg recipients clear | код 7 |
sendsPerHour — максимум отправок за час, по умолчанию 30 | tg 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 → Настройки → Устройства.
Если сессия утекла
- В Telegram откройте Настройки → Устройства и завершите сессию, созданную
tg. Либо выполнитеtg session endна этом компьютере: она завершит сессию в Telegram и удалит файл. - Войдите снова:
tg session start.
Дальше
- Диагностика — что записывается и что исключено
- Вход и сессии — приложение, ключи, профили и выход
- MCP — действия агента, уровни и параметры
- Настройки —
permissionsиsendsPerHour
Изменения при глобальной установке
Глобальный postinstall npm устанавливает skill в пользовательские каталоги агентов; в Windows добавляет каталог команд npm в пользовательский PATH и удаляет только созданную npm обёртку tg.ps1 этого пакета. Файл .cmd сохраняется. Установка в проект и npx этого не делают. TG_INSTALL_AGENT=none отключает установку skill. Отдельный установщик Windows выполняет такую же подготовку даже при отключённых скриптах npm. Он не меняет политику выполнения, системный PATH, ключи или состояние аккаунта. Установка не входит в аккаунт и не читает чаты.