Обновить

Дыра в безопасности в Ze-Post: как подменить личность любого пользователя в мессенджере MAX

Время на прочтение4 мин
Охват и читатели30K
Всего голосов 65: ↑58 и ↓7+62
Комментарии73

Комментарии 73

ЗакрепленныеЗакреплённые комментарии

Ради интереса решил не верить на слово и попробовать самому. Итог в том же чате сообщение тест тест тест сосика колбаска был написан мной

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

Спасибо, надеюсь это поможет решить проблему. Не знаю куда стучаться.

потому что это программисты, а не разработчики, не путайте

Это не программисты, это вайбкодеры.

"Ну хоть что-то у нас в безопаности"

Самое жизненное из поста "У меня нет привычки писать публичные материалы".

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

Уверен, что ты создаешь что-то нужное и полезное.

Я из-за этого всю жизнь просрал

Почему Вы так решили?

Потому что никогда не считал нормальным чем-то делиться

Что изменилось?

По итогу у меня даже гитхаб нету

Завести и залить туда свои проекты не так уж и сложно.

А создаю что-то уже на протяжении 15 лет

LLM доступны даже бесплатно. Даёте папку с проектом, запрос на составление описания/эссе. Редактируете, публикуете.

LLM доступны даже бесплатно. Даёте папку с проектом, запрос на составление описания/эссе. Редактируете, публикуете.

Для меня останавливающим фактором является вопрос: "а зачем?". Получить один плюс за неделю работы? Вся главная в копроблогах, в которых совершенно точно нет накрутки. Какое-то неблагодарное это дело....

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

через пару дней зайдя в Max я удивился – сообщение даже не просматривали.

На скриншоте - то самое сообщение? Неудивительно, что его не отметили прочитанным. Тут достаточно двух секунд, чтобы полностью прочитать его во всплывающем уведомлении, безошибочно классифицировать как бесполезное "привет, как дела" и забить на него.

Если то самое, тогда и

Поэтому я крайний раз написал Сергею

должно было быть на скрине.

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

точно не знаю, что имеют ввиду люди, используя слово крайний вместо последний

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

В переводе с айтишного

Вы что, статью не для Хабра писали?

Я вот как раз автору хочу сказать спасибо за этот абзац. Потому что проблему именной умеющие айтишный язык люди поняли и по первым абзацам, а вот не-айтишники (да-да, бизнес, "лица, думающие, что принимают ИТ-решения" и прочие) - они как раз и понять не имели шанса (если им этот пост кто-то переслал/показал). А тут шанс появляется - поэтому уважаемому @Pakistanis-у большое спасибо!

@Pakistanis , у меня немного другой вопрос, обратный: если в максе можно запилить неверифицированного бота, то нельзя ли там сделать "просто бота для себя", чтобы себе, скажем, подборки RS-заголовков присылать, и прочую мелочь творить? В телеге такое запросто, но - апрель близок, а депутаты предпочитают только рассуждать о природе информационных атак, а не решать проблему потери половины России нужного мессанджера.

раньше можно было сейчас пока нет

им однозначно стоит задуматься о код-ревью

Чую тут вайбкодерами попахивает.

Нет, любая современная LLM по образцу документации сделает код с валидацией, как в примере. Могу проверить, если вам интересно ;)

Может они Гигачатом делали.

А тот не любит Макс? 🤣

Гигачатом 

Гигачадом.

У меня вот на телефоне по неведомой причине клава (кстати, от Яндекса которая) "Гигачат" заменяет на "Нигачат". И я прямо вот даже и не знаю...

Интересно.

Первый блин комом, хотел "интегрировать" Макс в самодельную автопостилку в социальные сети. Запрос: "Plan implementation of https://dev.max.ru/docs/webapps/ as a platform". Ответ.

Потом я спросил конкретно по уязвимости и запретил правки.

Ответ:

The article describes a signature verification vulnerability specific to Ze-Post's webhook/callback handling — not something that affects our implementation. Here's why our plan is safe and why this attack vector doesn't apply:

