
Öffentliches Advisory & PoC für CVE-2026-26897 — Deep-Link-Bypass in EcoOnline EHS Android (com.airsweb.v10), behoben in 0.2.500
Öffentliche Offenlegung / Advisory für CVE-2026-26897, eine Umgehung der Deep-Link-Validierung in der Android-Anwendung EcoOnline EHS (com.airsweb.v10). Ein manipulierter ehs-app://-Deep-Link wird zu https:// umgeschrieben und direkt in das Haupt-WebView der App geladen, ohne die Host-Allowlist-Prüfung, die die App bei jedem anderen Navigationspfad anwendet. Dadurch kann ein entfernter Angreifer beliebige, vom Angreifer kontrollierte Inhalte innerhalb der vertrauenswürdigen Anwendung rendern (Phishing).
Verantwortungsvoll offengelegt, vom Hersteller bestätigt und in Version 0.2.500 behoben.
com.airsweb.v10 0.2.499 (versionCode 44631)Die Anwendung des Herstellers ist proprietär und wird in diesem Repository nicht weitergegeben. Die folgende statische Analyse wurde an dem hier angegebenen Build durchgeführt. Besorgen Sie die genaue APK aus einem Archiv (z. B. APKPure-Versionsverlauf) und überprüfen Sie vor der Reproduktion deren Hash:
| Paket | com.airsweb.v10 |
| versionName / versionCode | 0.2.499 / 44631 |
EcoOnline EHS für Android ist ein Jetpack-Compose-WebView-Wrapper um die EHS-Webplattform. Der Standardinhalt wird von folgender URL geladen:
startUrl = "https://ehsmobilelanding.ecoonline.net/"
Die App exportiert eine einzelne Activity (MainActivity), die sowohl der Launcher als auch der Handler für das benutzerdefinierte URL-Schema ehs-app ist. Das <data>-Element des Deep-Link-intent-filter deklariert nur ein Schema — keinen Host und keinen Pfad — daher wird jede ehs-app://…-URI an die App weitergeleitet.
Um die WebView-Navigation zu schützen, implementiert die App eine Host-Allowlist (isInternalHost) und wendet sie beim Wiederherstellen der zuletzt besuchten URL an. Allerdings ruft der Deep-Link-Behandlungszweig diese Allowlist überhaupt nicht auf. Er nimmt die eingehende Deep-Link-URI, führt eine naive Zeichenkettenersetzung des Schemas ehs-app: → https: durch und ruft WebView.loadUrl() mit dem Ergebnis auf. Ein entfernter Angreifer kann daher einen Deep-Link konstruieren, der die vertrauenswürdige App dazu bringt, eine beliebige https://-Origin zu laden.
AndroidManifest.xml (v0.2.499) — exportierter Deep-Link (nur Schema)<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"/> <!-- scheme only: no host, no path -->
</intent-filter>
</activity>
MainActivityKt.WebViewPage (dekompiliert, v0.2.499)// intent delivered to the exported MainActivity
if (intent.getScheme().equals("ehs-app")) {
WebView webView = ...;
if (webView != null) {
Uri data = intent.getData(); // full ehs-app://… URI
String s = String.valueOf(data);
// naïve scheme rewrite: "ehs-app:" -> "https:"
String url = StringsKt.replaceFirst(s, "ehs-app:", "https:", false, 4, null);
webView.loadUrl(url); // <-- NO isInternalHost() CHECK
}
}
Die Allowlist, die dieser Pfad nicht anwendet (sie wird an anderer Stelle in derselben Datei verwendet):
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);
}
Sekundäre Anmerkung: Der reguläre Ausdruck
internalDomainsist selbst schwach (fehlerhafte Alternation + Substring-Abgleich viacontainsMatchIn), aber das Hauptproblem ist, dass der Deep-Link-ZweigisInternalHostüberhaupt nie aufruft.
Ein PoC als Bildschirmaufnahme wurde am 2026-01-13 gegen com.airsweb.v10 0.2.499 erstellt.
ehs-app://attacker.example/login
MainActivity das Schema um und das WebView lädt:
https://attacker.example/login
Eine harmlose Demonstration ohne Datenerfassung der Weiterleitung ist in poc/redirect-proof.html enthalten (Verwendung: poc/README.md). Sie beweist, dass eine beliebige Origin innerhalb der vertrauenswürdigen App geladen wird — ohne Eingaben, ohne Erfassung von Anmeldedaten und ohne Netzwerkanfragen.
Im ursprünglichen PoC hostete der Forscher eine harmlose, nachempfundene Landingpage ausschließlich zur Demonstration der Weiterleitung. Dieses Advisory dokumentiert die Schwachstelle zu defensiven Zwecken / Offenlegungszwecken und enthält absichtlich keine Phishing-Seite und keinen Code zur Erfassung von Anmeldedaten.
https://-Inhalte im Kontext der vertrauenswürdigen Anwendung.CVSS v3.1 (Schätzung des Forschers — vor Veröffentlichung finalisieren): AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:N → 6.3 (Mittel) (ein Scope:Changed-Argument ist vertretbar, da nicht vertrauenswürdige Inhalte im Kontext der vertrauenswürdigen App ausgeführt werden).
Aktualisieren Sie auf com.airsweb.v10 0.2.500 oder neuer. Empfohlene Korrekturen:
isInternalHost() (oder eine gleichwertige Allowlist) auf Deep-Link-URLs an, bevor loadUrl() aufgerufen wird.intent-filter mit einem expliziten android:host/android:pathPrefix ein.internalDomains (Host vollständig verankern; Substring-Abgleich vermeiden).Entdeckt und gemeldet von Ahmet Mersin — GitHub @iwallplace, HackerOne iwallplace.
| SHA-256 |
e9e8a38d133cb9da9901caf03c4a7a033c75ad1f32ba0539260e47d5dd5068c0 |
| Quelle | APKPure — „EcoOnline EHS" Versionsverlauf |
| Feld | Wert |
|---|
| CVE-ID | CVE-2026-26897 |
| Hersteller | EcoOnline („EcoOnline Global") — https://www.ecoonline.com/ |
| Produkt | EcoOnline EHS für Android (com.airsweb.v10) |
| Betroffene Version | 0.2.499 (versionCode 44631) |
| Behobene Version | 0.2.500 |
| Schwachstellentyp | Fehlerhafte Validierung in einem Handler für ein benutzerdefiniertes URL-Schema (Deep-Link-Umgehung) → unvalidiertes WebView-Laden / Open Redirect |
| CWE | CWE-939 (Improper Authorization in Handler for Custom URL Scheme); verwandte CWE-749 |
| Betroffene Komponente | com.airsweb.v10.MainActivity (exportierter Deep-Link-Handler) und der Deep-Link-Zweig in MainActivityKt.WebViewPage |
| Benutzerdefiniertes Schema | ehs-app:// |
| Angriffsart | Remote (erfordert Benutzerinteraktion — Öffnen eines manipulierten Links) |
| Auswirkung | Phishing / Social Engineering: beliebige, vom Angreifer kontrollierte Webinhalte werden innerhalb der vertrauenswürdigen EcoOnline-EHS-App gerendert (z. B. ein gefälschtes Login), unter Umgehung der Domain-Allowlist der App |
| Entdecker | Ahmet Mersin |
| Datum | Ereignis |
|---|
| 2026-01-13 | PoC gegen 0.2.499 aufgezeichnet |
| 2026-01-15 | CVE-Anfrage an MITRE eingereicht (Ticket scr1979357) |
| 2026-02-27 | CVE-2026-26897 von MITRE zugewiesen |
| vor der Veröffentlichung | Hersteller hat bestätigt; Fix in 0.2.500 veröffentlicht |
| 2026-03-04 | Veröffentlichungsanfrage an MITRE gesendet |
| 2026-05-06 | MITRE forderte eine vollständige öffentliche Offenlegungs-URL an |
| 2026-06-03 | Öffentliches Advisory veröffentlicht (dieses Repository) |