mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
126 lines
7.7 KiB
Markdown
126 lines
7.7 KiB
Markdown
# 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}}
|