
إعلان عام وإثبات المفهوم لـ CVE-2026-26897 — تجاوز الروابط العميقة في EcoOnline EHS Android (com.airsweb.v10)، تم إصلاحه في 0.2.500
إفصاح عام / تنبيه لـ CVE-2026-26897، وهو تجاوز للتحقق من الرابط العميق في تطبيق EcoOnline EHS لأندرويد (com.airsweb.v10). يتم إعادة كتابة رابط عميق مُصمم ehs-app:// إلى https:// وتحميله مباشرة في WebView الرئيسي للتطبيق بدون فحص قائمة السماح بالمضيف الذي يطبقه التطبيق على كل مسار تنقل آخر، مما يسمح لمهاجم عن بعد بعرض محتوى عشوائي يتحكم فيه داخل التطبيق الموثوق (تصيد).
تم الكشف عنها بمسؤولية، اعترف بها البائع، و تم إصلاحها في الإصدار 0.2.500.
com.airsweb.v10 0.2.499 (versionCode 44631)تطبيق البائع مملوك و لا يتم إعادة توزيعه في هذا المستودع. تم إجراء التحليل الثابت أدناه على البناء المحدد هنا — احصل على APK الدقيق من أرشيف (مثل سجل إصدارات APKPure) وتحقق من التجزئة الخاصة به قبل إعادة الإنتاج:
| الحزمة | com.airsweb.v10 |
| اسم الإصدار / كود الإصدار | 0.2.499 / 44631 |
تطبيق EcoOnline EHS لأندرويد هو غلاف WebView يعتمد على Jetpack Compose لمنصة EHS على الويب. يتم تحميل محتواه الافتراضي من:
startUrl = "https://ehsmobilelanding.ecoonline.net/"
يُصدر التطبيق نشاطًا واحدًا (MainActivity) وهو كل من المُطلق ومعالج مخطط URL المخصص ehs-app. يُصرّح عنصر <data> في intent-filter للرابط العميق بمخطط فقط — بدون مضيف وبدون مسار — لذلك يتم توجيه أي URI ehs-app://… إلى التطبيق.
لحماية التنقل في WebView، يطبق التطبيق قائمة سماح المضيف (isInternalHost) ويطبقها عند استعادة آخر URL تم زيارته. ومع ذلك، فإن فرع معالجة الرابط العميق لا يستدعي قائمة السماح تلك على الإطلاق. يأخذ URI الرابط العميق الوارد، ويقوم باستبدال سلسلة نصية ساذج للمخطط ehs-app: → https:، ثم يستدعي WebView.loadUrl() على النتيجة. لذلك يمكن لمهاجم عن بعد إنشاء رابط عميق يتسبب في تحميل التطبيق الموثوق لأصل https:// عشوائي.
AndroidManifest.xml (الإصدار 0.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"/> <!-- scheme only: no host, no path -->
</intent-filter>
</activity>
MainActivityKt.WebViewPage (مفكك، الإصدار 0.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
}
}
قائمة السماح التي يفشل هذا المسار في تطبيقها (تُستخدم في مكان آخر في نفس الملف):
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() (أو قائمة سماح مكافئة) على URLs الروابط العميقة قبل 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 لأندرويد (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 | تم نشر التنبيه العام (هذا المستودع) |