Изучая безопасность мессенджера Telegram, меня поразила одна его "особенность" при работе с ботами - выяснилось, что при добавлении в канал бота никак нельзя ограничить его в правах на удаление подписчиков. То есть, говоря прямо, любой бот может вычистить всю аудиторию канала за считанные минуты.

Добавлять ботов в Telegram-каналы можно только как администраторов с целью автоматизации выполнения различных сервисных действий - например, планирование публикации постов и сбор всевозможной аналитики по каналу.

Почти все администраторы Telegram-каналов пользуются сторонними ботами от разных сервисов вроде Telemetr или Telepost и аналогичных. Причем сервисы часто специально навязывают добавление своего бота в канал. Например, всевозможные биржи рекламы вообще отказываются работать с каналом без наличия их бота - без него нельзя автоматизировать публикацию рекламы.

Таким образом администаторы добавляют к себе в канал бота за ботом, уповая на то, что следующая настройка прав не оставляет ботам никаких возможностей, кроме как работать с постами:

Редактирование прав из официального клиента Telegram
Редактирование прав из официального клиента Telegram

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

С точки зрения Telegram API удаление подписчика из чата выглядит как бан с помощью API-метода editBanned. Т.е технически у всех ботов, которые попадают в канал, есть "несгораемые" права по бану участников.

Самое странное в этой ситуации то, что в Telegram API присутствует "скрытая" возможность отнимать у ботов права на удаление подписчиков, но в официальной версии Telegram она скрыта из интерфейса:

Неофициальная возможность в официальном API
Неофициальная возможность в официальном API

Если же сделать этот API-запрос вручную, "насильно" выставив настройкуban_users, то обнаружится, что сервера Telegram по какой-то причине игнорируют её. Скорее всего, из-за этого настройка и отсутствует в официальных клиентах, хотя появилась она очень давно - можно посмотреть по истории TL Layer.

Как от этого защищаться? Пока Telegram не предлагает ничего лучше, чем написать собственный скрипт на основе Telegram API, который бы мониторил все удаления подписчиков в канале ботами и банил бы их. К счастью, банить подписчиков боты могут только пачками по 200 (ограничение Telegram на просмотр последних подписчиков канала), поэтому как только какой-то бот забанит первого подписчика, такого бота можно незамедлительно выбрасывать из канала. Это позволит не потерять всех подписчиков за несколько секунд.

Проблема тут только в том, что Telegram API не позволяет одним ботам банить других ботов, из-за чего скрипт мониторинга придется запускать от имени Telegram-пользователя, а не от имени Telegram-бота. С другой стороны, Telegram отправляет уведомления об удалении пользователей из каналов только ботам, а обычным пользователям - не отправляет????. Из-за всей этой неразберихи в API рабочая схема защиты будет выглядить так:

  1. Добавляем в канал своего бота, который будет мониторить удаления подписчиков другими ботами

  2. Если было обнаружено удаление, удаляем обнаруженного бота от имени второго аккаунта - пользователя

Код с использованием библиотеки Pyrogram для защиты канала по такой схеме может выглядеть примерно так:

# аккаунт бота
bot = Client(...)

async def banBastard(channelId, botId):
    # запускаем аккаунт пользователя для удаления паршивца
    user = Client(...)
    async with user:
        await user.ban_chat_member(channelId, botId)

# callback получения нотификаций об удалении пользователей в каналах, куда добавлен бот
@bot.on_chat_member_updated()
async def onMemberHandler(client, update):
    banned = update.new_chat_member.status == enums.ChatMemberStatus.BANNED
    byBot = update.new_chat_member.restricted_by.is_bot
    if banned and byBot:
        await banBastard(update.chat.id, update.new_chat_member.restricted_by.id)

# запускаем бота для прослушивания нотификаций об удалении пользователей
async def main():
    async with bot:
        while True:
            await asyncio.sleep(1)

bot.run(main())

Есть и более простой, но менее надежный способ для администраторов Telegram-каналов. Но придется, как бы сюрреалистично это ни звучало...добавить в канал бота @channel_guardian_bot - он будет отслеживать все удаления подписчиков другими ботами и присылать уведомления. Если быстро среагировать, можно будет спасти существенную часть своей аудитории.

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

