
CVE-2026-26897 に関する公開アドバイザリとPoC — EcoOnline EHS Android (com.airsweb.v10) における Deep Link Bypass、バージョン 0.2.500 で修正済み
EcoOnline EHS Android アプリケーション (com.airsweb.v10) におけるディープリンク検証バイパス CVE-2026-26897 に関する公開開示 / アドバイザリ。細工された ehs-app:// ディープリンクは https:// に書き換えられ、アプリが他のすべてのナビゲーションパスに適用しているホスト許可リストチェックなしでアプリのメイン WebView に直接読み込まれ、リモート攻撃者が信頼されたアプリケーション内で任意の攻撃者制御コンテンツを表示できるようになります(フィッシング)。
責任を持って開示され、ベンダーに確認され、バージョン 0.2.500 で修正済みです。
com.airsweb.v10 0.2.499 (versionCode 44631)ベンダーのアプリケーションはプロプライエタリであり、このリポジトリでは再配布されていません。以下の静的解析は、ここで特定されたビルドに対して実行されました。アーカイブ (例: APKPure のバージョン履歴) から正確な APK を入手し、再現前にハッシュを確認してください。
| パッケージ | com.airsweb.v10 |
| versionName / versionCode | 0.2.499 / 44631 |
| SHA-256 |
Android 向け EcoOnline EHS は、EHS Web プラットフォームをラップする Jetpack-Compose WebView ラッパーです。デフォルトのコンテンツは以下から読み込まれます。
startUrl = "https://ehsmobilelanding.ecoonline.net/"
アプリは単一の Activity (MainActivity) をエクスポートしており、これはランチャーであると同時にカスタム URL スキーム ehs-app のハンドラでもあります。ディープリンクの intent-filter の <data> 要素はスキームのみを宣言しており、ホストもパスもありません。そのため、あらゆる ehs-app://… URI がアプリにルーティングされます。
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)// エクスポートされた MainActivity に配信されるインテント
if (intent.getScheme().equals("ehs-app")) {
WebView webView = ...;
if (webView != null) {
Uri data = intent.getData(); // 完全な ehs-app://… URI
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をまったく呼び出さないことです。
2026-01-13 に com.airsweb.v10 0.2.499 に対する画面録画 PoC を制作しました。
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 (Medium) (Scope:Changed の議論が可能であり、信頼されていないコンテンツが信頼されたアプリコンテキスト内で実行される)。
com.airsweb.v10 0.2.500 以降にアップデートしてください。 推奨される修正:
loadUrl() の前に ディープリンク URL に isInternalHost() (または同等の許可リスト) を適用する。intent-filter を明示的な android:host / android:pathPrefix で制約する。internalDomains 正規表現を強化する (ホストを完全にアンカーし、部分一致を避ける)。Ahmet Mersin によって発見および報告されました — GitHub @iwallplace、HackerOne iwallplace。
e9e8a38d133cb9da9901caf03c4a7a033c75ad1f32ba0539260e47d5dd5068c0 |
| ソース | APKPure — 「EcoOnline EHS」バージョン履歴 |
| フィールド | 値 |
|---|
| CVE ID | CVE-2026-26897 |
| ベンダー | EcoOnline (「EcoOnline Global」) — https://www.ecoonline.com/ |
| 製品 | Android 向け EcoOnline EHS (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 アプリ内で任意の攻撃者制御の Web コンテンツが表示され(例: 偽のログイン画面)、アプリのドメイン許可リストをバイパスする |
| 発見者 | Ahmet Mersin |
| 日付 | イベント |
|---|
| 2026-01-13 | 0.2.499 に対する PoC を記録 |
| 2026-01-15 | MITRE に CVE リクエストを提出 (チケット scr1979357) |
| 2026-02-27 | MITRE により CVE-2026-26897 が割り当てられる |
| 公開前 | ベンダーが確認; 修正は 0.2.500 でリリース |
| 2026-03-04 | MITRE に公開リクエストを送信 |
| 2026-05-06 | MITRE が完全な公開開示 URL を要求 |
| 2026-06-03 | 公開アドバイザリを公開 (このリポジトリ) |