
CVE-2026-26897에 대한 공개 권고 및 PoC — EcoOnline EHS Android(com.airsweb.v10)의 딥 링크 우회, 0.2.500에서 수정됨
CVE-2026-26897에 대한 공개 공개(public disclosure) / 보안 권고(advisory)입니다. 이는 EcoOnline EHS Android 애플리케이션(com.airsweb.v10)의 딥 링크 검증 우회에 관한 것입니다. 조작된 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 웹 플랫폼을 감싸는 Jetpack-Compose WebView 래퍼입니다. 기본 콘텐츠는 다음에서 로드됩니다:
startUrl = "https://ehsmobilelanding.ecoonline.net/"
앱은 런처이자 사용자 지정 URL 스킴 **ehs-app**의 핸들러 역할을 하는 단일 Activity(MainActivity)를 내보냅니다. 딥 링크 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"/> <!-- scheme only: no host, no path -->
</intent-filter>
</activity>
MainActivityKt.WebViewPage의 딥 링크 분기(디컴파일됨, 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
}
}
이 경로가 적용하지 못하는 허용 목록(같은 파일의 다른 곳에서 사용됨):
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정규식 자체도 취약합니다(잘못된 alternation +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(중간) (신뢰되지 않은 콘텐츠가 신뢰되는 앱 컨텍스트에서 실행되므로 Scope:Changed 논거를 제시할 수 있습니다.)
com.airsweb.v10 0.2.500 이상으로 업데이트하세요. 권장 수정 사항:
loadUrl() 이전에 isInternalHost()(또는 동등한 허용 목록)를 적용합니다.android:host/android:pathPrefix로 딥 링크 intent-filter를 제한하세요.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 앱 내부에 공격자가 제어하는 임의 웹 콘텐츠가 렌더링됨(예: 가짜 로그인), 앱의 도메인 허용 목록 우회 |
| 발견자 | 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 | 공개 권고 게시(이 저장소) |