hacktricks/mobile-pentesting/ios-pentesting/ios-uipasteboard.md
2023-06-03 01:46:23 +00:00

10 KiB

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

El UIPasteboard permite compartir datos dentro de una aplicación y desde una aplicación a otras aplicaciones. Hay dos tipos de portapapeles:

  • portapapeles general de todo el sistema: para compartir datos con cualquier aplicación. Persistente por defecto en reinicios de dispositivo y desinstalaciones de aplicaciones (desde iOS 10).
  • portapapeles personalizado / con nombre: para compartir datos con otra aplicación (que tenga el mismo ID de equipo que la aplicación que comparte) o con la propia aplicación (solo están disponibles en el proceso que los crea). No persistentes por defecto (desde iOS 10), es decir, solo existen hasta que la aplicación propietaria (creadora) se cierra.

Algunas consideraciones de seguridad:

  • Los usuarios no pueden otorgar ni denegar permiso para que las aplicaciones lean el portapapeles.
  • Desde iOS 9, las aplicaciones no pueden acceder al portapapeles mientras están en segundo plano, lo que mitiga la monitorización del portapapeles en segundo plano.
  • Apple advierte sobre los portapapeles personalizados persistentes y desaconseja su uso. En su lugar, se deben utilizar contenedores compartidos.
  • A partir de iOS 10, hay una nueva función de Handoff llamada Portapapeles universal que está habilitada de forma predeterminada. Permite que el contenido del portapapeles general se transfiera automáticamente entre dispositivos. Esta función se puede desactivar si el desarrollador decide hacerlo y también es posible establecer una fecha y hora de caducidad para los datos copiados.

Por lo tanto, es importante verificar que no se está guardando información sensible dentro del portapapeles general.
También es importante verificar que una aplicación no está utilizando los datos del portapapeles general para realizar acciones, ya que una aplicación malintencionada podría manipular estos datos.

Una aplicación también puede evitar que sus usuarios copien datos sensibles al portapapeles (lo que se recomienda).

Análisis estático

El portapapeles general de todo el sistema se puede obtener utilizando generalPasteboard, buscar en el código fuente o en el binario compilado para encontrar este método. Se debe evitar el uso del portapapeles general de todo el sistema al tratar con datos sensibles.

Se pueden crear portapapeles personalizados con pasteboardWithName:create: o pasteboardWithUniqueName. Verificar si los portapapeles personalizados están configurados para ser persistentes, ya que esto está obsoleto desde iOS 10. En su lugar, se debe utilizar un contenedor compartido.

Análisis dinámico

Enganchar o rastrear lo siguiente:

  • generalPasteboard para el portapapeles general de todo el sistema.
  • pasteboardWithName:create: y pasteboardWithUniqueName para portapapeles personalizados.

También se puede enganchar o rastrear el método obsoleto setPersistent: y verificar si se está llamando.

Al monitorizar los portapapeles, hay varios detalles que se pueden obtener dinámicamente:

  • Obtener el nombre del portapapeles enganchando pasteboardWithName:create: e inspeccionando sus parámetros de entrada o pasteboardWithUniqueName e inspeccionando su valor de retorno.
  • Obtener el primer elemento disponible del portapapeles: por ejemplo, para cadenas de texto, utilizar el método string. O utilizar cualquiera de los otros métodos para los tipos de datos estándar.
  • Obtener el número de elementos con numberOfItems.
  • Verificar la existencia de tipos de datos estándar con los métodos de conveniencia, por ejemplo, hasImages, hasStrings, hasURLs (a partir de iOS 10).
  • Verificar otros tipos de datos (típicamente UTIs) con containsPasteboardTypes:inItemSet:. Se pueden inspeccionar tipos de datos más concretos, como por ejemplo una imagen como public.png y public.tiff (UTIs) o datos personalizados como com.mycompany.myapp.mytype. Recuerda que, en este caso, solo aquellas aplicaciones que declaren conocimiento del tipo pueden entender los datos escritos en el portapapeles. Se pueden recuperar utilizando itemSetWithPasteboardTypes: y estableciendo los UTIs correspondientes.
  • Verificar elementos excluidos o que caducan enganchando setItems:options: e inspeccionando sus opciones para UIPasteboardOptionLocalOnly o UIPasteboardOptionExpirationDate.

Si solo se buscan cadenas de texto, se puede utilizar el comando objection ios pasteboard monitor:

Se engancha en la clase UIPasteboard de iOS y sondea el portapapeles general cada 5 segundos en busca de datos. Si se encuentra un nuevo dato, diferente al de la última consulta, se imprimirá en pantalla.

También se puede construir un monitor de portapapeles propio que monitorice información específica como se ha visto anteriormente.

Por ejemplo, este script (inspirado en el script detrás del monitor de portapapeles de objection) lee los elementos del portapapeles cada 5 segundos, si hay algo nuevo lo imprimirá:

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://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