hacktricks/mobile-pentesting/ios-pentesting/ios-uipasteboard.md

7.2 KiB

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

{% embed url="https://websec.nl/" %}

El intercambio de datos dentro y entre aplicaciones en dispositivos iOS se facilita mediante el mecanismo UIPasteboard, que se divide en dos categorías principales:

  • Portapapeles general en todo el sistema: Se utiliza para compartir datos con cualquier aplicación y está diseñado para persistir datos a través de reinicios de dispositivo y desinstalaciones de aplicaciones, una característica disponible desde iOS 10.
  • Portapapeles personalizado / con nombre: Estos son específicamente para compartir datos dentro de una aplicación o con otra aplicación que comparte el mismo ID de equipo, y no están diseñados para persistir más allá de la vida del proceso de la aplicación que los crea, siguiendo los cambios introducidos en iOS 10.

Las consideraciones de seguridad juegan un papel importante al utilizar los portapapeles. Por ejemplo:

  • No hay un mecanismo para que los usuarios gestionen los permisos de la aplicación para acceder al portapapeles.
  • Para mitigar el riesgo de monitoreo no autorizado en segundo plano del portapapeles, el acceso está restringido cuando la aplicación está en primer plano (desde iOS 9).
  • Se desaconseja el uso de portapapeles con nombre persistentes a favor de contenedores compartidos debido a preocupaciones de privacidad.
  • La función de Portapapeles Universal introducida con iOS 10, que permite compartir contenido entre dispositivos a través del portapapeles general, puede ser gestionada por los desarrolladores para establecer la caducidad de los datos y deshabilitar la transferencia automática de contenido.

Es crucial asegurarse de que la información sensible no se almacene inadvertidamente en el portapapeles general. Además, las aplicaciones deben estar diseñadas para evitar el uso indebido de los datos del portapapeles general para acciones no deseadas, y se alienta a los desarrolladores a implementar medidas para evitar la copia de información sensible en el portapapeles.

Análisis Estático

Para el análisis estático, busca en el código fuente o binario:

  • generalPasteboard para identificar el uso del portapapeles general en todo el sistema.
  • pasteboardWithName:create: y pasteboardWithUniqueName para crear portapapeles personalizados. Verifica si la persistencia está habilitada, aunque esto está obsoleto.

Análisis Dinámico

El análisis dinámico implica enganchar o rastrear métodos específicos:

  • Monitorea generalPasteboard para el uso en todo el sistema.
  • Rastrea pasteboardWithName:create: y pasteboardWithUniqueName para implementaciones personalizadas.
  • Observa las llamadas de método setPersistent: obsoletas para verificar la configuración de persistencia.

Detalles clave a monitorear incluyen:

  • Nombres y contenidos del portapapeles (por ejemplo, verificación de cadenas, URLs, imágenes).
  • Número de elementos y tipos de datos presentes, aprovechando comprobaciones de tipos de datos estándar y personalizados.
  • Opciones de caducidad y solo local inspeccionando el método setItems:options:.

Un ejemplo de uso de herramienta de monitoreo es el monitor de portapapeles de objection, que consulta el portapapeles general cada 5 segundos en busca de cambios y muestra los nuevos datos.

Aquí tienes un ejemplo de script JavaScript simple, inspirado en el enfoque de objection, para leer y registrar cambios en el portapapeles cada 5 segundos:

const UIPasteboard = ObjC.classes.UIPasteboard;
const Pasteboard = UIPasteboard.generalPasteboard();
var items = "";
var count = Pasteboard.changeCount().toString();

setInterval(function () {
const currentCount = Pasteboard.changeCount().toString();
const currentItems = Pasteboard.items().toString();

if (currentCount === count) { return; }

items = currentItems;
count = currentCount;

console.log('[* Pasteboard changed] count: ' + count +
' hasStrings: ' + Pasteboard.hasStrings().toString() +
' hasURLs: ' + Pasteboard.hasURLs().toString() +
' hasImages: ' + Pasteboard.hasImages().toString());
console.log(items);

}, 1000 * 5);

Referencias

{% embed url="https://websec.nl/" %}

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks: