На конференции 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”), при котором дополнение получает доступ к сайту только после клика на пиктограмме в правой части панели с адресной строкой. В качестве обходного пути защиты также упоминается отключение автозаполнения форм и копирование паролей вручную через буфер обмена, но при этом возникает проблема с утечкой данных из общего буфера обмена и опасность не заметить попытки фишинга.