Почему может быть опасно держать открытыми Mini Apps в Telegram или где нибудь ещё: Focus Hijacking на практике

Почему может быть опасно держать открытыми Mini Apps в Telegram или где нибудь ещё: Focus Hijacking на практике — Cybersecurity | Versia.media

Итак, вы находитесь в Telegram Web и запускаете безобидное на первый взгляд Mini App, сворачиваете его или просто переключаетесь на соседний приватный чат, чтобы продолжить переписку. Казалось бы, контексты изолированы, фрейм приложения неактивен, и вы в полной безопасности. Но так ли это на самом деле?

Все началось с малозаметных новостей от малоизвестного блогера, известного в сети как «Дядя J», который упомянул странное поведение Mini Apps в Telegram и не только. Проблема заключалась именно во фрейме. Я решил проверить эту концепцию, и вот что из этого вышло.

Суть кроется в функции метода управления фокусом страницы (window.focus()). Браузер позволяет дочернему фрейму запрашивать фокус с помощью метода window.focus(). Скрипт устанавливает обработчик на событие blur самого окна. Как только пользователь пытается кликнуть на чат Telegram или переключить внимание на мессенджер, фрейм фиксирует потерю фокуса (срабатывает blur), запускает таймер и через 5,7 секунды агрессивно возвращает фокус обратно себе. setInterval, каждые 15,7 секунды, проверяет: если фокус ушел, его нужно вернуть. В результате фрейм время от времени принудительно забирает фокус.

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

Первая часть кода отвечала за захват фокуса. После захвата фокуса браузер считает, что пользователь намеренно продолжает действия внутри фрейма. Скрипт устанавливает обработчик события keydown на документ внутри фрейма. Он собирает вводимые пользователем символы в буфер и ожидает триггерное слово для записи в буфер обмена.

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

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

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

← Cybersecurity