Перейти к содержанию

Безопасность

Юзербот работает от имени вашего аккаунта, поэтому Uroboros защищает его с трёх сторон: кто может вызывать команды, какой код можно установить и что этот код может делать во время работы.

Это не песочница. Сторонний модуль выполняется в одном процессе с ботом, и решительный автор при желании обойдёт проверки. Они защищают от типичного вредного кода и от случайностей, а не от любого Python. Ставьте модули, которым доверяете.

Кто может вызывать команды

Свои сообщения (исходящие) — всегда. Команды из чужих сообщений выполняются, только если отправителю хватает уровня доступа:

Уровень Кто Команды по умолчанию
owner этот аккаунт и добавленные .owner add всё, в том числе .e, .t, .dlm, .ulm, .restore, .update
sudo добавленные .sudo add большинство команд
support добавленные .support add справка, .ping, .info
everyone все только команды, которым так выставили уровень

Каждый уровень включает следующие: owner может всё, что sudo, и так далее. Уровень любой команды меняется командой .security <команда> <уровень>, .security <команда> default возвращает уровень по умолчанию. .security без аргументов показывает группы, изменённые права, замороженные и доверенные модули.

Проверка кода при установке

Перед .dlm, .lm, .uplm и .restore Uroboros читает исходник модуля и ищет опасное:

  • доступ к сессии: client.session.save(), StringSession.save, auth_key, api_hash, файлы .session, uroboros.db;
  • запросы, которыми угоняют аккаунт: завершение сеансов, удаление аккаунта, смена пароля 2FA или номера, вход по QR, выход из аккаунта, траты звёзд и передача подарков;
  • скрытый код: exec/eval от base64, zlib, marshal;
  • системные настройки Uroboros: права доступа, защита от флуда, токен inline-бота.

Модуль с опасным кодом не установится, пока вы явно не подтвердите: кнопкой «Установить всё равно» или флагом -f (.dlm -f, .uplm -f, .restore -f). Это касается и модулей из подключённых репозиториев.

Подозрительное — переменные окружения, запуск команд системы, удаление файлов, config.json, exec от строки, подписка на каналы — показывается в ответе отдельным блоком, но установке не мешает.

Модуль может объявить, что ему нужно: # meta permissions: network, files. Права показываются перед установкой, а если код использует необъявленное, вы увидите предупреждение. Подробнее — в Как писать модули.

Источник и версия модуля

  • Модули скачиваются только по https, перенаправления на http не принимаются.
  • Модуль из неподключённого источника ставится только после подтверждения: видно, откуда он и сколько в нём строк.
  • Модули с GitHub закрепляются на коммите: файл скачивается по ссылке на конкретный SHA, и в подтверждении видно, какой коммит ставится.
  • .uplm сначала показывает, что изменилось в каждом модуле, и обновляет после подтверждения.
  • Uroboros хранит sha256 файлов установленных модулей. Если файл изменили в обход Uroboros и в нём появился опасный код, при запуске модуль не загрузится.
  • В # requires: допустимы только имена пакетов с версиями: без ссылок и опций pip.

Защита во время работы

Сторонний модуль не может:

  • читать self.client.session;
  • открывать, удалять и переименовывать файлы сессии, config.json и uroboros.db, передавать их в команды системы;
  • отправлять запросы, которые угоняют аккаунт или тратят деньги (те же, что ищет проверка при установке).

Попытка заканчивается ошибкой PermissionError, действие не выполняется, а в «Избранное» приходит уведомление, какой модуль и что пытался сделать.

Ограничения снимаются для модуля, опасный код которого вы подтвердили при установке, и для модуля, которому вы явно разрешили всё: .security trust <модуль>. Вернуть защиту — .security untrust <модуль>.

Защита от флуда

Запросы к Telegram из стороннего модуля считаются. Если модуль отправил слишком много запросов (по умолчанию больше 60 за 30 секунд), он замораживается на 5 минут, а вам приходит уведомление. Настройка — .security flood <запросов> <секунд> <заморозка>, выключить — .security flood off, разморозить — .security unfreeze <модуль>.

Данные

Сессия, config.json (api_id и api_hash) и база данных лежат в data/. Это доступ к аккаунту: не публикуйте эту папку и не отправляйте её никому. .backup сохраняет базу данных и модули, но не сессию и не config.json.