LINUX.ORG.RU

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

 , , , ,

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

3

3

На конференции DEF CON 33 представлен метод атаки на браузерные дополнения, подставляющие свои элементы интерфейса в просматриваемую страницу. Применение атаки к дополнениям с менеджерами паролей может привести к утечке хранимой в менеджерах паролей информации, такой как параметры аутентификации, параметры кредитных карт, персональные данные и одноразовые пароли для двухфакторной аутентификации. Проблема затрагивает все протестированные менеджеры паролей, включая 1Password, Bitwarden, LastPass, KeePassXC-Browser, NordPass, ProtonPass и Keeper.

Метод атаки основан на том, что браузерные дополнения подставляют диалог с запросом автоподстановки пароля непосредственно на отображаемую страницу, интегрируя свои элементы в DOM (Document Object Model) данной страницы. Если атакующий имеет возможность выполнить свой JavaScript-код на странице, например, эксплуатировав XSS-уязвимость на сайте, то он может манипулировать всеми элементами в DOM, в том числе подставленными браузерными дополнениями.

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

Атака сводится к следующим шагам:

  • Создание навязчивого элемента на странице, стимулирующего совершение клика.
  • Добавление на страницу web-формы для входа или заполнения персональных данных.
  • Выставление прозрачности для web-формы («opacity: 0.001» в CSS).
  • Использование метода focus() для выставления фокуса ввода на поле в форме, приводящего к активации диалога автозаполнения менеджера паролей.
  • Поиск появившегося диалога менеджера паролей в DOM и выставление для него прозрачности.
  • Ожидание клика пользователя на видимом навязчивом элементе на странице, который при должном совмещении видимых и невидимых элементов приведёт к нажатию на кнопку в прозрачном диалоге и заполнению полей менеджером паролей.
  • Извлечение данных из заполненной web-формы и отправка их на сервере атакующего.

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

Отмечается, что многие пользователи используют один менеджер паролей как для хранения параметров входа, так и для генерации одноразовых паролей для двухвакторной аутентификации, что позволяет использовать рассматриваемый метод атаки при автозаполненении одноразовых паролей. В качестве примера продемонстрирована атака на сайт issuetracker.google.com, содержащий XSS-уязвимость. Для получения параметров входа и кода для двухфакторной аутентификации достаточно отправить пользователю ссылку, эксплуатирующую XSS-уязвимость, и добиться трёх кликов через подстановку фиктивных навязчивых запросов (разрешение обработки Cookie, разрешение персонализации и согласие с политикой обеспечения конфиденциальности).

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

Атака также может применяться для определения сохранённых в менеджере паролей персональных данных пользователя и параметров кредитных карт. При этом для утечки подобных данных нет необходимости в выполнении JavaScript-кода в контексте чужого сайта и достаточно заманить жертву на страницу на сайте атакующего - в случае персональных данных заполнение web-форм производится на основе их типа (адрес, номер кредитной карты, ФИО), без привязки к домену. Наиболее опасной является утечка параметров кредитных карт, так как менеджеры паролей подставляют не только номер карты, но и дату окончания действия и проверочный код.

Выявивший проблему исследователь протестировал 11 браузерных дополнений с менеджерами паролей, в сумме насчитывающих 39.7 млн. активных установок, и все они оказались не защищены от подобного вида атак. Некоторые производители выпустили обновления (NordPass 5.13.24, ProtonPass 1.31.6, RoboForm 9.7.6, Dashlane 6.2531.1, Keeper 17.2.0, Enpass 6.11.6, Bitwarden 2025.8.1), в которых обходным путём попытались блокировать проведение атаки. Другие дополнения (KeePassXC-Browser, 1Password, iCloud Passwords, Enpass, LastPass, LogMeOnce) пока остаются без исправления. Для проверки проявления уязвимости в различных менеджерах паролей опубликован набор тестовых страниц.

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

Среди предлагаемых автором исследования методов защиты упоминается отслеживание изменения стилей подставляемых на страницу элементов при помощи API MutationObserver, блокировка изменений через Shadow DOM в режиме «closed», мониторинг за выставлением прозрачности элементов, задействование API Popover для вывода диалогов, проверка наложения слоёв, временное отключение обработки событий указателя (pointer-events:none) во всех плавающих элементах во время вывода диалога менеджера пароля. При этом для полного блокирования описанного класса атак рекомендуется на уровне браузера реализовать отдельный API для защиты от кликджекинга.

В качестве универсального метода защиты в браузерах на основе движка Chromium пользователям рекомендуется включить режим подтверждения доступа дополнения к сайту (Настройки дополнения → «site access» → «on click»), при котором дополнение получает доступ к сайту только после клика на пиктограмме в правой части панели с адресной строкой. В качестве обходного пути защиты также упоминается отключение автозаполнения форм и копирование паролей вручную через буфер обмена, но при этом возникает проблема с утечкой данных из общего буфера обмена и опасность не заметить попытки фишинга.

