Table of Contents
En un artículo anterior vimos un ejemplo de cómo un atacante podía analizar una app en busca de vulnerabilidades, y realizar un ataque XSS a través del mal uso de una vista web. Esperemos que después de leer eso, si no eras consciente de lo fácil que es al menos entrar en el código fuente de una aplicación publicada en la AppStore, ahora lo seas y te preguntes si hay otras formas de hackear una aplicación de iOS y cómo evitarlo.
En este artículo trataré de hacer una recopilación de cosas a comprobar si quieres asegurarte de que tu aplicación maneja los fallos de seguridad más comunes. Cubriremos los siguientes temas: API del sistema, manejo de datos, transporte de datos y endurecimiento de aplicaciones móviles.
Uso de la API del sistema
- Criptografía: Utilizar CryptoKit siempre que sea posible y comprobar su correcto uso. Evita implementar algoritmos criptográficos personalizados, aparte de los errores podría ser un problema durante las revisiones de la AppStore.
- Background de la app: Si la app maneja algún dato sensible del usuario visible en la pantalla, es posible que quieras implementar una forma de ocultar el contenido cuando la app entre en modo background (en ese momento se toma una instantánea de la app y se almacena en el dispositivo). Comprueba
applicationDidEnterBackground.
- Maneja la pasteboard de forma segura: si la persistencia de la pasteboard está habilitada, comprueba que se borra cuando la aplicación se cierra. Comprueba
UIPasteboardNameFind
yUIPasteboardNameGeneral
. - Desactiva la autocorrección de los campos de entrada sensibles o marcarlos como seguros (contraseñas, tarjetas de crédito, etc).
- Comprueba las grabaciones de pantalla no deseadas y la captura de datos sensibles. Suscríbete a
userDidTakeScreenshotNotification
y utilizaUIScreen.isCaptured()
para difuminar u ocultar el contenido. - Ten en cuenta las posibles vulnerabilidades de inyección SQL o de inyección de cadenas formateadas (esto último no debería ser un problema en Swift). Utiliza siempre cadenas parametrizadas para NSPredicates y para cadenas formateadas. Por ejemplo: en lugar de utilizar
NSPredicate(format: "(email LIKE '\(user.email)') AND (password LIKE '\(user.password)')", nil)
deberías usar mejorNSPredicate(format: "(email = @) AND (password = @)", user.email, user.password)
. Si es necesario, se pueden tomar medidas de validación del texto de entrada antes de guardarlo en la base de datos o de interactuar con el servidor. - Asegura un uso adecuado de las Web Views, comprueba y valida la posible inyección de código javascript.
Tratamiento de datos
- Establece un nivel de protección para la escritura de datos: Comprueba el uso deseado de la API de protección de datos, consulta
NSData.WritingOptions
yURLFileProtection
. - CoreData y Realm almacenan las bases de datos como archivos .db que pueden ser copiados desde su paquete, y fácilmente leídos. Asegúrate de cifrar los datos sensibles antes de almacenarlos en tu base de datos.
- No utilices
UserDefaults
para almacenar cualquier dato sensible, como tokens de acceso, indicadores de suscripción o información relevante de la cuenta. Se puede acceder a ellos fácilmente desde fuera de la aplicación. Utiliza en su lugar la API KeychainService. - Hash de datos utilizando CryptoKit en lugar de las funciones de hash de la biblioteca estándar de Swift, ya que estas últimas tienen una alta tasa de colisión.
- Consulta la documentación de Apple para estar seguro de dónde almacenar tus datos en el sistema de archivos.
Transporte de datos
- Configura correctamente la Seguridad de Transporte de Aplicaciones (ATS), intenta evitar añadir excepciones para ello.
- Usa TLS/SSL de forma segura. Comprueba que no haya HTTP y sustitúyelo por HTTPS, también comprueba que no se envíe ningún token en la URL, siempre deben enviarse en las cabeceras.
- Ten en cuenta que las solicitudes/respuestas HTTP son almacenadas en caché por NSURLSession por defecto en un archivo Cache.db. Si manejas datos sensibles, puedes querer usar
ephemeralSessionConfiguration
que no almacena cookies ni cachés. La caché global también se puede deshabilitar, revisa URLCache, puedes asignarle capacidad 0 y asignarla aURLCache.shared
.
Endurecimiento de la aplicación móvil
- Comprueba si quieres admitir teclados de terceros, y desactívalo si crees que puede ser una amenaza para tus datos.
- Ejecuta el informe de análisis estático de XCode. Puedes ayudar a revelar fugas de memoria y otros errores comunes.
- Registros de depuración: ten en cuenta que los registros son públicos por defecto, así que nunca registres información sensible, y utiliza las herramientas adecuadas para ello. Evita el uso de huellas.
- Ofuscación de código: el código puede ser fácilmente objeto de ingeniería inversa, por lo que para evitarlo podemos ofuscar el código. Hay muchas librerías de terceros para ello.
- No abuses del uso de esquemas de URL, y valida cada URL que vayas a manejar para evitar ataques XSS.
- Asegúrate de tener un sistema de detección de Jailbreak fuerte, el jailbreak es todavía posible para la mayoría de los dispositivos y iOS. Los atacantes de dispositivos con jailbreak pueden realizar ingeniería inversa de su aplicación y acceder a datos sensibles.
Conclusión
Como puedes ver, hay una cantidad considerable de cosas a tener en cuenta a la hora de abordar la seguridad de tu aplicación. Y por supuesto no son todas, pero al menos con esta lista tienes un punto para empezar a revisar tu aplicación y pensar qué elementos son relevantes para el perfil de seguridad de tu aplicación. Espero que esta breve lectura te haya sido útil y que la tengas a mano para la próxima vez que tengas que auditar la seguridad de una aplicación.
Author
-
iOS Developer working in the software development industry with agile methodologies. Skilled in Swift, objective-C, Python, PostgreSQL, SQL, PHP, and C++. More than 8 years of experience working as iOs Developer, following the best practices.
Ver todas las entradas