Pull to refresh

Comments 110

Блин, ну хз... Вы ожидали, что будут трекать браузер? Что-то мне подсказывает, что много есть сайтов, где можно вот так войти.

Фингерпринтинг хотите?)

Фингерпринтинг хотите?

Ви так говорите, как будто его там всё ещё нет.

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

Ожидал что для браузера будут использовать httpOnly куку, а токен будет работать временно. В случае XSS смогут увести только временный токен.

Насколько я понял, всё-таки не так много сайтов, где можно войти именно вот так, тем более мессенджеров. В WhatsApp, например, так просто не выйдет: ключи лежат в IndexedDB как non-extractable, отдельным значением их не скопировать. Перенести сессию можно только клонированием всей базы или профиля целиком, а это совсем другой уровень возни.

Правильно токен держать в HttpOnly-куке или вообще не отдавать в браузер (BFF). Тогда его не прочитает ни один скрипт на странице: ни XSS, ни левое расширение не утащат. Это и есть разница с localStorage, откуда токен достаёт любой JS. Фингерпринтинг для этого не нужен.

в whatsapp все очень сложно, там даже перенос переписки между девайсами - тот еще кейс.

openai через перекупов так и покупается подписка))

Так просто, как в MAX, ни в один другой мессенджер не зайдёшь. В Telegram, например, не один токен, а несколько ключей (по дата-центрам), и лежат они вразнобой — собрать сложнее. В WhatsApp токен в таком виде вообще не хранится: ключи в IndexedDB, по отдельности не вытащить. А в MAX — одна строчка, 10 секунд работы. Для мессенджера, претендующего на цифровой ID… ну такое, как по мне.

Ерунду не пишите. Веб-версии у всех одинаковые, ничего нового ни в одном мессенджере не придумали (да и вообще ни в одной программе). Сервер не знает откуда вы посылаете данные - и будет их отрабатывать точно также. Попробуйте сами - зайдите в Телеге через веб-интерфейс и потом тем же способом скопируйте всё из localStorage - эффект будет тем же самым. Обычный токен жизни. Он и у OAuth также работает.

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

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

Спасибо, не видел этот гайд. Там всё подробно описано как нужно и как не нужно.

Правильно токены хранят не в localStorage: его читает любой скрипт, при XSS токен сразу утекает. Нормальный способ это HttpOnly + Secure + SameSite кука: JS её не прочитает, браузер сам подставляет, CSRF закрыт. Ещё вариант: короткий access-токен в памяти, refresh в той же httpOnly-куке с тихим обновлением. Самый чистый это BFF: токен вообще не отдают в браузер, он живёт на бэкенде, фронт ходит по httpOnly-сессии.

А в MAX токен лежит открытой строкой в localStorage. То самое, от чего гайд предупреждает.

Плюсанул. Раньше не особо задумывался. Но если это реально так просто (в смысле «сделать нормально»), то да, есть вопросики к «национальному мессенджеру»

Да я хз, тут на хабре какая-то секта хранителей токена в localStorage орудует. Не первый раз замечаю. Одни безапеляционно такую дичь несут, а другие их плюсуют :) Да, браузер небезопасное место для хранения сенситив данных.
Но одно дело положить деньги на стол, а другое в сейф. И так и так грабители обнесут, но во втором случае это будет сделать сложнее и займёт у них больше времени.

Есть токены которые просто не поместятся в куки. И если вы так не доверяете своему же фронту, что у вас возможен XSS, то утечка токена не самая большая ваша проблема.

Лимит размера у куки реальный, но это аргумент за то, чтобы не раздувать токен, а не за localStorage. XSS - это не про доверие своему фронту. Уязвимость прилетает через сотни сторонних зависимостей, аналитику, рекламу или скомпрометированный npm-пакет, и весь смысл httpOnly в том, чтобы токен нельзя было украсть даже при XSS, который вы не смогли предотвратить. А украденный токен это как раз большая проблема - в отличие от действий в моменте, его можно вынести наружу и использовать вне браузера жертвы, с другого устройства и после закрытия вкладки.

Пускать аналитику, а уж тем более РЕКЛАМУ на страницы, где есть секретные данные - это выше моего понимания :) Точно также как тянуть пакеты без проверки при каждом билде и без конкретной версии. В целом конечно да, вы правы, но иногда другого выхода нет (к примеру, API,которые просят класть токен в заголовок). Поэтому решаем проблему с XSS для начала, а потом уже всё равно как что хранить. Но это больше философский спор уже :)

Доооо, кражу кук из браузера так с девяносто лохматого года и не придумал никто)

Если в телеге именно так, выходит что это не уязвимость, а стандарт индустрии.

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

