hacktricks/mobile-pentesting/ios-pentesting/ios-uipasteboard.md
2023-06-06 18:56:34 +00:00

109 lines
10 KiB
Markdown

<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
- Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
- Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
- Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
- **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Compartilhe suas técnicas de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
</details>
O [`UIPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard) permite compartilhar dados dentro de um aplicativo e de um aplicativo para outros aplicativos. Existem dois tipos de pasteboards:
* **pasteboard geral do sistema**: para compartilhar dados com **qualquer aplicativo**. Persistente por padrão em reinicializações de dispositivos e desinstalações de aplicativos (desde o iOS 10).
* **pasteboards personalizados / nomeados**: para compartilhar dados **com outro aplicativo** (que possui o mesmo ID de equipe do aplicativo a ser compartilhado) ou com o **próprio aplicativo** (eles estão disponíveis apenas no processo que os cria). Não persistentes por padrão (desde o iOS 10), ou seja, eles existem apenas até que o aplicativo proprietário (criador) seja encerrado.
Algumas considerações de segurança:
* Os usuários **não podem conceder ou negar permissão** para que os aplicativos leiam o **pasteboard**.
* Desde o iOS 9, os aplicativos [não podem acessar o pasteboard enquanto estão em segundo plano](https://forums.developer.apple.com/thread/13760), o que mitiga a monitoração do pasteboard em segundo plano.
* [A Apple adverte sobre pasteboards nomeados persistentes](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc) e **desencoraja seu uso**. Em vez disso, devem ser usados contêineres compartilhados.
* A partir do iOS 10, há um novo recurso Handoff chamado **Universal Clipboard** que é ativado por padrão. Ele permite que o **conteúdo do pasteboard geral seja transferido automaticamente entre dispositivos**. Este recurso pode ser desativado se o desenvolvedor optar por fazê-lo e também é possível definir uma data e hora de expiração para os dados copiados.
Portanto, é importante **verificar se informações confidenciais não estão sendo salvas no pasteboard global**.\
Também é importante verificar se um **aplicativo não está usando os dados do pasteboard global para executar ações**, pois um aplicativo malicioso pode adulterar esses dados.
Um **aplicativo também pode impedir que seus usuários copiem dados confidenciais para a área de transferência** (o que é recomendado).
## Análise estática
O **pasteboard geral do sistema** pode ser obtido usando [`generalPasteboard`](https://developer.apple.com/documentation/uikit/uipasteboard/1622106-generalpasteboard?language=objc), pesquise o código-fonte ou o binário compilado para este método. O uso do pasteboard geral do sistema deve ser evitado ao lidar com dados confidenciais.
**Pasteboards personalizados** podem ser criados com [`pasteboardWithName:create:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622074-pasteboardwithname?language=objc) ou [`pasteboardWithUniqueName`](https://developer.apple.com/documentation/uikit/uipasteboard/1622087-pasteboardwithuniquename?language=objc). Verifique se os pasteboards personalizados estão definidos como persistentes, pois isso é obsoleto desde o iOS 10. Deve ser usado um contêiner compartilhado.
## Análise dinâmica
Intercepte ou rastreie o seguinte:
* `generalPasteboard` para o pasteboard geral do sistema.
* `pasteboardWithName:create:` e `pasteboardWithUniqueName` para pasteboards personalizados.
Você também pode interceptar ou rastrear o método obsoleto [`setPersistent:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622096-setpersistent?language=objc) e verificar se ele está sendo chamado.
Ao **monitorar** os **pasteboards**, há vários **detalhes** que podem ser **recuperados** dinamicamente:
* Obtenha o **nome do pasteboard** interceptando `pasteboardWithName:create:` e inspecionando seus parâmetros de entrada ou `pasteboardWithUniqueName` e inspecionando seu valor de retorno.
* Obtenha o **primeiro item disponível no pasteboard**: por exemplo, para strings, use o método `string`. Ou use qualquer um dos outros métodos para os [tipos de dados padrão](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc#1654275).
* Obtenha o **número de itens** com `numberOfItems`.
* Verifique a **existência de tipos de dados padrão** com os [métodos de conveniência](https://developer.apple.com/documentation/uikit/uipasteboard?language=objc#2107142), por exemplo, `hasImages`, `hasStrings`, `hasURLs` (a partir do iOS 10).
* Verifique outros tipos de dados (tipicamente UTIs) com [`containsPasteboardTypes:inItemSet:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622100-containspasteboardtypes?language=objc). Você pode inspecionar tipos de dados mais concretos, como uma imagem como public.png e public.tiff ([UTIs](http://web.archive.org/web/20190616231857/https://developer.apple.com/documentation/mobilecoreservices/uttype)) ou dados personalizados, como com.mycompany.myapp.mytype. Lembre-se de que, nesse caso, apenas os aplicativos que _declararam conhecimento_ do tipo são capazes de entender os dados escritos no pasteboard. Recupere-os usando [`itemSetWithPasteboardTypes:`](https://developer.apple.com/documentation/uikit/uipasteboard/1622071-itemsetwithpasteboardtypes?language=objc) e definindo os UTIs correspondentes.
* Verifique itens excluídos ou expirados interceptando `setItems:options:` e inspecionando suas opções para `UIPasteboardOptionLocalOnly` ou `UIPasteboardOptionExpirationDate`.
Se estiver procurando apenas por strings, convém usar o comando **objection** `ios pasteboard monitor`:
> Interfere na classe UIPasteboard do iOS e verifica o generalPasteboard a cada 5 segundos em busca de dados. Se novos dados forem encontrados, diferentes da pesquisa anterior, esses dados serão exibidos na tela.
Você também pode criar seu próprio monitor de pasteboard que monitora informações específicas, como visto acima.
Por exemplo, este script (inspirado no script por trás do monitor de pasteboard do [objection](https://github.com/sensepost/objection/blob/b39ee53b5ba2e9a271797d2f3931d79c46dccfdb/agent/src/ios/pasteboard.ts)) lê os itens do pasteboard a cada 5 segundos, se houver algo novo, ele será impresso:
```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);
```
# Referências
{% embed url="https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-object-persistence-mstg-platform-8" %}
<details>
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
- Você trabalha em uma **empresa de cibersegurança**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
- Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
- Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
- **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
- **Compartilhe suas técnicas de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [repositório hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
</details>