>>> Подробности на opennet



Проверено: dataman ()
Последнее исправление: dataman (всего исправлений: 5)

Красивая атака. Интересно как именно её фиксили авторы сторонних дополнений ведь проблема и вправду фундаментальна и не специфична для конкретного расширения.

zabbal ★★★★☆
()
Ответ на: комментарий от PunkPerson

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

./script.sh | wl-copy
rtxtxtrx ★★★
()
Последнее исправление: rtxtxtrx (всего исправлений: 1)

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

anonymous_sama ★★★★★
()
Ответ на: комментарий от anonymous_sama

нужно юзать встроенный менеджер паролей и не будет ни каких проблем. Там это не встраивается в страницу.

mx__ ★★★★★
()
Последнее исправление: mx__ (всего исправлений: 1)
Ответ на: комментарий от mx__

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

anonymous_sama ★★★★★
()
Ответ на: комментарий от anonymous_sama

Интересно как эти дополнения работают если браузер запускается в flatpak.

mx__ ★★★★★
()

Извлечение данных из заполненной web-формы и отправка их на сервере атакующего.

Что-то до боли знакомое.

Спасибо за информацию, коллекционирую подобное.

sparkie ★★★★★
()

Прочитал это и аж радостно стало, что пользуюсь только локальной самописной фигней

Undeadguy
()
Ответ на: комментарий от vbr

Ничего надёжней файла Пароли.txt ещё не придумали.

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

Beewek ★★★
()
Ответ на: комментарий от Beewek

Хм. Судя по этой статье:

https://discourse.flathub.org/t/how-to-run-firefox-and-keepassxc-in-a-flatpak-and-get-the-keepassxc-browser-add-on-to-work/437/10

Браузер дополнение сделали чтобы связывать flatpak-firefox и нативный KeepassXC, по другому их не связать.

mx__ ★★★★★
()

Выставление прозрачности для web-формы («opacity: 0.001» в CSS).

Зачем вообще нужна эта фигня? Не общая прозрачность а прозрачность в web-форме? Там же были поля хиден и т.д.

mx__ ★★★★★
()
Ответ на: комментарий от mx__

Я ж говорю - без интеграции с браузером. Просто копируешь в KeepassXC пароль в буфер обмена, и потом вставляешь его в нужное поле браузера.

Beewek ★★★
()
Ответ на: комментарий от anonymous_sama

В Xorg было нормальное автозаполнение,

Это как? Как ты в браузере

  1. поймёшь, что появилась на странице форма ввода, на которую надо реагировать?
  2. поместишь в значения полей ввода нужные значения логина и пароля?
LamerOk ★★★★★
()
Ответ на: комментарий от mx__

Так сейчас у всех почти все на телефоне + сим-карта привязанная везде. Да, пароль, но только уведомления на экране блокировки ни кто не скрывает )) Бери, что хочешь называется. Попал телефон не в те руки. Пока сим-карту восстановишь, телефон новый + получить доступ к аккаунтам, а уже все что можно уже угнали

Philip2007
()
Ответ на: комментарий от LamerOk

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

anonymous_sama ★★★★★
()
Ответ на: комментарий от Beewek

Ну, в контексте ОП-поста, и разницы нет, и обсуждать не имеет смысла.

LamerOk ★★★★★
()
Ответ на: комментарий от anonymous_sama

Мышку ставишь в поля ввода логина
оно вводит

Дублируем вопрос №1 ещё раз: как "оно" поймёт, что это поле ввода логина? Как "оно" вообще узнает, что "мышку поставили"?

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

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

PunkPerson
() автор топика

А всего-то нужно было не допускать в css значения opacity меньше 0.1 со стороны браузера.

И сразу и это не работало бы и половина других подобных клик-угонов. Всё, что меньше 0.1 должно быть некликабельным.

PPP328 ★★★★★
()
Ответ на: комментарий от PunkPerson

встроеные в браузер

Именно. А речь шла про якобы существующий в X’ах способ это сделать:

В Xorg было нормальное автозаполнение,

без встраивания плагина в браузер.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Я посмотрел код, оно просто Tab нажимает для перехода на следующий input execKey(Qt::Key_Tab); // → XK_Tab окно же находится по X11::raiseWindow(WId window) т.е. это буквально находим окно и далее ввод и нажатие клавиш.

anonymous_sama ★★★★★
()
Ответ на: комментарий от anonymous_sama

Под wayland это не работает, так как только compositor может получить данные об активном окне. Но можно добиться такого же с xdg-desktop-portal через gdbus например, что будет работать под gnome, kde. Поэтому честно, я не знаю почему никто не пошел по такому пути. Наверное просто свой велосипед на js в браузере приятнее входит.

anonymous_sama ★★★★★
()
Последнее исправление: anonymous_sama (всего исправлений: 1)
Ответ на: комментарий от anonymous_sama

оно просто Tab нажимает

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

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

