我们的 AI 引擎 Neutron 在加州大学伯克利分校的 CyberGym 基准测试中取得了 96.75% 的成绩。 了解更多

安全

安全

测试 Cordova 应用

Cordova 等混合框架的优势在于只需构建一个应用即可覆盖多个平台(支持 Android、iOS、Windows Phone、FireOS、FirefoxOS 等)。该框架开发起来简单快捷,并且通常为所有平台提供统一的 API。

原生与混合:

Cordova 等混合框架的优势在于只需构建一个应用即可覆盖多个平台(支持 Android、iOS、Windows Phone、FireOS、FirefoxOS 等)。该框架开发起来简单快捷,并且通常为所有平台提供统一的 API。

不过,混合应用存在性能问题,尽管最新版本已大幅提升了框架的速度,而且在现代手机上这种延迟已难以察觉。

Cordova:

Cordova 是一个使用 HTML5、CSS3 和 Javascript 开发混合移动应用的平台,它是开源的,采用 Apache Licence version 2.0 许可证。其核心组件以 JavaScript 提供了丰富的功能,并且可以使用原生语言进行扩展。

内部机制:

要审查 Cordova 移动应用的安全性,首先需要对框架的内部机制有初步了解,才能知道应该查找什么以及在哪里查找。

config.xml:

config.xml 是主配置文件,它定义了移动应用的多个方面,例如已启用的插件、特定平台的设置以及自定义 Hook 列表。有关 config.xml 文件选项的更多信息,请查看以下 URL。

在安全审计中,这是首先要检查的内容,以便初步了解应用具备的能力。

<?xml version='1.0' encoding='utf-8'?>
<widget id="io.cordova.hellocordova" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
  <name>HelloCordova</name>
  <description>
      A sample Apache Cordova application that responds to the deviceready event.
  </description>
  <author email="dev@cordova.apache.org" href="http://cordova.io">
      Apache Cordova Team
  </author>
  <content src="index.html" />
  <plugin name="cordova-plugin-whitelist" spec="1" />
  <access origin="*" />
  <allow-intent href="http://*/*" />
  <allow-intent href="https://*/*" />
  <allow-intent href="tel:*" />
  <allow-intent href="sms:*" />
  <allow-intent href="mailto:*" />
  <allow-intent href="geo:*" />
  <platform name="android">
      <allow-intent href="market:*" />
  </platform>
  <platform name="ios">
      <allow-intent href="itms:*" />
      <allow-intent href="itms-apps:*" />
  </platform>
</widget>

config.xml 文件位于 Cordova 项目文件夹的根目录,该文件夹的结构如下:

  • hooks:用于修改 Cordova CLI 的工作方式
  • platforms:存放各个平台的原生代码。开发人员可以修改它来扩展或改变 Cordova 框架,不过推荐的方式是添加插件。
  • plugins:插件用于扩展 JavaScript API,存放在此文件夹中
  • www:这是存放 HTML、JavaScript 和 CSS 代码的主文件夹。

白名单:

白名单插件是一个重要的安全插件,它定义了允许用于导航、Intent 和网络访问的 URI。该插件还支持定义 CSP(content-security-policy,内容安全策略),这是防御跨站脚本(XSS)漏洞的一项非常重要的保护措施,而 XSS 漏洞对 Cordova 应用而言极其危险。

关于 CSP 的更多信息,我强烈推荐以下链接,以及这场关于新的基于 nonce 的保护机制的演讲。

<!-- Good default declaration:
    * gap: is required only on iOS (when using UIWebView) and is needed for JS->native communication
    * https://ssl.gstatic.com is required only on Android and is needed for TalkBack to function properly
    * Disables use of eval() and inline scripts in order to mitigate risk of XSS vulnerabilities. To change this:
        * Enable inline JS: add 'unsafe-inline' to default-src
        * Enable eval(): add 'unsafe-eval' to default-src
-->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com; style-src 'self' 'unsafe-inline'; media-src *">

