Pruebas de seguridad de aplicaciones Cordova
Los frameworks híbridos como Cordova ofrecen la ventaja de crear una sola aplicación para varias plataformas (compatibilidad con Android, iOS, Windows Phone, FireOS, FirefoxOS ...). El framework es fácil y rápido de usar para desarrollar y, por lo general, ofrece una única API para todas las plataformas.
Nativo frente a híbrido:
Los frameworks híbridos como Cordova ofrecen la ventaja de crear una sola aplicación para varias plataformas (compatibilidad con Android, iOS, Windows Phone, FireOS, FirefoxOS ...). El framework es fácil y rápido de usar para desarrollar y, por lo general, ofrece una única API para todas las plataformas.
Sin embargo, las aplicaciones híbridas sufren problemas de rendimiento, aunque las últimas versiones han mejorado mucho la velocidad del framework y el retraso resulta imperceptible en los dispositivos modernos.
Cordova:
Cordova es una plataforma para desarrollar aplicaciones móviles híbridas con HTML5, CSS3 y Javascript. Es de código abierto y está licenciada bajo la licencia Apache versión 2.0, y sus componentes principales ofrecen un amplio conjunto de funcionalidades en JavaScript, que pueden ampliarse mediante lenguajes nativos.
Funcionamiento interno:
Para revisar la seguridad de una aplicación móvil Cordova, es importante tener una comprensión inicial del funcionamiento interno del framework para saber qué buscar y dónde.
config.xml:
config.xml es el archivo de configuración principal que define varios aspectos de la aplicación móvil, como los plugins
habilitados, los ajustes específicos de cada plataforma y la lista de hooks personalizados. Para más información sobre las opciones del archivo config.xml,
consulte la siguiente URL.
En una auditoría de seguridad, es lo primero que conviene revisar para tener una comprensión inicial de las capacidades de la aplicación.
<?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>
El archivo config.xml reside en la raíz de la carpeta del proyecto Cordova, que tiene la siguiente estructura:
hooks: permite modificar el funcionamiento de la CLI de Cordovaplatforms: aloja el código nativo de cada plataforma. Los desarrolladores pueden modificarlo para ampliar o alterar el framework Cordova, aunque la forma recomendada es añadir plugins.plugins: los plugins amplían la API de JavaScript y se almacenan en esta carpetawww: es la carpeta principal donde se almacena el código HTML, JavaScript y CSS.
Whitelist:
El plugin whitelist es un plugin de seguridad importante que define los URI autorizados para la navegación, los intents y el acceso a la red. El plugin también permite definir una CSP (content-security-policy), una protección muy importante contra las vulnerabilidades de cross-site scripting (XSS), muy peligrosas para las aplicaciones Cordova.
Para más información sobre CSP, recomiendo encarecidamente el siguiente enlace y esta presentación sobre la nueva protección basada en nonces.
<!-- 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">
Plugins:
Los plugins definen el conjunto de funcionalidades que admite la aplicación. Cordova cuenta con una amplia lista de plugins existentes que dan acceso a funcionalidades comunes como la cámara, el GPS, la red y la batería. Los desarrolladores pueden crear sus propios plugins o incluir alguno de los cientos de plugins de código abierto disponibles aquí.
Los plugins de Cordova son fáciles de desarrollar; en Android, por ejemplo, se implementan simplemente extendiendo la clase CordovaPlugin y sobrescribiendo uno de los métodos execute.
Frameworks adicionales
Las aplicaciones desarrolladas con Cordova suelen utilizar frameworks complementarios como Sencha o Angular, o versiones ampliadas de Cordova como PhonGap e Ionic. Estos frameworks amplían la funcionalidad de Cordova para facilitar mucho más el desarrollo de aplicaciones; por ejemplo, Ionic ofrece servicios como notificaciones push, pruebas A/B, analítica, despliegues de código y compilaciones automatizadas.
Estos frameworks tienen su propia lógica y sus propios archivos de configuración.
Depuración:
Depurar el código, ya sea para el desarrollo o para las pruebas de seguridad, resulta muy útil para identificar errores y vulnerabilidades o para facilitar la comprensión de la aplicación. Las herramientas disponibles para depurar dependen de la plataforma de destino. En Android, es posible utilizar la depuración remota de Chrome, que da acceso a todas las herramientas de desarrollo dentro de Cordova. En iOS, es posible utilizar Safari Web Inspector, que ofrece un conjunto de funcionalidades muy similar.
Cordova se ha convertido en una alternativa real para crear aplicaciones móviles. Desde el punto de vista de la seguridad, Cordova introduce nuevos desafíos y una superficie de ataque ampliada. Estas son algunas de las debilidades de seguridad y puntos de atención más comunes:
Debilidades de seguridad comunes:
Whitelist insegura:
El plugin whitelist de Cordova es una piedra angular importante de la seguridad de las aplicaciones Cordova. Como se indicó antes, el plugin permite definir los URI autorizados a los que el WebView puede navegar, los intents autorizados que la aplicación puede solicitar en el caso de Android y los accesos a la red autorizados.
Otra característica importante del plugin es la compatibilidad con políticas CSP para protegerse frente a vulnerabilidades XSS. CSP es
necesaria porque los filtros de la whitelist no se aplican a los Websockets ni a la etiqueta HTML5 <video>.
Las políticas permisivas como:
<!-- Don't block any requests -->
<access origin="*" />
son inseguras, lamentablemente son comunes y facilitan la explotación de vulnerabilidades XSS en la aplicación. Esta vulnerabilidad la comprueba nuestro escáner de seguridad, disponible públicamente.
Cross Site Scripting (XSS):
Según la definición de OWASP, los ataques de Cross-Site Scripting (XSS) son un tipo de inyección en la que se inyectan scripts maliciosos en sitios web que, por lo demás, son benignos y de confianza. Los ataques XSS se producen cuando un atacante utiliza una aplicación web para enviar código malicioso, generalmente en forma de script del lado del navegador, a un usuario final distinto. Los fallos que permiten que estos ataques tengan éxito están bastante extendidos y se dan en cualquier lugar donde una aplicación web utiliza datos introducidos por un usuario en la salida que genera sin validarlos ni codificarlos.
Las vulnerabilidades XSS sí afectan a las aplicaciones Cordova y son muy peligrosas, ya que equivalen a una ejecución completa de código en el contexto de la aplicación móvil. El abanico de posibilidades depende de la lista de plugins cargados.
Plugins sin usar
Reducir la superficie de ataque de la aplicación es importante para reducir el impacto de vulnerabilidades como XSS, en particular con plugins de funcionalidad peligrosa, como el acceso a archivos, a la cámara y a los contactos.
Los plugins también pueden sufrir su propia clase de vulnerabilidades, como inyección SQL, acceso inseguro al sistema de archivos o inyección XXE.
Versiones de Cordova sin parches:
En el pasado, Cordova ha sufrido varias vulnerabilidades que eludían las restricciones de la whitelist y permitían cargar recursos arbitrarios. Corregir la vulnerabilidad suele requerir compilar y publicar una nueva versión de la aplicación.
Para consultar una lista de vulnerabilidades conocidas, visite la siguiente URL
Android sigue siendo Android e iOS sigue siendo iOS: además de la nueva clase de vulnerabilidades que introduce Cordova, en particular XSS, una aplicación móvil Cordova sigue siendo una aplicación móvil, y las vulnerabilidades clásicas de las aplicaciones móviles siguen siendo aplicables.