hacktricks/src/mobile-pentesting/cordova-apps.md

126 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Cordova Apps
{{#include ../banners/hacktricks-training.md}}
**有关更多详细信息,请查看 [https://infosecwriteups.com/recreating-cordova-mobile-apps-to-bypass-security-implementations-8845ff7bdc58](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 VM 来执行 JavaScript 代码,提供更好的源代码保护。
### 克隆 Cordova 应用程序
在克隆 Cordova 应用程序之前,请确保已安装 NodeJS 以及 Android SDK、Java JDK 和 Gradle 等其他先决条件。官方 Cordova [文档](https://cordova.apache.org/docs/en/11.x/guide/cli/#install-pre-requisites-for-building) 提供了这些安装的全面指南。
考虑一个名为 `Bank.apk` 的示例应用程序,其包名为 `com.android.bank`。要访问源代码,请解压 `bank.apk` 并导航到 `bank/assets/www` 文件夹。该文件夹包含应用程序的完整源代码,包括 HTML 和 JS 文件。应用程序的配置可以在 `bank/res/xml/config.xml` 中找到。
要克隆应用程序,请按照以下步骤操作:
```bash
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](https://cordova.apache.org/docs/en/11.x/guide/platforms/android/)。
要确定适当的 Cordova Android 平台版本,请检查原始应用程序的 `cordova.js` 文件中的 `PLATFORM_VERSION_BUILD_LABEL`
设置平台后,安装所需的插件。原始应用程序的 `bank/assets/www/cordova_plugins.js` 文件列出了所有插件及其版本。逐个安装每个插件,如下所示:
```bash
cd bank-new
cordova plugin add cordova-plugin-dialogs@2.0.1
```
如果插件在 npm 上不可用,可以从 GitHub 获取:
```bash
cd bank-new
cordova plugin add https://github.com/moderna/cordova-plugin-cache.git
```
确保在编译之前满足所有先决条件:
```bash
cd bank-new
cordova requirements
```
要构建APK请使用以下命令
```bash
cd bank-new
cordova build android — packageType=apk
```
此命令生成一个启用调试选项的 APK便于通过 Google Chrome 进行调试。在安装之前签署 APK 是至关重要的,特别是如果应用程序包含代码篡改检测机制。
### 自动化工具
对于那些希望自动化克隆过程的人,**[MobSecco](https://github.com/Anof-cyber/MobSecco)** 是一个推荐的工具。它简化了 Android 应用程序的克隆过程,简化了上述步骤。
---
## 安全风险与近期漏洞 (2023-2025)
Cordova 的基于插件的架构意味着 **大部分攻击面位于第三方插件和 WebView 桥接内部**。以下问题在过去几年中被积极利用或公开披露:
* **恶意 NPM 包。** 在 2024 年 7 月,`cordova-plugin-acuant` 包从 NPM 注册表中删除,因为发现其在安装过程中投放恶意代码 (OSV-ID MAL-2024-7845)。任何执行过 `npm install cordova-plugin-acuant` 的开发者机器都应视为已被攻陷。审计 `package.json`/`package-lock.json` 以查找意外的 Cordova 插件,并固定可信版本。 [OSV advisory](/)
* **未验证的深度链接 → XSS/RCE。** `CleverTap Cordova Plugin ≤ 2.6.2` (CVE-2023-2507) 未能清理深度链接输入,允许攻击者注入任意 JavaScript当打开构造的链接时在主 WebView 上下文中执行。更新到 ≥ 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` 或更高版本。
### 渗透测试期间的快速检查
1. **在反编译的 `AndroidManifest.xml` 中查找 `android:debuggable="true"`。** 可调试构建通过 `chrome://inspect` 暴露 WebView允许完全的 JS 注入。
2. 审查 `config.xml` 中是否存在过于宽松的 `<access origin="*">` 标签或在 `www/index.html` 中缺失的 CSP 元标签。
3.`www/` 中 grep `eval(``new Function(` 或动态构建的 HTML这可能将 CSP 绕过转变为 XSS。
4. 识别 `plugins/` 中的嵌入插件,并运行 `npm audit --production``osv-scanner --lockfile` 以查找已知的 CVE。
---
## 动态分析技巧
### 远程 WebView 调试
如果应用程序已在 **调试** 模式下编译(或明确调用 `WebView.setWebContentsDebuggingEnabled(true)`),您可以附加 Chrome DevTools
```bash
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 发出的调用:
```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阻止内联脚本
```html
<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插件深度链接XSS
{{#include ../banners/hacktricks-training.md}}