<!-- Allow everything but only from the same origin and foo.com -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' foo.com">

<!-- This policy allows everything (eg CSS, AJAX, object, frame, media, etc) except that 
    * CSS only from the same origin and inline styles,
    * scripts only from the same origin and inline styles, and eval()
-->
<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">

<!-- Allows XHRs only over HTTPS on the same domain. -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' https:">

<!-- Allow iframe to https://cordova.apache.org/ -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; frame-src 'self' https://cordova.apache.org">

插件:

插件定义了应用所支持的一组功能。Cordova 拥有丰富的现成插件,可用于访问相机、GPS、网络和电池等常见功能。开发人员可以开发自己的插件,也可以引入这里提供的数百个开源插件之一。

Cordova 插件开发起来很容易,例如在 Android 上,只需继承 CordovaPlugin 类并重写其中一个 execute 方法即可实现。

其他框架

使用 Cordova 开发的应用通常会配合使用 Sencha、Angular 等框架,或者使用 PhonGap 和 Ionic 等 Cordova 的扩展版本。这些框架扩展了 Cordova 的功能,让应用开发变得容易得多,例如 Ionic 提供推送通知、A/B 测试、分析、代码部署和自动化构建等服务。

这些框架有各自的逻辑和配置文件。

调试:

无论是出于开发还是安全测试目的,调试代码都非常有助于发现缺陷和漏洞,或帮助理解应用。可用的调试工具取决于目标平台。在 Android 上,可以使用 Chrome 远程调试,它能让您在 Cordova 中使用全部开发者工具。在 iOS 上,可以使用 Safari Web Inspector,它提供了一组非常相似的功能。

Cordova 已经成为构建移动应用的一个真正的替代方案。从安全角度看,Cordova 带来了新的挑战和更大的攻击面,以下是一些常见的安全弱点和需要注意的地方:

常见安全弱点:

不安全的白名单:

白名单 Cordova 插件是 Cordova 应用安全的重要基石。如前所述,该插件可用于定义 WebView 允许导航到的 URI、应用允许请求的 Intent(针对 Android)以及允许的网络访问。

该插件的另一项重要功能是支持 CSP 策略,以防御 XSS 漏洞。CSP 是必需的,因为白名单过滤器不适用于 Websockets 和 HTML5 的 <video> 标签。

诸如以下这样的宽松策略:

<!-- Don't block any requests -->
<access origin="*" />

是不安全的,可惜却很常见,并且会让应用中 XSS 漏洞的利用变得更加容易。我们公开提供的安全扫描器会检查这一漏洞。

跨站脚本(XSS):

根据 OWASP 的定义,跨站脚本(XSS)攻击是一种注入攻击,恶意脚本被注入到原本无害且可信的网站中。当攻击者利用 Web 应用向另一位终端用户发送恶意代码(通常是浏览器端脚本)时,就会发生 XSS 攻击。使这类攻击得以成功的缺陷相当普遍,只要 Web 应用在其生成的输出中使用了用户输入、却未对其进行验证或编码,就可能出现这类缺陷。

XSS 漏洞同样适用于 Cordova 应用,而且极其危险,因为它们相当于在移动应用的上下文中实现了完整的代码执行。可实现的操作范围取决于已加载插件的列表。

未使用的插件

缩小应用的攻击面对于降低 XSS 等漏洞的影响非常重要,尤其是那些具有危险功能的插件,例如文件、相机和联系人访问。

插件本身也可能存在各类漏洞,例如 SQL 注入、不安全的文件系统访问或 XXE 注入。

未打补丁的 Cordova 版本:

Cordova 过去曾出现过多个绕过白名单限制、可加载任意资源的漏洞。修复此类漏洞通常需要构建并发布应用的新版本。

已知漏洞列表请查看以下 URL

Android 依然是 Android,iOS 依然是 iOS:除了 Cordova 引入的新型漏洞(尤其是 XSS)之外,Cordova 移动应用归根结底仍是移动应用,传统的移动应用漏洞依然适用。

标签:

android, ios