Комментарии (65)


  1. boldMahoney
    01.10.2023 16:03
    +21

    Поэтому для критически важных вещей надо использовать on-premise решения и желательно с открытым кодом.


    1. mini_nightingale
      01.10.2023 16:03
      +1

      Не многие этот самый открытый код смотрят, тем более постоянно.
      В теории там может внезапно что-то поменяться, допустим добавиться выпил свего и вся, аля очередная "акция чтобы %гладиолус%".


      1. garwall
        01.10.2023 16:03

        для этого и существуют LTS-релизы


        1. CherryPah
          01.10.2023 16:03
          +10

          Всегда казалось что LTS это про насколько долго в дальнейшем будут выпускаться патчи с "гладиолусами", а не про неизменность релиза.


    1. Kenya-West
      01.10.2023 16:03
      +5

      Это ничего не гарантирует. Где гарантии того, что у автора не появится Тайлер-Дёрденовское альтерэго и он не напишет "красную кнопку" на боте и не вольёт в мастер?

      Где гарантии того, что я это увижу?

      Исключение такой ситуации — это отказаться от Telegram и уйти в лес трогать берёзы (причем именно берёзы), другого не дано.


      1. 13werwolf13
        01.10.2023 16:03
        +3

        тут история не про гарантии а про шансы
        шанс того что автор опсосного решения с гитхаба рискнёт залить малварь (либо будет взломан), как и шанс того что если такой залив произойдёт то он останется незамеченным гораздо меньше чем в облачных сервисах


        1. vcKomm
          01.10.2023 16:03
          +2

          Скажите это автору node-ipc


          1. shasoftX
            01.10.2023 16:03

            Точнее тем кто пользуется node-ipc


          1. 13werwolf13
            01.10.2023 16:03
            +6

            ну что могу сказать: "шанс быть застреленным коровой ничтожно мал, но никогда не равен нулю" ©


  1. InsanusMokrassar
    01.10.2023 16:03
    +10

    Поэтому пишите своих ботов или запускайте проверенных и настроенных под свои нужды


    1. kma21
      01.10.2023 16:03
      +1

      никто не даёт гарантий того, что проверенные боты не будут взломаны и/или не начнут творить дичь и без взлома, по причине их автора. например, потому что вы из РФ.
      https://habr.com/ru/news/656219/
      https://habr.com/ru/news/655829/


      1. InsanusMokrassar
        01.10.2023 16:03
        +4

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

        В остальном: большие и серьезные компании не пойдут на подобные странные решения, поэтому в большинстве своем стандартным (читай, либам от разработчика языка) обычно можно доверять, а в остальном нужно уже руководствоваться головой.

        Ну и всегда можно написать свою либу для всего :)


    1. MountainGoat
      01.10.2023 16:03
      +2

      На написанной вами операционной системе, а то мало ли...


      1. InsanusMokrassar
        01.10.2023 16:03

        Если ваша отдел безопасности того требует - возможно :)


      1. qqrm
        01.10.2023 16:03

        Хорошо, хоть не на саморучно спаянном компьютере. Хотя, на ютубе есть и такие молодцы, но без фольгированных шапочек, конечно.


  1. NikitaSidor
    01.10.2023 16:03
    -2

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


    1. rombell
      01.10.2023 16:03
      +2

      Это нонсенс, так как стоимость и есть деньги.
      Возможно, Вы имели в виду "ценность"? Ценность, действительно, может быть измерима в деньгах, а может и не быть — например, ценность "посидеть на закате на берегу красивого озера".


  1. bogolt
    01.10.2023 16:03
    -5

    Просто не используете проприетаный мессенджер вместо адекватный опен-сорс решений. А если уж используете то примите последствия. Владельцам мессенджера даже не обязательно что-либо у вас отбирать, они могут просто менять правила игры на ходу а вам придется под них подстраиваться.


    1. AlexanderS
      01.10.2023 16:03
      +6

      А адекватные это какие? Matrix?


      1. enkryptor
        01.10.2023 16:03
        +11

        — Не используйте до обеда проприетарных мессенджеров.
        — Гм… Да ведь других нет.
        — Вот никаких и не используйте!


      1. ptr128
        01.10.2023 16:03
        -1

        Jami, например.


    1. Markscheider
      01.10.2023 16:03
      +9

      Просто не используете проприетаный мессенджер вместо адекватный опен-сорс решений.

      Я бы, может, и не хотел, но если вся моя аудитория в этом проприетарном мессенджере - придется туда лезть.


      1. ptr128
        01.10.2023 16:03
        +1

        Но это не является препятствием для предложения этой же аудитории каких-то преференций при использовании свободного peer-to-peer решения.


        1. lda93
          01.10.2023 16:03

          Я даже не представляю себе, какие такие преференции могут предложить используемые мною каналы, чтобы сподвигнуть меня ради этого установить ещë один мессенджер, тем более опенсосный.


          1. ptr128
            01.10.2023 16:03
            +1

            Ну вот Вы исключение. А большинство, которых я знаю, на телефоне имеют по множеству установленных подобных приложений (WhatsApp, Botim, Viber, Telegram, Jami, Teams, IVA, Skype и т.п.). Хотя бы потому, что с ОАЭ общаться надо через Botim или C’Me, с коллегами, через Teams или IVA, внутри локальной сети без выхода в интернет - через Jami.

            тем более опенсосный

            А почему "тем более"? Опыт показывает, что как раз такие наиболее безопасны, так как их код доступен для аудита.


            1. qqrm
              01.10.2023 16:03

              Доступен != проверен. Были статьи, что таким аудитом мало кто занимается. А если и занимается - то скорее в корыстных целях, без публикаций найденного.


              1. ptr128
                01.10.2023 16:03

                Доступен, значит нет препятствий для проверки. Сами можете проверить в любой момент. Код, надеюсь, не разучились читать, сидя на хабре? )


            1. Lfyz
              01.10.2023 16:03

              Каково пересечение "большинства, которое вы знаете" с ЦА рандомного бизнеса?


              1. ptr128
                01.10.2023 16:03

                Целевые аудитории в разных проектах настолько различны, что измерять среднюю температуру по больнице смысла не вижу )


                1. Lfyz
                  01.10.2023 16:03

                  Тогда откуда уверенность, что какие-то преференции смогут перетянуть ЦА в удобный бизнесу мессенджер?

                  Из предыдущего Вашего заявления у меня сложилось впечатление, что она основывается на выборке "большинство, которых я знаю"


            1. anmilez
              01.10.2023 16:03

              Вы можете привести пример опенсорсного мессенджера с функцией размещения контента, который будет востребован и продавцами реклами, и пользователями, которые ещё должны захотеть ради автора с его каналом читать не только телеграм-каналы (его постоянная аудитория), а ещё что-то отдельное опенсорсное.


              1. ptr128
                01.10.2023 16:03

                захотеть ради автора с его каналом читать не только телеграм-каналы

                Сам я "читаю телеграм-каналы" только с алертами из систем, за которые я отвечаю или которыми пользуюсь. И многие из этих каналов уже переведены на Jami. Благо swarm в Jami был стабилизирован еще в прошлом году. Ну и потому, что внутри локальной сети без выхода в интернет Jami замечательно рассылает алерты, в отличии от Telegram.


                1. anmilez
                  01.10.2023 16:03

                  И многие из этих каналов уже переведены на Jami

                  В этих каналах есть тысячи подписчиков, которые приходят почитать посты на досуге по вечерам, попутно скролля ленты в других соцсетях, и которых ещё нужно уговорить заходить не только в фб/вк/телегу/нужное добавить, а в ещё одно приложение, причём исключительно для того, чтобы почитать там канал автора?

                  Я не верю, что вы не видите разницу в кейсах.


                  1. ptr128
                    01.10.2023 16:03

                    В этих каналах есть тысячи подписчиков

                    В Россетях или РАО ЕС Восток - да, тысячи. Сама идеология swarm в Jami в принципе не накладывает ограничение на количество подписчиков. Ну и как я указал выше, никто не возмущался, так как там достаточно много хостов не имеющих выхода в интернет, но на которых важно видеть алерты.


                  1. ptr128
                    01.10.2023 16:03

                    Я не верю, что вы не видите разницу в кейсах.
                    почитать посты на досуге по вечерам, попутно скролля ленты в других соцсетях

                    Я просто не понимаю вообще на хрена это нужно. Попытки предпринимал. Но так мусора и рекламы при этом видишь 90%, то просто жалко своего времени.


                    1. anmilez
                      01.10.2023 16:03

                      Тут вопрос, зачем это нужно автору :)
                      И как сохранить это в рабочем состоянии с минимальными потерями


                      1. ptr128
                        01.10.2023 16:03

                        Находясь на специализированном техническом сайте, мне казалось, что тут больше технические вопросы рассматриваются, а не бизнеса заработка на телеграм каналах :)

                        Поэтому Telegram, Jami, WhatsApp, Viber и т.п. я и рассматриваю как инструменты, а не как атрибут целевой аудитории. Вот и позволяю себе свободно выбирать инструмент, не заботясь о том, насколько сложно клиенту будет ткнуть пальцем пару раз в магазине приложений. Так как мои клиенты уже готовы платить за нужную им информацию и им, в общем случае, совершенно монопенисуально, какими техническими средствами к ним эта информация будет доставляться. Лишь бы стабильно работало, гарантировало безопасность и клиентское приложение было бесплатным.


                      1. anmilez
                        01.10.2023 16:03
                        +1

                        мне казалось, что тут больше технические вопросы рассматриваются, а не бизнеса заработка на телеграм каналах

                        Конкретно в этом посте рассматривается вполне себе технический вопрос защиты контента администрируемых каналов от скомпрометированных ботов. Вопрос, который возник из-за недостаточной настраиваемости прав этих самых ботов.

                        Какую именно функцию они выполняют - реклама, заработок или борьба со спамом - не имеет значения, потому что суть проблемы от этого не меняется.

                        Использование мессенджеров, не имеющих аналогичной функции (каналы с управлением через ботов), проблему точно не решает :)


                      1. ptr128
                        01.10.2023 16:03

                        Использование мессенджеров, не имеющих аналогичной функции (каналы с управлением через ботов), проблему точно не решает :)

                        Поэтому я и вел речь о Jami, который через dbus поддерживает управление каналами (swarm) ботом.


                      1. anmilez
                        01.10.2023 16:03
                        +1

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


    1. acsent1
      01.10.2023 16:03
      +1

      Для блогоплатформ других решений и быть не может


      1. bogolt
        01.10.2023 16:03

        Mastodon? github pages? plain html ?


    1. anmilez
      01.10.2023 16:03

      А при чём тут мессенджеры? Автор использует телеграм как площадку для размещения контента не потому, что он мессенджер, а потому что он - площадка для размещения контента. Мессенджеров может быть хоть десяток (у меня их, например, больше десятка), но каналы даже как функция есть далеко не во всех. Это не говоря о том, что ещё подписчику надо согласиться лезть в условный вацап исключительно для того, чтобы почитать канал автора в нём, в то время как все остальные он читает в телеге. Вероятность близка к нулевой.


  1. dmitrye1
    01.10.2023 16:03

    Напомнило войны ботов в IRC, но там, вроде, архитектурный косяк, так с этим и похоронили. Хочется верить, что в Телеге поправят.


    1. GDragon
      01.10.2023 16:03
      +6

      Учитывая множество недоработок, косяков и просто неоднозначных решений в телеге которая сломя голову пошла путём сшибания бабла, методами очень схожими со скамом - сомневаюсь.


  1. nalinor
    01.10.2023 16:03

    Если же сделать этот API-запрос вручную, "насильно" выставив настройкуban_users, то обнаружится, что сервера Telegram по какой-то причине игнорируют её.

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


  1. Perlovich
    01.10.2023 16:03
    +5

    Немного добавлю к статье.

    например, планирование публикации постов

    Раньше было актуально, но в сам ТГ добавили планировщик. Мне кажется, около полгода назад дело было. Нормально работает, сам пользуюсь, не жалуюсь.

    Т.е технически у всех ботов, которые попадают в канал, есть "несгораемые" права по бану участников.

    Тут, мне кажется, важно пояснить, что в группах это работает по-другому. В группах есть отдельное право на бан пользователей, которое явно должно выдаваться боту (или человеку-администратору), если мы хотим, чтобы бот мог кого-то банить.

    Для тех, кто не в курсе разницы между каналами/группами, поясню. В каналы могут добавлять посты только админы (т.е. люди, которым мы доверяем). В группы может добавлять посты любой участник. Все комментарии в канале автоматически идут в привязанную к каналу группу. Довольно неочевидная система. Соответственно, для мониторинга спама/флейма/абьюза боты добавляются именно в группу, а не в канал.


    1. Naps
      01.10.2023 16:03

      В каналы например добавляются боты-админы, что бы принимать заявки на вступление.


    1. InsanusMokrassar
      01.10.2023 16:03
      +1

      В телеге до сих пор нет никаких возможностей ранжирования и взаимодействия (для админов, то есть с коллективной оценкой качества поста ПЕРЕД публикацией) с постами, а запланированные посты доступны только запланировавшему их. Так что ваш вариант с планированием публикации по таймеру является рабочим решением только если вы единственный админ в канале и у вас не контентный, а новостной канал (то есть появился пост - вы сразу его опубликовали)

      К слову, условный функционал предложек для каналов сейчас никаким образом не реализован, остаются только боты


      1. Kenya-West
        01.10.2023 16:03

        Всё понял, спасибо. Вот почему возможность планировки постов в ботах до сих пор существует - потому что в случае с ботом планированные посты видят все админы.


    1. anmilez
      01.10.2023 16:03
      +1

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


  1. ostrovityanin
    01.10.2023 16:03
    +5

    А как именно это "выяснилось"?

    Вы экспериментально этоп проверяли? Можете написать бота который с выключенным add members удалит у меня юзеров в канале?


    1. roman_deev
      01.10.2023 16:03

      Полтора года назад уже написали такого https://t.me/LyBlog/578 А с момента репорта об этом в Telegram прошло уже 2 года.


      1. ostrovityanin
        01.10.2023 16:03

        Спасибо. Проверил работает.


      1. ostrovityanin
        01.10.2023 16:03

        А почему скрипт не работает в чате?


  1. Germanets
    01.10.2023 16:03
    +1

    Может ли телеграм-бот забанить админов канала?)


    1. InsanusMokrassar
      01.10.2023 16:03

      Только тех, которых добавил сам, как я помню


  1. Desperandum_Oven
    01.10.2023 16:03
    -3

    Щас бы, имея возможность написать полнофункционального бота для контент менеджмента буквально с базовыми знаниями того же питончика, вместо этого добавлять проприетарный кал без исходников


    1. Fell-x27
      01.10.2023 16:03
      +6

      Не у всех есть базовые знания питончика. Не все - программисты. Не все - даже скрипткидди. Не все даже знают, что такое питон. Не все даже понимают элементарные, казалось бы, концепции, типа массивов.


  1. tantie
    01.10.2023 16:03
    +1

    Еще такие боты собирают данные о пользователях по их id. Затем эти данные появляются в базах данных, где можно узнать по id пользователя список его групп и др изменения профиля.


  1. enkryptor
    01.10.2023 16:03
    +2

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


  1. Penelope99
    01.10.2023 16:03
    +1

    Если такова опасность, что можно потерять весь канал, то лучше правда своего бота написать


    1. GDragon
      01.10.2023 16:03
      +1

      Формально ты теряешь не канал а всех подписчиков, но тут что пнём по сове, что совой об пень...


  1. Ksoo
    01.10.2023 16:03

    А нету еще проксей, который будут становится между ботом и апи, и фильтровать че этот бот себе позволяет?


    1. mayorovp
      01.10.2023 16:03

      Чтобы такую проксю поставить — надо бота хостить самостоятельно, а тут уже и своего собрать не настолько сложно становится.


      Кроме того, возникает проблема доверия этой самой проксе...