"Ручной" вариант мы щас не рассматриваем.

Наверное просто свой велосипед на js в браузере приятнее входит.

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

LamerOk ★★★★★
()
Последнее исправление: LamerOk (всего исправлений: 1)
Ответ на: комментарий от Beewek

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

А толку, если ты этот пароль рядом вводишь. Если кто-то файлы стащил, то он и кейлоггера тебе подсадит или в память процесса залезет. Чисто теоретически ты прав, конечно, типа кто-то твой диск стащил и тд, но это прям надо много допущений сделать.

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

Ну затирай сам, долго что-ли выделить что-нибудь другое и нажать ктрл+ц. Да и сложно мне представить, когда это может быть важно. Если кто-то буфер обмена мониторит, то ему и миллисекунды хватит, чтобы вытащить пароль. А если ты его куда-то по ошибке вставил не туда, то в 99.99% случаев в этом ничего страшного нет, удалишь просто и всё. Функционал полезный, но не критичный.

vbr ★★★★★
()
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от LamerOk

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

Просто ты выбираешь пункт автоввод в менеджере паролей для нужной записи, заранее выставив фокус ему на первый input, и он начинает ввод. Т.е. условно это не сильно от xdotool отличается.

anonymous_sama ★★★★★
()
Последнее исправление: anonymous_sama (всего исправлений: 1)
Ответ на: комментарий от vbr

Функционал полезный, но не критичный.

А ещё иерархическая структура хранения (мне проще ориентироваться), и удобный генератор с выбором набора символов. В целом, конечно, это тот же самый файл Пароли.txt, но с дополнительными плюшками. Так что я не согласен с твоим исходным «Ничего надёжней файла Пароли.txt ещё не придумали.» Придумали.

Beewek ★★★
()

Кто может мне объяснить, как вообще работает xss? Только через рекламу что ли?

mx__ ★★★★★
()

Если атакующий имеет возможность выполнить свой JavaScript-код на странице

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

Stanson ★★★★★
()
Ответ на: комментарий от Stanson

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

u-235
()
Ответ на: комментарий от u-235

В любом случае js должно сформировать форму чтобы плагин туда все что нужноe подставил, и опять же пользователь должен куда то еще нажать …

mx__ ★★★★★
()

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

alysnix ★★★
()

Проблема затрагивает все протестированные менеджеры паролей, включая 1Password, Bitwarden, LastPass, KeePassXC-Browser, NordPass, ProtonPass и Keeper.

Дополнение Kee, которое для Keepass, не проверяли, или оно не подходит под определение менеджера паролей, потому что работает с программой, а не само по себе?

Radjah ★★★★★
()
Ответ на: комментарий от Somebody

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

LunarStar
()
Ответ на: комментарий от mx__

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

LunarStar
()
Ответ на: комментарий от anonymous_sama

Просто ты выбираешь

Об этом и речь. Это руками, а вопрос был про не:

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

«Ручной» вариант мы щас не рассматриваем.

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

LamerOk ★★★★★
()
Последнее исправление: LamerOk (всего исправлений: 1)
Ответ на: комментарий от LunarStar

Что-нибудь вроде «ДанеП0мнюЯЭтот_ч0ртов-паР0Л!» — на другом регистре, разумеется.Можно часть на одном, часть — на другом.

Запоминать не особо сложно, главное — сам принцип помнить. Я такому пользователей учил, на последнем месте работы «на дядю. Ничего, и придумывали, и помнили. Пароли там менять надо было каждые 28 дней, кажется....

Примерно такие пароли сгодятся?.. ;)

Я хз какую тут память нужно, чтоб такое запомнить.

Мозги тут нужно, а не память...

Somebody ★★★★
()
Ответ на: комментарий от Somebody

Мозги тут нужно, а не память…

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

LunarStar
()
Ответ на: комментарий от LunarStar

Брутится всё, что ниже 250бит энтропии

Ох уж эти сказочки, ох уж эти сказочники. Ты и 50 не забрутишь.

vbr ★★★★★
()
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от vbr

Ничего надёжней файла Пароли.txt ещё не придумали.

Ничего надёжней файла Пароли.kdbx ещё не придумали.

basilic ★★★
()
Ответ на: комментарий от vbr

Чисто теоретически ты прав, конечно, типа кто-то твой диск стащил и тд, но это прям надо много допущений сделать.

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

basilic ★★★
()
Ответ на: комментарий от basilic

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

Так и есть. Сейчас полнодисковое шифрование это уже стандартная опция, что в винде, что в макоси.

vbr ★★★★★
()
Ответ на: комментарий от Beewek

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

Absolutely!

basilic ★★★
()

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

anc ★★★★★
()
Ответ на: комментарий от LunarStar

Учитывая что большинство вот таких паролей легко брутятся.

В смысле таких? ВЫ заявляете что легко брутятся ЛЮБЫЕ пароли.

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

mx__ ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.