Capacitor, платформа для сборки мобильных приложений на веб-технологиях, пропускает сторонний код на доверенный источник приложения. Уязвимость CVE-2026-103922 получила оценку 9.3 по шкале CVSS. Проблема затрагивает работу WebView (встроенного браузерного компонента) на Android и iOS. Злоумышленник добивается того, что чужой сценарий получает тот же уровень доверия, что и собственный код программы. Под угрозой токены авторизации, пользовательские данные и нативные возможности, доступные приложению через подключённые плагины.
Уязвимость CVE-2026-103922
Сбой кроется в проверке переходов. Capacitor упаковывает веб-часть программы в нативный контейнер, а показывает её через WebView. Перед каждым переходом по ссылке срабатывает защита: она сверяет схему и хост целевого адреса со списком допустимых. Путь при этом не проверялся. Из-за пробела переход на внутренний адрес /_capacitor_http_interceptor_ выглядел как обычное перемещение внутри приложения. Этот адрес обслуживается на том же источнике, что и сама программа, поэтому защита пропускала его без вопросов.
Источник (origin) - это сочетание схемы, домена и порта, которое браузерный движок считает границей доверия. Загрузка внутреннего пути как документа заставляла нативный слой запросить произвольный внешний ресурс. Ответ возвращался в WebView уже от имени приложения, а не удалённого сайта. Сценарий внутри ответа наследует права источника: доступ к localStorage (локальному хранилищу браузерного компонента), cookie-файлам и возможностям подключённых плагинов. Что именно получит атакующий, зависит от настроек конкретного приложения и данных, которые оно хранит. Приложения с токенами авторизации, чувствительными сведениями о пользователе и обращениями к серверным интерфейсам рискуют сильнее прочих.
Отдельная деталь расширяет зону поражения. Обработчик внутреннего прокси отвечал независимо от того, включён плагин CapacitorHttp или нет. Отключение плагина на уязвимых версиях не защищает. Следовательно, рискуют и приложения, которые прокси-функцию не используют вовсе.
Для эксплуатации нужно, чтобы человек нажал на ссылку внутри WebView. Подходящую площадку дают приложения, которые показывают ссылки из пользовательского контента: сообщения в чатах, комментарии, форматированный текст, встроенные блоки. Атака идёт по сети, особых привилегий не требует, но без действия пользователя не срабатывает. Именно такие условия учтены в базовой оценке CVSS.
Две слабости описаны в уведомлении GHSA-rvm3-566m-v7fv отдельно. Ошибка в проверке источника значится как CWE-346. Непредусмотренное проксирование проходит по CWE-441, это случай "запутавшегося посредника" (confused deputy): компонент исполняет запрос от имени того, кто таких прав иметь не должен. Данных об эксплуатации в реальных атаках уведомление не содержит.
@capacitor/android и @capacitor/ios в npm, артефакт com.capacitorjs:core в Maven и сборка через Swift Package Manager содержат уязвимость. Проблема есть в выпусках 6.0.0-6.2.1, 7.0.0-7.6.8 и части версий 8.x. Исправления вышли в 6.2.2, 7.6.9, 8.3.5, 8.4.3 и 8.5.1.
Правки затронули два места. Защита переходов теперь блокирует навигацию фрейма на внутренний прокси-путь. Сам обработчик отвечает только при включённом CapacitorHttp и никогда не отдаёт главный документ страницы. Штатная работа fetch и XMLHttpRequest не изменилась: это запросы за подресурсами, через проверку переходов они не проходят.
Разработчикам нужно обновить Capacitor, пересобрать приложения под Android и iOS и заново распространить сборки. Если обновиться сразу нельзя, путь /_capacitor_http_interceptor_ перекрывает небольшой плагин. На Android переопределяют shouldOverrideLoad(Uri url) и возвращают true для этого пути. На iOS реализуют shouldOverrideLoad(_:) с тем же условием. Возврат true отменяет переход, для остальных адресов метод отдаёт null или nil. Параллельно очищают ссылки из пользовательского контента перед показом в WebView.
Гибридные приложения размывают границу между веб-частью и нативными функциями, а WebView связывает их напрямую. Ошибка в разборе пути ломает политику одного источника целиком, и цена такой оплошности выше, чем у рядового сбоя отрисовки. Проектам с чатами, комментариями и форматированным текстом проверка ссылок нужна так же регулярно, как обновление самого фреймворка.
Ссылки