И не понятно, зачем список устройств есть?

С другого устройства это не сработает. Речь о том, что на одном и том же компьютере неважно, какой программой открывать страницу.

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

с другой стороны, это удобная фича

Сервер вряд ли продолжит сессию на другой адрес. Разве только если оба компьютера сидят за одним NAT (или в одном VPN). Но работу из VPN вроде как Макс не одобряет.

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

Сессия десктопной телеги спокойно переживает переезд с одного адреса на другой. Берёте два компа/ноута, один подключен через стационарный провайдер, другой через мобильный (tethering например). Флешкой переносите телегу туда-сюда. Всё работает. Правда, я не пробовал запускать одновременно, как-то нужды не было.

дисклеймер: сей финт ушами я проводил пару лет назад, возможно сейчас это не сработает

интересно - попробуем.

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

Я отвечал на этот комментарий, там речь шла не только о смене IP, но и о переносе с компа на комп.

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

я пробовал, работает

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

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

попробовал - чуть сложнее , бабушка сразу не справиться но вы правы. вводим например это copy(JSON.stringify(Object.fromEntries(Object.entries(localStorage).filter(([k])=>/^dc(\d+_auth_key|\d+_server_salt)?|^user_auth|^account\d+$/.test(k))))) , берем таким образом все ключи авторизации потом вот так их аккуратно вставляем const o=JSON.parse(prompt(‘вставь ключи Telegram’));for(const k in o)localStorage.setItem(k,o[k]);location.reload() (после вставляем ключи ). Но тут все таки пришлось повозиться . у телеграмм это не один ключ а связка MTProto-ключей. А что по поводу whatsup скажите ? как там войти ,я пока не смог .

Нажмите Ctrl + Shift + J. Откроется чёрное окно консоли.

У вас ошибка. Не черное, а белое окно.

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

А мне вот интересно: если держать сессию только в браузере (выключив макс на материнском смартфоне) - сколько такая сессия проживет? Где-то в глубинах кода приписан срок протухания токена?

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

на смартфоне можно выйти это никак не повлияет на токен из браузера

Это понятно (и уже проверено :)).

Вопрос в продолжительности сольной работы веб-версии.

У вацапа например ограничены. Пару недель вроде.

У меня чёрное.)) Тему в DevTools меняют через F1, так что у всех по-разному ты прав, в статье формулировку поправлю.

По куке: тут и не кука. У MAX вход лежит строкой в localStorage берёшь её из консоли и вставляешь в другой браузер, входит. Куку, если она HttpOnly, из консоли так просто не вытащишь, видно только во вкладке хранилища. А эта строка лежит открыто и копируется одной командой. Так что не «как кука», а доступнее. ну и это мессенджер все таки как я уже сказал претендует на цифровой id . c whatsup или телегой такой фокус бы не удался. суть то в том что это сделать просто .

>>Куку, если она HttpOnly, из консоли так просто не вытащишь

document.cookie

document.cookie не возвращает cookie с флагом HttpOnly - это и есть смысл флага.

Вы ещё скажите, что его в Development Tools -> Network -> Headers -> Request Headers -> Cookie: не видно и скопировать невозможно!

Можно, но где я об этом писал? Я чисто про document.cookie. Утверждение товарища выше ошибочно

согласен, мой косяк, не внимательно читал.

Вы еще скажите, что JS-инъекция доступ к девтулзам имеет

У вас ошибка. Не черное, а белое окно.

У кого белое — а у кого чёрное, бвана!

Тут новости пролетели:

MAX пропал из Google Play — пользователи сообщают, что мессенджер больше не отображается в магазине приложений во всех регионах.

Давай досвиданья!

Проверил - действительно нет ....весело . Но с андройд проще есть сторонним магазины и возможность установить на прямую apk. Вот с ios сложнее . Кстати на днях выложу форк для ios . Тестирую пока все работает . Через тест флайт можно будет установить или себе залить и пересобрать свой max . .. если он вообще кому нибудь нужен ещё .

У меня отображается и скачивается

Пишут что и Хуавей удалила но у меня пока есть в appgallery а вот в google play ещё раз проверил уже нет . И похоже это не связанно с санкциями .

Пишу из рандомного региона - макс на месте.

Может потому что Max стал Макс? у меня в гугл плей есть

Никуда не пропал, вроде.

*
*

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

Ставить я не хочу, но в поиске гугломаркета оно отображается с кнопкой "установить".

К сожалению, рано обрадовались... Пишут, что они исчез из всех регионов, кроме этого...

В Казахстане доступен.

В каком регионе остался рф?

РФ? Наверное, в РФ...

Макс никогда не ставил.