What the attack is: Ze-Post accepts incoming webhook callbacks from MAX users (comments, interactions) without validating the HMAC-SHA256 signature that MAX requires on the initData field. This lets attackers forge requests pretending to be other users.

Our implementation does not use webhooks or receive inbound events at all. We are a purely outbound poster bot:

  • We call the MAX API (POST /messagesPOST /uploads) using a bot token stored as a credential

  • We never accept inbound callbacks, webhooks, or initData from MAX users

  • There are no user-facing entry points into our MAX integration from the internet — users interact only with the local Skyfall web UI (which has no public exposure by design)

The vulnerability in the article is about initData validation for mini-apps / WebApp integrations (hence the URL dev.max.ru/docs/webapps/validation), where a bot receives user-submitted data and must verify it hasn't been tampered with. Our implementation has no such surface.

In summary: The plan as written is not vulnerable to this attack because we never receive or trust any data claimed to come from MAX users. We only send data to MAX using our own stored credentials.

What our code does: We call POST /messages on the MAX API using our own bot token. Messages are sent as the bot, not as any human user. The MAX API doesn't allow bots to impersonate human users — a bot can only post as itself.

The Ze-Post attack scenario: That vulnerability allows posting as a specific human user in a channel's comment section, because Ze-Post received user identity claims via webhook/callback and trusted them without signature verification. Our code never receives such claims.

What an attacker with WebUI access can do:

  • Post to any chat ID they type in, using any of the configured bot accounts

  • That's it — they're still posting as the bot, not as any human

What they cannot do:

  • Post as a different human user (not possible via Bot API at all)

  • Use credentials they don't have (bot tokens are stored server-side, never exposed in the WebUI)

  • Forge a MAX user identity (we never receive or process initData / user identity claims)

The attack surface for a WebUI-level attacker is identical to what the bot account already has permission to do — post bot messages to reachable chats. There's no elevation of privilege possible via MAX's API design.

Tl;DR: моя реализация автопостилки не подразумевает, что можно постить от лица кого угодно, кроме бота. А поскольку я параллельно пилил еще один велосипед, мои лимиты на ближайшие 5 часов успешно кончились.

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

Я так понимаю, надо просить написать ровно то, что делает Ze-Post? Делать посты и комментарии к ним от имени пользователя?

Я так понимаю, надо просить написать ровно то, что делает Ze-Post? Делать посты и комментарии к ним от имени пользователя?

Наверное. У меня нет большого опыта работы с Claude Code. Но в качестве эксперимента, было бы интересно проверить, сможет ли он end-to-end написать.

Судя вот по этому: https://dev.max.ru/docs/webapps/bridge#WebAppData - id пользователя подделывается в каком-то другом запросе. Валидировать можно не запрос, а именно сессию, что данные идут от конкретного пользователя.

А то, от чьего имени делается пост - это уже другая история. И вообще странно, что MAX вообще позволяет от имени другого пользователя создать сообщение.

P.S. И вообще, я, конечно, немного офигеваю от доступных webapp-ам действий: updateBiometricToken -- это как!? Дыра в безопасности не у бота, а у всего MAX.

Стойте... они запилили такое, и через него авторизуют на госуслугах и, свят-свят, на кассе при покупке "чего покрепче"?

Не русские люди такое делали, я тебе говорю!

Ради интереса решил не верить на слово и попробовать самому. Итог в том же чате сообщение тест тест тест сосика колбаска был написан мной

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

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

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

В браузерных =) Дюп шмоток в Diablo был настолько распространен что само слово dupe стало нарекательным

Это вы еще обработку ошибок в современных приложениях не видели :-)

так там её и нет :р

Ничего не понимаю, однако. Подскажите, пожалуйста, знающие, в тему ли мои вопросы и, если да, черкните ответ...

