Cordova Apps

Reading time: 10 minutes

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

有关更多详细信息,请查看 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 文档 提供了这些安装的全面指南。

考虑一个名为 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.jscordova.jscordova-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 文件列出了所有插件及其版本。逐个安装每个插件,如下所示:

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 是一个推荐的工具。它简化了 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 --productionosv-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 auditosv-scannercordova-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

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