MASTG-KNOW-0076: Visualizações Web
Os WebViews são componentes de navegador incorporado para exibir conteúdo web interativo. Eles podem ser usados para incorporar conteúdo web diretamente na interface do usuário de um aplicativo. Os WebViews do iOS suportam execução de JavaScript por padrão, portanto, injeção de script e ataques de Cross-Site Scripting podem afetá-los.
Tipos de WebViews¶
Existem várias formas de incluir um WebView em um aplicativo iOS:
UIWebViewWKWebViewSFSafariViewController
UIWebView¶
UIWebView está obsoleto a partir do iOS 12 e não deve ser usado. Certifique-se de que WKWebView ou SFSafariViewController sejam usados para incorporar conteúdo web. Além disso, o JavaScript não pode ser desativado para UIWebView, o que é outro motivo para evitar seu uso.
WKWebView¶
WKWebView foi introduzido com o iOS 8 e é a escolha apropriada para estender a funcionalidade do aplicativo, controlar o conteúdo exibido (ou seja, impedir que o usuário navegue para URLs arbitrários) e personalizar.
WKWebView oferece várias vantagens de segurança em relação ao UIWebView:
- JavaScript é habilitado por padrão, mas graças à propriedade
javaScriptEnableddoWKWebView, ele pode ser completamente desativado, prevenindo todas as falhas de injeção de script. JavaScriptCanOpenWindowsAutomaticallypode ser usado para impedir que o JavaScript abra novas janelas, como pop-ups.- A propriedade
hasOnlySecureContentpode ser usada para verificar se os recursos carregados pelo WebView são recuperados por meio de conexões criptografadas. WKWebViewimplementa renderização fora do processo, portanto, bugs de corrupção de memória não afetarão o processo principal do aplicativo.
Uma Ponte JavaScript pode ser habilitada ao usar WKWebView e UIWebView. Consulte a seção "Funcionalidade Nativa Exposta Através de WebViews") abaixo para mais informações.
SFSafariViewController¶
SFSafariViewController está disponível a partir do iOS 9 e deve ser usado para fornecer uma experiência generalizada de visualização web. Esses WebViews podem ser facilmente identificados, pois possuem um layout característico que inclui os seguintes elementos:
- Um campo de endereço somente leitura com um indicador de segurança.
- Um botão de Ação ("Compartilhar").
- Um botão Concluir, botões de navegação para trás e para frente, e um botão "Safari" para abrir a página diretamente no Safari.

Há alguns pontos a considerar:
- JavaScript não pode ser desativado no
SFSafariViewController, e esta é uma das razões pelas quais o uso deWKWebViewé recomendado quando o objetivo é estender a interface do usuário do aplicativo. SFSafariViewControllertambém compartilha cookies e outros dados de site com o Safari.- A atividade do usuário e a interação com um
SFSafariViewControllernão são visíveis para o aplicativo, que não pode acessar dados de AutoPreenchimento, histórico de navegação ou dados do site. - De acordo com as Diretrizes de Revisão da App Store, os
SFSafariViewControllers não podem ser ocultos ou obscurecidos por outras visualizações ou camadas.
Isso deve ser suficiente para uma análise de aplicativo e, portanto, SFSafariViewControllers estão fora do escopo para as seções de Análise Estática e Dinâmica.
Safari Web Inspector¶
Habilitar o Safari Web Inspector no iOS permite que você inspecione remotamente o conteúdo de um WebView a partir de um dispositivo macOS. Isso é particularmente útil em aplicativos que expõem APIs nativas usando uma ponte JavaScript, como aplicativos híbridos.
O Safari Web Inspector requer que os aplicativos tenham a permissão get-task-allowed. O aplicativo Safari tem essa permissão por padrão, então você pode visualizar o conteúdo de qualquer página carregada nele. No entanto, aplicativos instalados da App Store não terão essa permissão e não podem ser anexados. Em dispositivos com jailbreak, você pode adicionar essa permissão a qualquer aplicativo instalando GlobalWebInspect. Então, você pode anexar o Safari em seu host para examinar o conteúdo do WebView (consulte Anexar ao WKWebView).
Funcionalidade Nativa Exposta Através de WebViews¶
No iOS 7, a Apple introduziu APIs que permitem a comunicação entre o tempo de execução JavaScript no WebView e os objetos nativos Swift ou Objective-C. Se essas APIs forem usadas de forma descuidada, funcionalidades importantes podem ser expostas a atacantes que conseguem injetar scripts maliciosos no WebView (por exemplo, através de um ataque de Cross-Site Scripting bem-sucedido).
Tanto UIWebView quanto WKWebView fornecem um meio de comunicação entre o WebView e o aplicativo nativo. Quaisquer dados importantes ou funcionalidades nativas expostas ao mecanismo JavaScript do WebView também estariam acessíveis a JavaScript malicioso em execução no WebView.
UIWebView:
Existem duas formas fundamentais de como o código nativo e o JavaScript podem se comunicar:
- JSContext: Quando um bloco Objective-C ou Swift é atribuído a um identificador em um
JSContext, o JavaScriptCore automaticamente encapsula o bloco em uma função JavaScript. - Protocolo JSExport: Propriedades, métodos de instância e métodos de classe declarados em um protocolo herdado de
JSExportsão mapeados para objetos JavaScript que estão disponíveis para todo o código JavaScript. Modificações de objetos que estão no ambiente JavaScript são refletidas no ambiente nativo.
Note que apenas membros de classe definidos no protocolo JSExport são tornados acessíveis ao código JavaScript.
WKWebView:
O código JavaScript em um WKWebView ainda pode enviar mensagens de volta para o aplicativo nativo, mas, em contraste com o UIWebView, não é possível referenciar diretamente o JSContext de um WKWebView. Em vez disso, a comunicação é implementada usando um sistema de mensagens e usando a função postMessage, que automaticamente serializa objetos JavaScript em objetos nativos Objective-C ou Swift. Os manipuladores de mensagem são configurados usando o método add(_ scriptMessageHandler:name:).