Ы1. Получается, что сам механизм мессенджера не предполагает проверку, что в канал пишет конкретный пользователь из конкретной авторизованной сессии? Это тогда не дыра в боте, а нечто другое, наверное?
Ы2. Зачем боту писать комментарии? Не понятно - для иллюзии движухи в канале или ещё зачем-то?

Я тоже что-того поразился что автора не смутил тот факт что сама архитектура мессенджера позволяет творить такую дичь. Ну поправит условный Сергей своего бота, что мешает реальному злоумышленнику выпустить лярд таких ботов спецом заточенных под уязвимость? Да тут сам мессенджер дырявый.

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

опять же если гипотетически рассылать будут из соседней страны то УК не поможет

Кажется я теперь понимаю почему там могут ботов делать только юр лица.

Причём, это требование просто уменьшит число попыток. Ведь в правилах не запрещено писать код с ошибками, верно?

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

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

Мессенджер в данной ситуации не дырявый. Комментарии - это полностью отдельная внешняя система, что-то сродни VK Mini Apps или мини-приложения в Телеграме, если такие аналогии применимы, и ничего общего оно с самим мессенджером не имеет. Все данные (скорее всего, для идентификации разработчик ограничился лишь userId, все остальное тянет через API Max) лежат в базе у разработчика, а вот что туда кладется - как раз таки и не валидируется.

А если от моего имени опубликуют какой-то дискредитирующий комментарий, ко мне придут вежливые люди в форме, или же нет? Что-то мне подсказывает на не самый приятный вариант.

Придут. Ко всем. Кого дома застанут.

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

И с точки зрения товарища майора авторство этого комментария не подвергается сомнению

Верно. В комментах твой ник, твоя аватарка, твой user_id — пройдемте гражданин.

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

Честно говоря, как по мне - это не оправдывает мессенджер. Хороша механика, которой можно "просто не воспользоваться"...

так и в телеге точь в точь. тут не в мессенджере дело

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

Много различного взаимодействия происходит через бот (инструкции, +реп, статистика, алерты, предупреждения). Куча разных сценариев.

Ну или да, для иллюзии движухи рассчитанных на невнимательных или возрастных юзеров.

Разработчик не виноват, что чат ЖПТ не знает!

Чатжпт знает то, что написано в доках, а в доках написано, что запросы должны проверяться. Так что как раз тот случай, когда нейронка лучше кожаного.

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

чатжпт напишет "я не стану обходить легитимные способы постинга, и не дам вам код, чтобы постить от имени кого угодно".

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

Шикарная возможность подставить любого пользователя!

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

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

в РБ делали проще - конфисковывали телефон и делали с ним все, что хотели. А потом игнорировалось то, что сообщения/подписки появились уже после того, как телефон отобрали

началась массовая политическая рассылка с антивоенными призывами

Вы говорите так, будто это что-то плохое.

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

Тащить политоту туда, где её быть не должно - это плохо.

Ещё хуже - когда она сама, без спросу, лезет во ВСЕ места.

О да, мы сейчас в таком месте, что в приличном обществе и слов то не найдётся — слишком долго не тащили «политоту».

Подскажите, кто в теме, у разбитых на части больших сообщений в Максе есть сквозной id? А то вот в Телеграме этого нет, это оказалось проблемой при отправке в бот сообщений более 4000 символов и идентификации разбитых на части входящих сообщений.

Нет сквозного id в максе вообще

А если нет Скама и регистрации в Скаме то и пользователя нет ?

К сожалению, МАКС не дает возможность получить нормальные имена у ботов, а цифры это ещё одна "дыра", т.к. это ИНН компании, которая создала бота.

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

Это те, кто успел зарегистрироваться до запуска МАКСа в массы.
После этого всем ботам и каналам стали давать ники по ИНН.
Если и у некоторых людей ники.

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

так и в других мессенджерах также как и в максе. дело в конкретном пофигизме разработчика бота.

Этот бот, возможно, действительно не задействовал механику из-за пофигизма разработчика. Другой бот может не задействовать её уже специально.

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации