Cordova Apps
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
์์ธํ ๋ด์ฉ์ https://infosecwriteups.com/recreating-cordova-mobile-apps-to-bypass-security-implementations-8845ff7bdc58๋ฅผ ํ์ธํ์ธ์. ๋ค์์ ์์ฝ์ ๋๋ค:
Apache Cordova๋ JavaScript, HTML, CSS๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด๋ธ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ์ผ๋ก ์๋ ค์ ธ ์์ต๋๋ค. Android ๋ฐ iOS ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ ์ ์์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ค ์ฝ๋๋ฅผ ๋ณดํธํ๊ธฐ ์ํ ๊ธฐ๋ณธ ๋ฉ์ปค๋์ฆ์ด ๋ถ์กฑํฉ๋๋ค. React Native์ ๋ฌ๋ฆฌ Cordova๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์์ค ์ฝ๋๋ฅผ ์ปดํ์ผํ์ง ์์ผ๋ฏ๋ก ์ฝ๋ ๋ณ์กฐ ์ทจ์ฝ์ ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. Cordova๋ WebView๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋๋งํ๋ฉฐ, APK ๋๋ IPA ํ์ผ๋ก ์ปดํ์ผ๋ ํ์๋ HTML ๋ฐ JavaScript ์ฝ๋๋ฅผ ๋ ธ์ถํฉ๋๋ค. ๋ฐ๋ฉด React Native๋ JavaScript ์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ํด JavaScript VM์ ์ฌ์ฉํ์ฌ ๋ ๋์ ์์ค ์ฝ๋ ๋ณดํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
Cordova ์ ํ๋ฆฌ์ผ์ด์ ๋ณต์
Cordova ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ ํ๊ธฐ ์ ์ NodeJS์ Android SDK, Java JDK, Gradle๊ณผ ๊ฐ์ ๊ธฐํ ํ์ ๊ตฌ์ฑ ์์๊ฐ ์ค์น๋์ด ์๋์ง ํ์ธํ์ธ์. ๊ณต์ Cordova ๋ฌธ์๋ ์ด๋ฌํ ์ค์น์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
com.android.bank ํจํค์ง ์ด๋ฆ์ ๊ฐ์ง Bank.apk๋ผ๋ ์์ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ณ ๋ คํด ๋ณด์ธ์. ์์ค ์ฝ๋์ ์ ๊ทผํ๋ ค๋ฉด bank.apk๋ฅผ ์์ถ ํด์ ํ๊ณ bank/assets/www ํด๋๋ก ์ด๋ํฉ๋๋ค. ์ด ํด๋์๋ HTML ๋ฐ JS ํ์ผ์ ํฌํจํ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ฒด ์์ค ์ฝ๋๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ฑ์ bank/res/xml/config.xml์์ ์ฐพ์ ์ ์์ต๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ ํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด์ธ์:
npm install -g cordova@latest
cordova create bank-new com.android.bank Bank
cd bank-new
bank/assets/www์ ๋ด์ฉ์ bank-new/www๋ก ๋ณต์ฌํ๋, cordova_plugins.js, cordova.js, cordova-js-src/ ๋ฐ plugins/ ๋๋ ํ ๋ฆฌ๋ ์ ์ธํฉ๋๋ค.
์ Cordova ํ๋ก์ ํธ๋ฅผ ์์ฑํ ๋ ํ๋ซํผ(Android ๋๋ iOS)์ ์ง์ ํฉ๋๋ค. Android ์ฑ์ ๋ณต์ ํ ๊ฒฝ์ฐ Android ํ๋ซํผ์ ์ถ๊ฐํฉ๋๋ค. Cordova์ ํ๋ซํผ ๋ฒ์ ๊ณผ Android API ์์ค์ ๋ค๋ฆ ๋๋ค. ํ๋ซํผ ๋ฒ์ ๋ฐ ์ง์๋๋ Android API์ ๋ํ ์์ธํ ๋ด์ฉ์ Cordova documentation์ ์ฐธ์กฐํ์ญ์์ค.
์ ์ ํ Cordova Android ํ๋ซํผ ๋ฒ์ ์ ํ์ธํ๋ ค๋ฉด ์๋ ์ ํ๋ฆฌ์ผ์ด์
์ cordova.js ํ์ผ์์ PLATFORM_VERSION_BUILD_LABEL์ ํ์ธํ์ญ์์ค.
ํ๋ซํผ ์ค์ ํ, ํ์ํ ํ๋ฌ๊ทธ์ธ์ ์ค์นํฉ๋๋ค. ์๋ ์ ํ๋ฆฌ์ผ์ด์
์ bank/assets/www/cordova_plugins.js ํ์ผ์๋ ๋ชจ๋ ํ๋ฌ๊ทธ์ธ๊ณผ ๊ทธ ๋ฒ์ ์ด ๋์ด๋์ด ์์ต๋๋ค. ์๋์ ๊ฐ์ด ๊ฐ ํ๋ฌ๊ทธ์ธ์ ๊ฐ๋ณ์ ์ผ๋ก ์ค์นํฉ๋๋ค:
cd bank-new
cordova plugin add cordova-plugin-dialogs@2.0.1
ํ๋ฌ๊ทธ์ธ์ด npm์์ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ, GitHub์์ ์์ค๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค:
cd bank-new
cordova plugin add https://github.com/moderna/cordova-plugin-cache.git
๋ชจ๋ ํ์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋์๋์ง ํ์ธํ ํ ์ปดํ์ผํ์ญ์์ค:
cd bank-new
cordova requirements
APK๋ฅผ ๋น๋ํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ธ์:
cd bank-new
cordova build android โ packageType=apk
์ด ๋ช ๋ น์ ๋๋ฒ๊ทธ ์ต์ ์ด ํ์ฑํ๋ APK๋ฅผ ์์ฑํ์ฌ Google Chrome์ ํตํ ๋๋ฒ๊น ์ ์ฉ์ดํ๊ฒ ํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๋ ๋ณ์กฐ ํ์ง ๋ฉ์ปค๋์ฆ์ด ํฌํจ๋ ๊ฒฝ์ฐ ์ค์น ์ ์ APK์ ์๋ช ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์๋ํ ๋๊ตฌ
ํด๋ก๋ ํ๋ก์ธ์ค๋ฅผ ์๋ํํ๋ ค๋ ๊ฒฝ์ฐ, **MobSecco**๊ฐ ์ถ์ฒ๋๋ ๋๊ตฌ์ ๋๋ค. ์ด๋ Android ์ ํ๋ฆฌ์ผ์ด์ ์ ํด๋ก๋์ ๊ฐ์ํํ์ฌ ์์ ์ค๋ช ๋ ๋จ๊ณ๋ฅผ ๋จ์ํํฉ๋๋ค.
๋ณด์ ์ํ ๋ฐ ์ต๊ทผ ์ทจ์ฝ์ (2023-2025)
Cordova์ ํ๋ฌ๊ทธ์ธ ๊ธฐ๋ฐ ์ํคํ ์ฒ๋ ๋๋ถ๋ถ์ ๊ณต๊ฒฉ ํ๋ฉด์ด ์๋ํํฐ ํ๋ฌ๊ทธ์ธ๊ณผ WebView ๋ธ๋ฆฌ์ง ๋ด๋ถ์ ์กด์ฌํจ์ ์๋ฏธํฉ๋๋ค. ์ง๋ ๋ช ๋ ๋์ ์ ๊ทน์ ์ผ๋ก ์ ์ฉ๋๊ฑฐ๋ ๊ณต๊ฐ๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค:
- ์
์ฑ NPM ํจํค์ง. 2024๋
7์, ํจํค์ง
cordova-plugin-acuant๊ฐ ์ค์น ์ค ์ ์ฑ ์ฝ๋๋ฅผ ๋๋กญํ๋ ๊ฒ์ด ๋ฐ๊ฒฌ๋์ด NPM ๋ ์ง์คํธ๋ฆฌ์์ ์ ๊ฑฐ๋์์ต๋๋ค (OSV-ID MAL-2024-7845).npm install cordova-plugin-acuant๋ฅผ ์คํํ ๋ชจ๋ ๊ฐ๋ฐ์ ๋จธ์ ์ ์์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํด์ผ ํฉ๋๋ค. ์์์น ๋ชปํ Cordova ํ๋ฌ๊ทธ์ธ์ ์ํดpackage.json/package-lock.json์ ๊ฐ์ฌํ๊ณ ์ ๋ขฐํ ์ ์๋ ๋ฒ์ ์ ๊ณ ์ ํ์ญ์์ค. OSV advisory - ๊ฒ์ฆ๋์ง ์์ ๋ฅ๋งํฌ โ XSS/RCE.
CleverTap Cordova Plugin โค 2.6.2(CVE-2023-2507)๋ ๋ฅ๋งํฌ ์ ๋ ฅ์ ์ ํํ์ง ์์ ๊ณต๊ฒฉ์๊ฐ ์กฐ์๋ ๋งํฌ๊ฐ ์ด๋ฆด ๋ ๋ฉ์ธ WebView ์ปจํ ์คํธ์์ ์คํ๋๋ ์์์ JavaScript๋ฅผ ์ฃผ์ ํ ์ ์์ต๋๋ค. โฅ 2.6.3์ผ๋ก ์ ๋ฐ์ดํธํ๊ฑฐ๋ ๋ฐํ์์ ์ ๋ขฐํ ์ ์๋ URI ๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ฑฐํ์ญ์์ค. CVE-2023-2507 - ๊ตฌ์ ํ๋ซํผ ์ฝ๋.
cordova-androidโค 12๋ targetSdk 33 ์ดํ๋ก ์ ๊ณต๋ฉ๋๋ค. 2024๋ 5์๋ถํฐ Google Play๋ API 34๋ฅผ ์๊ตฌํ๋ฉฐ, ์ฌ๋ฌ WebView ๊ฐํ ๊ธฐ๋ฅ(์: ๊ตฌ์ฑ ์์์ ๋ํ ์๋ ์์ฑ๋exported="false")์ API 34+์์๋ง ์กด์ฌํฉ๋๋ค.cordova-android@13.0.0์ด์์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ์ญ์์ค.
ํํ ์คํธ ์ค ๋น ๋ฅธ ์ ๊ฒ
- ๋์ปดํ์ผ๋
AndroidManifest.xml์์android:debuggable="true"๋ฅผ ์ฐพ์ผ์ญ์์ค. ๋๋ฒ๊ทธ ๋น๋๋chrome://inspect๋ฅผ ํตํด WebView๋ฅผ ๋ ธ์ถ์์ผ ์ ์ฒด JS ์ฃผ์ ์ ํ์ฉํฉ๋๋ค. config.xml์์ ์ง๋์น๊ฒ ํ์ฉ์ ์ธ<access origin="*">ํ๊ทธ๋www/index.html์ ๋๋ฝ๋ CSP ๋ฉํ ํ๊ทธ๋ฅผ ๊ฒํ ํ์ญ์์ค.www/์์eval(,new Function(๋๋ CSP ์ฐํ๋ฅผ XSS๋ก ์ ํํ ์ ์๋ ๋์ ์ผ๋ก ์์ฑ๋ HTML์ grepํ์ญ์์ค.plugins/์์ ๋ด์ฅ๋ ํ๋ฌ๊ทธ์ธ์ ์๋ณํ๊ณnpm audit --production๋๋osv-scanner --lockfile์ ์คํํ์ฌ ์๋ ค์ง CVE๋ฅผ ์ฐพ์ผ์ญ์์ค.
๋์ ๋ถ์ ํ
์๊ฒฉ WebView ๋๋ฒ๊น
์ ํ๋ฆฌ์ผ์ด์
์ด ๋๋ฒ๊ทธ ๋ชจ๋๋ก ์ปดํ์ผ๋์๊ฑฐ๋ WebView.setWebContentsDebuggingEnabled(true)๋ฅผ ๋ช
์์ ์ผ๋ก ํธ์ถํ๋ ๊ฒฝ์ฐ, Chrome DevTools์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค:
adb forward tcp:9222 localabstract:chrome_devtools_remote
google-chrome --new-window "chrome://inspect/#devices"
์ด๊ฒ์ ๋ผ์ด๋ธ JavaScript ์ฝ์, DOM ๊ฒ์ฌ๊ธฐ ๋ฐ ๋ฐํ์์ JavaScript ํจ์๋ฅผ ๋ฎ์ด์ธ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ํด๋ผ์ด์ธํธ ์ธก ๋ก์ง์ ์ฐํํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. (์์ธํ ๋ด์ฉ์ Google์ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.)
Frida๋ฅผ ์ฌ์ฉํ์ฌ JS โ Native ๋ธ๋ฆฌ์ง๋ฅผ ํ ํนํ๊ธฐ
๋๋ถ๋ถ์ ํ๋ฌ๊ทธ์ธ์ Java ์ธก ์ง์
์ ์ org.apache.cordova.CordovaPlugin.execute(...)์
๋๋ค. ์ด ๋ฉ์๋๋ฅผ ํ
ํนํ๋ฉด JavaScript์์ ํธ์ถ๋๋ ๊ฒ์ ๋ชจ๋ํฐ๋งํ๊ฑฐ๋ ์กฐ์ํ ์ ์์ต๋๋ค:
// frida -U -f com.vulnerable.bank -l hook.js --no-pause
Java.perform(function () {
var CordovaPlugin = Java.use('org.apache.cordova.CordovaPlugin');
CordovaPlugin.execute.overload('java.lang.String','org.json.JSONArray','org.apache.cordova.CallbackContext').implementation = function(act, args, ctx) {
console.log('[Cordova] ' + act + ' => ' + args);
// Tamper the first argument of a sensitive action
if (act === 'encrypt') {
args.put(0, '1234');
}
return this.execute(act, args, ctx);
};
});
๋ณด์ ๊ฐํ ๊ถ์ฅ ์ฌํญ (2025)
- ์ต์ ํ๋ซํผ์ผ๋ก ์
๋ฐ์ดํธ:
cordova-android@13(2024๋ 5์)์ API 34๋ฅผ ๋์์ผ๋ก ํ๋ฉฐ ์๋ก์ด WebView ์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. - ๋๋ฒ๊ทธ ์ํฐํฉํธ ์ ๊ฑฐ:
android:debuggable="false"๋ฅผ ํ์ธํ๊ณ ๋ฆด๋ฆฌ์ค ๋น๋์์setWebContentsDebuggingEnabledํธ์ถ์ ํผํ์ญ์์ค. - ์๊ฒฉํ CSP ๋ฐ ํ์ฉ ๋ชฉ๋ก ์ํ: ๋ชจ๋ HTML ํ์ผ์
<meta http-equiv="Content-Security-Policy" ...>ํ๊ทธ๋ฅผ ์ถ๊ฐํ๊ณconfig.xml์์<access>์ถ์ฒ๋ฅผ ์ ํํ์ญ์์ค. ์ธ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ์ฐจ๋จํ๋ ์ต์ CSP ์์:
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src 'self' data:; object-src 'none'; frame-ancestors 'none'">
- ๋ช
ํํ ํ
์คํธ ํธ๋ํฝ ๋นํ์ฑํ:
AndroidManifest.xml์์android:usesCleartextTraffic="false"๋ฅผ ์ค์ ํ๊ณ /ํ๊ฑฐ๋ TLS๋ฅผ ์ํํ๋ [network-security-config]๋ฅผ ์ ๊ณตํฉ๋๋ค. - ํ๋ฌ๊ทธ์ธ ์์:
npm ci๋ก ํ๋ฌ๊ทธ์ธ ๋ฒ์ ์ ๊ณ ์ ํ๊ณ ์์ฑ๋package-lock.json์ ์ปค๋ฐํฉ๋๋ค.- ์ฃผ๊ธฐ์ ์ผ๋ก
npm audit,osv-scanner๋๋cordova-check-plugins๋ฅผ ์คํํฉ๋๋ค. - ๋๋ ํ: Terser/UglifyJS๋ก JavaScript๋ฅผ ์ถ์ํ๊ณ ์์ฐ ๋น๋์์ ์์ค ๋งต์ ์ ๊ฑฐํ์ฌ ์ผ๋ฐ์ ์ธ ๋ฆฌ๋ฒ์ฑ ์๋๋ฅผ ๋ฆ์ถฅ๋๋ค.
์ฐธ๊ณ ๋ฌธํ
- Apache Cordova โ Cordova-Android 13.0.0 ๋ฆด๋ฆฌ์ค ๋ ธํธ (2024๋ 5์)
- OSV-ID MAL-2024-7845 โ
cordova-plugin-acuant์ ์ ์ฑ ์ฝ๋ - CVE-2023-2507 โ CleverTap Cordova Plugin ๋ฅ๋งํฌ XSS
Tip
AWS ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:HackTricks Training GCP Red Team Expert (GRTE)
Azure ํดํน ๋ฐฐ์ฐ๊ธฐ ๋ฐ ์ฐ์ตํ๊ธฐ:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


