mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
79 lines
4.7 KiB
Markdown
79 lines
4.7 KiB
Markdown
{{#include ../../banners/hacktricks-training.md}}
|
|
|
|
El intercambio de datos dentro y entre aplicaciones en dispositivos iOS se facilita mediante el mecanismo [`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard), que se divide en dos categorías principales:
|
|
|
|
- **Portapapeles general del sistema**: Este se utiliza para compartir datos con **cualquier aplicación** y está diseñado para persistir datos a través de reinicios del dispositivo y desinstalaciones de aplicaciones, una característica que está disponible desde iOS 10.
|
|
- **Portapapeles personalizados / nombrados**: Estos son específicamente para el intercambio de 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.
|
|
|
|
**Consideraciones de seguridad** juegan un papel significativo al utilizar portapapeles. Por ejemplo:
|
|
|
|
- No hay un mecanismo para que los usuarios gestionen los permisos de las aplicaciones para acceder al **portapapeles**.
|
|
- Para mitigar el riesgo de monitoreo no autorizado en segundo plano del portapapeles, el acceso se restringe a cuando la aplicación está en primer plano (desde iOS 9).
|
|
- Se desaconseja el uso de portapapeles nombrados persistentes en favor de contenedores compartidos debido a preocupaciones de privacidad.
|
|
- La función **Universal Clipboard** 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 expiración de datos y deshabilitar la transferencia automática de contenido.
|
|
|
|
Asegurarse de que **la información sensible no se almacene inadvertidamente** en el portapapeles global es crucial. Además, las aplicaciones deben diseñarse para prevenir el uso indebido de los datos del portapapeles global para acciones no intencionadas, y se alienta a los desarrolladores a implementar medidas para evitar la copia de información sensible al portapapeles.
|
|
|
|
### Análisis Estático
|
|
|
|
Para el análisis estático, busque en el código fuente o binario:
|
|
|
|
- `generalPasteboard` para identificar el uso del **portapapeles general del sistema**.
|
|
- `pasteboardWithName:create:` y `pasteboardWithUniqueName` para crear **portapapeles personalizados**. Verifique si la persistencia está habilitada, aunque esto está en desuso.
|
|
|
|
### Análisis Dinámico
|
|
|
|
El análisis dinámico implica enganchar o rastrear métodos específicos:
|
|
|
|
- Monitorear `generalPasteboard` para el uso a nivel del sistema.
|
|
- Rastrear `pasteboardWithName:create:` y `pasteboardWithUniqueName` para implementaciones personalizadas.
|
|
- Observar las llamadas al método en desuso `setPersistent:` para verificar la configuración de persistencia.
|
|
|
|
Los detalles clave a monitorear incluyen:
|
|
|
|
- **Nombres de portapapeles** y **contenidos** (por ejemplo, verificar cadenas, URLs, imágenes).
|
|
- **Número de elementos** y **tipos de datos** presentes, aprovechando las verificaciones de tipos de datos estándar y personalizados.
|
|
- **Opciones de expiración y solo local** inspeccionando el método `setItems:options:`.
|
|
|
|
Un ejemplo del uso de herramientas de monitoreo es el **monitor de portapapeles de objection**, que consulta el generalPasteboard cada 5 segundos en busca de cambios y muestra los nuevos datos.
|
|
|
|
Aquí hay un ejemplo simple de script en JavaScript, inspirado en el enfoque de objection, para leer y registrar cambios del portapapeles cada 5 segundos:
|
|
```javascript
|
|
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
|
|
|
|
- [https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8](https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8)
|
|
- [https://hackmd.io/@robihamanto/owasp-robi](https://hackmd.io/@robihamanto/owasp-robi)
|
|
- [https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0073/](https://mas.owasp.org/MASTG/tests/ios/MASVS-PLATFORM/MASTG-TEST-0073/)
|
|
|
|
|
|
{{#include ../../banners/hacktricks-training.md}}
|