Сейчас проверил из своего забугорья - в гугл плей макс присутствует, в самсунговском сторе тоже в наличии.

Я в рф живу , но ак Американский (чтобы оплачивать приложения) и у меня нет max теперь .

повезло

Сложно удержаться

Я так смотрю что наступил момент смирения. Статьи про эту дрянь перестали набирать минусов. Все по советскому анекдоту

“третий секретарь райкома”: - завтра повесят каждого 10-го

“голос из зала”: - веревку свою принести или профком обеспечит?

Минуса - это конечно смело, очень смелая борьба.

Провокатор из ФСБ? Все сделаете ради очередного звания…

Ну а твой комментарий это о чем? Ты сам что делаешь? Смирился или мужественно борешься минусами?)

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

Точно! провокатор на зарплате.

Скучно. На РФ если ты не в курсе, то закрыть могут любого в любое время. Безо всякого повода. Ну а ты обычный трус. Как ты детям в глаза смотришь?

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

А зачем нормальной статье ставить минус?

Минус ставится пропаганде, рекламе и т.п.

В чем ваше беспокойство? Срок действия токена наверняка короткий, так что если ваш токен как-то украдут, через некоторое время Макс перестанет его принимать. Если нет refresh-токенов.

А рефреш токен тоже в локал-стородже, шучу. Вообще использовать рефреш токен на сайте - не очень правильно. Тут лучше кука подходит.

Так это же обычный угон куки получается (Cookie Hijacking / Session Hijacking). Таким образом можно красть авторизованную сессию от любого сайта. Авторизовались на одном компе, скопировали с него куки на другой комп и сайт считает, что на втором компе вы тоже авторизованы, хотя никакие логины и пароли вы там не вводили.

Как минимум ещё адрес должен совпасть.

Это немного не так работает. Обычно выдаётся короткоживующий токен, очень часто JWT, где прописан срок протухания. Пока он жив, ты можешь обращаться к сервису. Срок его жизни может быть и пол часа и час. Когда токен протухает, в ход идёт рефреш токен, который можно хранить уже в Cookie, которые недоступны из JS, а значит его через JS уже не угнать, только лезть в кишки баузера, а потом также через кишки вставлять эту cookie в другой браузер. Так что угон этой cookie даст тебе доступ к сайту максимум на час, если, конечно, разработчики не идиоты и не выставили время жизни access токена на большой срок. Через час токен протухнет и старый браузер обновит его, а новый браузер обломается, поэтому что у него нет refresh токена.

Жаль автор не глянул хотя бы через jwt.io что там внутри токена. Если это был обычный JWT, то там должна быть информация, когда токен протухает. Если время протухания далеко в будущем, то это точно будет фейл.

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

Это важное замечание. Т.е. если "а это у всех так и ничо" потому что не заморачиваются, то подсвечивать "школьниковость" важно и нужно. Иначе в соседнем треде "ачотакова жили без HTTPS и ничо".
Есть рабочие полноценнные механизмы защиты? Надо внедрять. Есть проблемы с совместимостью защиты? Надо решать.

Но работа под своей учёткой в Windows - уже считается Trusted. Если вы не можете доверять учётной записи под которой сидите, то как вообще вы собираетесь хранить ключи, пароли, хэши и тому подобное?

Местные на самом деле должны со слезами на глазах благодарить РКН: столько зонтичных инфоповодов дали для дешевого (зачастую и нейрослопового) хайпа: макс, впн, блокировки... Карму набить в таких условиях просто как переслать пакет по I2C

Согласен , это стало так же легко как и набить лайки и карму если все это хейтить. ))

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

Плюс я свой макс не привязывал ни к каким госуслугам и т.п. Ибо нефиг.

Хороший вопрос - я проверю на сколько легко .пока речь шла о том что достаточно 10 сек доступа физически к пк и токен ваш. (повторюсь так просто с др мессенджерами не работает) .

За несколько секунд можно и профиль браузера утащить, а это точно сработает с другими мессенджерами (и не только с ними). Или трояна воткнуть.

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

Ещё вопрос - можно ли этот токен на другой комп утащить?

конечно можно. можно даже в приложение вставить если его сделать . вот например я сделала для android стабильную версию (могу исходниками поделиться если интересно изучить).

За 10 секунд набить js скрипт и запомнить строку с ключом :)

Сторонний сайт - возможно нет. А что насчет расширений с правами на content injection на * ? есть такие, где это надо по вполне легитимным причинам но одна дыра (или, раз уж Макс это (как заявляют) типа официальный госмесенджер который (согласно рекламе) ловит в любых лифтах(в том числе видимо в лифтах бункера Ямантау)) то нужно было позаботится о защите потому что могут в ход пойти совсем интересные атаки на расширения (особенно учитывая что большинство авторов этих расширений - тоже не из России).

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

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

