10 KiB
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
-
¿Trabajas en una empresa de ciberseguridad? ¿Quieres ver tu empresa anunciada en HackTricks? ¿O quieres tener acceso a la última versión de PEASS o descargar HackTricks en PDF? ¡Consulta los PLANES DE SUSCRIPCIÓN!
-
Descubre The PEASS Family, nuestra colección exclusiva de NFTs
-
Obtén el oficial PEASS & HackTricks swag
-
Únete al 💬 grupo de Discord o al grupo de telegram o sígueme en Twitter 🐦@carlospolopm.
-
Comparte tus trucos de hacking enviando PRs al repositorio de hacktricks y al repositorio de hacktricks-cloud.
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:
ypasteboardWithUniqueName
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 opasteboardWithUniqueName
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 utilizandoitemSetWithPasteboardTypes:
y estableciendo los UTIs correspondientes. - Verificar elementos excluidos o que caducan enganchando
setItems:options:
e inspeccionando sus opciones paraUIPasteboardOptionLocalOnly
oUIPasteboardOptionExpirationDate
.
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 🎥
-
¿Trabajas en una empresa de ciberseguridad? ¿Quieres ver tu empresa anunciada en HackTricks? ¿O quieres tener acceso a la última versión de PEASS o descargar HackTricks en PDF? ¡Consulta los PLANES DE SUSCRIPCIÓN!
-
Descubre The PEASS Family, nuestra colección de exclusivos NFTs
-
Obtén el swag oficial de PEASS y HackTricks
-
Únete al 💬 grupo de Discord o al grupo de telegram o sígueme en Twitter 🐦@carlospolopm.
-
Comparte tus trucos de hacking enviando PR al repositorio de hacktricks y al repositorio de hacktricks-cloud.