
Публичное уведомление и PoC для CVE-2026-26897 — Обход глубоких ссылок в EcoOnline EHS Android (com.airsweb.v10), исправлено в версии 0.2.500
Публичное раскрытие / уведомление для CVE-2026-26897, обход проверки глубоких ссылок в приложении EcoOnline EHS для Android (com.airsweb.v10). Созданная глубокая ссылка ehs-app:// преобразуется в https:// и загружается непосредственно в основной WebView приложения без проверки списка разрешённых хостов, которую приложение применяет на всех остальных путях навигации, что позволяет удалённому злоумышленнику отображать произвольный контролируемый им контент внутри доверенного приложения (фишинг).
Ответственно раскрыто, подтверждено разработчиком и исправлено в версии 0.2.500.
com.airsweb.v10 0.2.499 (versionCode 44631)Приложение разработчика является проприетарным и не распространяется в этом репозитории. Статический анализ ниже был выполнен для сборки, указанной здесь — получите точный APK из архива (например, история версий APKPure) и проверьте его хеш перед воспроизведением:
| Пакет | com.airsweb.v10 |
| versionName / versionCode | 0.2.499 / 44631 |
EcoOnline EHS для Android — это оболочка WebView на Jetpack-Compose вокруг веб-платформы EHS. Его содержимое по умолчанию загружается из:
startUrl = "https://ehsmobilelanding.ecoonline.net/"
Приложение экспортирует одну Activity (MainActivity), которая одновременно является лаунчером и обработчиком пользовательской схемы URL ehs-app. Элемент <data> в intent-filter глубокой ссылки объявляет только схему — без хоста и пути — поэтому любой URI вида ehs-app://… направляется в приложение.
Для защиты навигации WebView приложение реализует список разрешённых хостов (isInternalHost) и применяет его при восстановлении последнего посещённого URL. Однако ветка обработки глубоких ссылок не вызывает этот список вообще. Она берёт входящий URI глубокой ссылки, выполняет наивную замену строки схемы ehs-app: → https: и вызывает WebView.loadUrl() для результата. Поэтому удалённый злоумышленник может создать глубокую ссылку, заставляющую доверенное приложение загружать произвольный источник https://.
AndroidManifest.xml (v0.2.499) — экспортированная глубокая ссылка только со схемой<activity
android:name="com.airsweb.v10.MainActivity"
android:exported="true" ... >
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="ehs-app"/> <!-- только схема: без хоста, без пути -->
</intent-filter>
</activity>
MainActivityKt.WebViewPage (декомпилировано, v0.2.499)// intent, доставленный в экспортированную MainActivity
if (intent.getScheme().equals("ehs-app")) {
WebView webView = ...;
if (webView != null) {
Uri data = intent.getData(); // полный URI ehs-app://…
String s = String.valueOf(data);
// наивная замена схемы: "ehs-app:" -> "https:"
String url = StringsKt.replaceFirst(s, "ehs-app:", "https:", false, 4, null);
webView.loadUrl(url); // <-- НЕТ ПРОВЕРКИ isInternalHost()
}
}
Список разрешений, который этот путь не применяет (используется в другом месте того же файла):
private static final Regex internalDomains =
new Regex("^[-\\w]*\\.(airsweb)|(ecoonline)\\.net");
private static final List<String> excludeDomainsStartingWith =
listOf("passport", "login", "auth");
public static boolean isInternalHost(String host) {
for (String p : excludeDomainsStartingWith)
if (host.startsWith(p)) return false;
return internalDomains.containsMatchIn(host);
}
Дополнительное примечание: само регулярное выражение
internalDomainsслабое (неправильное чередование + сопоставление подстрокcontainsMatchIn), но основная проблема в том, что ветка глубоких ссылок вообще не вызываетisInternalHost.
Видеозапись PoC была создана 2026-01-13 для com.airsweb.v10 0.2.499.
ehs-app://attacker.example/login
MainActivity переписывает схему и WebView загружает:
https://attacker.example/login
Безвредная, не собирающая данные демонстрация перенаправления включена в poc/redirect-proof.html (использование: poc/README.md). Она доказывает, что произвольный источник загружается внутри доверенного приложения, без ввода данных, захвата учётных данных и сетевых запросов.
В оригинальном PoC исследователь разместил безвредную страницу, похожую на целевую, исключительно для демонстрации перенаправления. Данное уведомление документирует уязвимость в оборонительных / раскрывающих целях и намеренно не содержит фишинговой страницы или кода для захвата учётных данных.
https:// внутри контекста доверенного приложения.CVSS v3.1 (оценка исследователя — окончательно определить перед публикацией):
AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:N → 6.3 (Средний) (можно аргументировать изменение области действия, так как недоверенный контент выполняется в контексте доверенного приложения).
Обновите до com.airsweb.v10 0.2.500 или новее. Рекомендуемые исправления:
isInternalHost() (или эквивалентный список разрешений) к URL глубоких ссылок перед loadUrl().intent-filter глубоких ссылок явным указанием android:host/android:pathPrefix.internalDomains (полная привязка хоста; избегайте сопоставления подстрок).Обнаружено и сообщено Ahmet Mersin — GitHub @iwallplace, HackerOne iwallplace.
| SHA-256 |
e9e8a38d133cb9da9901caf03c4a7a033c75ad1f32ba0539260e47d5dd5068c0 |
| Источник | APKPure — "EcoOnline EHS" история версий |
| Поле | Значение |
|---|
| CVE ID | CVE-2026-26897 |
| Разработчик | EcoOnline ("EcoOnline Global") — https://www.ecoonline.com/ |
| Продукт | EcoOnline EHS для Android (com.airsweb.v10) |
| Затронутая версия | 0.2.499 (versionCode 44631) |
| Исправленная версия | 0.2.500 |
| Тип уязвимости | Неправильная проверка в обработчике пользовательской схемы URL (обход глубоких ссылок) → непроверенная загрузка WebView / открытое перенаправление |
| CWE | CWE-939 (Неправильная авторизация в обработчике пользовательской схемы URL); связанный CWE-749 |
| Затронутый компонент | com.airsweb.v10.MainActivity (экспортированный обработчик глубоких ссылок) и ветка глубоких ссылок в MainActivityKt.WebViewPage |
| Пользовательская схема | ehs-app:// |
| Тип атаки | Удалённая (требует взаимодействия пользователя — открытие специально созданной ссылки) |
| Воздействие | Фишинг / социальная инженерия: произвольный контролируемый злоумышленником веб-контент отображается внутри доверенного приложения EcoOnline EHS (например, поддельная страница входа), обходя список разрешённых доменов приложения |
| Обнаружил | Ahmet Mersin |
| Дата | Событие |
|---|
| 2026-01-13 | Запись PoC для версии 0.2.499 |
| 2026-01-15 | Запрос CVE отправлен в MITRE (заявка scr1979357) |
| 2026-02-27 | CVE-2026-26897 присвоен MITRE |
| до публикации | Разработчик подтвердил; исправление выпущено в 0.2.500 |
| 2026-03-04 | Запрос на публикацию отправлен в MITRE |
| 2026-05-06 | MITRE запросил полный URL публичного раскрытия |
| 2026-06-03 | Публичное уведомление опубликовано (данный репозиторий) |