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

10 KiB

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

O 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, o que mitiga a monitoração do pasteboard em segundo plano.
  • A Apple adverte sobre pasteboards nomeados persistentes 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, 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: ou pasteboardWithUniqueName. 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: 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.
  • 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, por exemplo, hasImages, hasStrings, hasURLs (a partir do iOS 10).
  • Verifique outros tipos de dados (tipicamente UTIs) com containsPasteboardTypes:inItemSet:. Você pode inspecionar tipos de dados mais concretos, como uma imagem como public.png e public.tiff (UTIs) 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: 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) lê os itens do pasteboard a cada 5 segundos, se houver algo novo, ele será impresso:

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" %}

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