Да, похоже реально. Расширение с content-script на всех урлах видит localStorage страницы, значит __oneme_auth прочитает и сольёт, сразу у всех своих юзеров. Это серьёзнее стороннего сайта: сайт не достанет из-за cross-origin, а расширение достанет.

Но похоже , к Telegram это применимо так же: он тоже держит ключи сессии в localStorage, то же расширение их прочитает. Разница только в том, что у MAX один bearer-токен, а у TG связка ключей, для скрипта без разницы. Устойчивее всех WhatsApp: ключи в IndexedDB non-extractable, сырой ключ скрипт не выгрузит.

Вектор общий, но спрос именно к MAX выше: его продают как защищённый госмессенджер под цифровой ID. От такого ждёшь, что сессия не будет валяться в localStorage.

Интересно, если открыть и закрыть вкладку в инкогнито - токен удалится?

Если закрыть только вкладку, а не окно(есть хотя бы одна вкладка в окне инконгито), то localStorage не чистится.

ИМХО, для данного мессенджера, на который смотрят миллионы глаз и большинство с критикой, надо было более тщательно продумывать процесс, а не хранить, как у обычных низкокритичных web-приложений, секретный токен в localStorage. Есть посложнее методики и протоколы auth для такого всё же.

Именно на это я и хотел обратить внимание. есть другие методы хранение токена и его выдачи.

Смею разочаровать автора, он "раскрыл" то, что является базовым принципом: Whoever bears the token is treated as the authenticated user. Буквально на уровне утверждения о уязвимости замка двери типа "я сделал дубликат ключа, а он открывает дверь".

Что же, ждём "взлом" остальных 95% процентов сайтов и API в интернете (этим же способом).

Автор не ставил целью раскрыть некий секрет . Автор указал на простату с которой можно это сделать в мессенджере претендующий на цифровой паспорт. Повторюсь еще раз в том же whatsup так не получиться. одной строчкой токена как тут нет ни в одном мессенджере .

Простата - это несколько иное, "но ход ваших мыслей мне нравится..." )))

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

Хранить токен в httpOnly Secure SameSite cookie вместо localStorage. Привязывать сессию к fingerprint браузера (User-Agent + IP + часовой пояс). Отслеживать смену геолокации/IP внутри одной сессии, при подозрении — сбрасывать токен. Использовать короткоживущий access-токен + отдельный refresh-токен с одноразовой ротацией. Показывать пользователю список активных сессий с возможностью принудительно завершать. Добавить Content Security Policy: script-src ‘self’ — усложнит выполнение стороннего кода. Требовать подтверждение через email/SMS/QR при входе с нового устройства. Инвалидировать токен при нажатии «Выйти» на серверной стороне, а не только на клиенте.

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

В заголовке не хватает слов ШОК и СЕНСАЦИЯ!!!

А если серьёзно, то при наличии доступа к отладочным инструментам на доноре не спасут ни куки, ни смс коды, ни 2фа через totp. Всё спокойно переносится на другой комп стандартными средствами отладки. Единственная реальная защита это либо нормальный электронный ключ с неизвлекаемыми аппаратными ключами, либо скрэтч-карта с одноразовыми кодами. Но как правило гении её сразу полностью стирают и сканируют.

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

Для таких случаев делают обновление токена. Просто не всем нужно настолько заморачиваться

Нет у менян был вариант "Скандалы интриги расследования , показать все что за кадром все что скрыто", но вспомнил , что это хабр и так минусов наставят полный вагон - не стал обострять .А если серьезно то суть то не сценарии когда чужой дядя за твоим ноутом, а расширение или XSS, которые читают localStorage у всех разом и удалённо. Вот тут HttpOnly как раз работает: куку скрипт не прочитает, а голую строку из localStorage прочитает запросто. Так что «нифига не спасёт» это только про случай, когда машину ты уже физически отдал.

Даже с "физически отдал" - может все делать физически только на этом устройстве или легко воспроизвести потом на любом другом и пользоваться достаточное время, если доступ физически утерян?
Аналогия - разблокированный смарт попал в руки. Можно что-то делать в незаблокированных приложениях, но так чтобы прямо забрать все и элементарно входить на любом устройстве (код-пароль, отпечаток, faceID, ввод пароля) - такого быть не должно.

Именно, напихать полезную нагрузку на расширение (например, сделать какой нибудь обход блокировки, народ подтянется) и забрать local storage. А если токе ещё и действует долго, вообще красота. Вроде как коды подтверждения половины платформ, связанных с Госуслугами, на макс приходят

Sign up to leave a comment.

Articles