Announcement

Como usar manipuladores de URL e OpenURL com segurança em seu aplicativo Unity

BRANDON CALDWELL Anonymous
Nov 6, 2019|7 Min
Como usar manipuladores de URL e OpenURL com segurança em seu aplicativo Unity
Esta página da Web foi automaticamente traduzida para sua conveniência. Não podemos garantir a precisão ou a confiabilidade do conteúdo traduzido. Se tiver dúvidas sobre a precisão do conteúdo traduzido, consulte a versão oficial em inglês da página da Web.

A equipe de segurança da Unity se concentra em ajudar os criadores da Unity a criar jogos e aplicativos mais confiáveis. Sintonize esta série de blogs para obter dicas, técnicas e recomendações para criar jogos e aplicativos mais seguros com o Unity.

Hoje estamos lançando uma série de blogs sobre desenvolvimento seguro com Unity. Esta série fornecerá conteúdo que os desenvolvedores do Unity podem aplicar diretamente em seus jogos e aplicativos. Esperamos cobrir uma variedade de tópicos, desde o conhecimento básico até o avançado, com foco nas melhores práticas no uso de produtos e serviços da Unity . Se houver algum assunto sobre o qual você gostaria de ler, avise-nos. Aguardamos seu feedback. O foco principal deste blog é uma visão geral dos manipuladores de URL.

Como usar manipuladores de URL e OpenURL com segurança em seu aplicativo Unity

Os manipuladores de URL e arquivo associam tipos de arquivo ao programa instalado que pode abrir o arquivo especificado, mas eles apresentam riscos. Por exemplo, quando você está em sua máquina local e clica duas vezes para abrir um arquivo PDF em sua unidade local, seu sistema operacional consulta sua lista de gerenciadores de arquivos e seleciona o programa atribuído para aquele tipo de arquivo, para que seu PDF seja aberto por um programa que possa exibi-lo corretamente. Os manipuladores de arquivos geralmente usam a extensão do arquivo (por exemplo, .pdf – o sufixo no final do nome do arquivo) para decidir como lidar com o arquivo.

Um mecanismo semelhante, o manipulador de URL, decide como abrir URLs com base no prefixo do caminho. Um exemplo disso seria o onipresente protocolo https://, que abre seu navegador padrão. Outro exemplo de um esquema de URL comum seria file://c:/windows/system32/drivers/gmreadme.txt; inserir essa URL na caixa de diálogo Executar fará com que o Windows abra esse arquivo de licença no Bloco de Notas.

Os manipuladores de URL são um recurso útil do seu sistema operacional que economizam tempo dos usuários ao iniciar aplicativos. No entanto, esse mecanismo conveniente pode, ocasionalmente, ser inseguro.

Por que os manipuladores de URL são importantes para jogos Unity ?

O Unity Editor e o Unity Runtime oferecem suporte ao uso programático de manipuladores de URL, tanto por meio do uso do .NET Framework, quanto por meio de uma API de script específica do Unity , chamada Application.OpenURL. Os desenvolvedores de jogos geralmente usam o OpenUrl para que, quando um jogador clica em um link no jogo, ele inicie o navegador da web do sistema local. No entanto, se o desenvolvedor do jogo não higienizar adequadamente o que é passado para Application.OpenURL, seu jogador poderá estar em risco.

Esta API de script não é inerentemente insegura, mas em qualquer caso em que uma entrada não confiável seja usada como parte da URL transmitida, você precisa tomar cuidado.

Observação: Entrada não confiável

Entradas/dados não confiáveis são quaisquer dados que não vêm de uma fonte confiável. Então, o que é uma fonte confiável? No contexto deste artigo, apenas seus endpoints com HTTPS estrito habilitado devem ser considerados confiáveis.

Há muitos exemplos de informações não confiáveis. Se você estiver projetando um sistema anti-trapaça, o sistema de arquivos local do jogador deve ser considerado não confiável. Se você estiver desenvolvendo um jogo multijogador, todos os jogadores devem ser considerados não confiáveis.

Existem outras maneiras de proteger dados/entradas aproveitando recursos como criptografia de chave pública-privada, mas elas estão além do escopo deste artigo. (Deixe um comentário se estiver interessado em saber mais sobre isso.)

Explorando o manuseio de URL e uso inseguro

Embora esses manipuladores ofereçam grande conveniência aos usuários, eles apresentam riscos inerentes. Aqui está um exemplo de uso inseguro de Application.OpenURL:

using UnityEngine;
usando System. Collections;

classe pública VulnerableBrowserClass: MonoBehaviour {
// Passe a URL do link em que um jogador clicou em nossos fóruns de jogo
vazio OpenBrowser(string url_from_chat) {
Application.OpenURL(url_from_chat); // ←- Ruim aqui; o valor não foi higienizado
}
}

Figura 1. Exemplo de uso inseguro de Application.OpenURL

Neste exemplo, o sistema de comentários do jogo permite que os usuários compartilhem links; quando um usuário clica em um link, a função VulnerableBrowserClass.OpenBrowser é chamada.

Cenário de exemplo

Figura 2. Cenário de exemplo com um link potencialmente perigoso

Você pode ver como é fácil enviar a um usuário desavisado um link para um aplicativo potencialmente perigoso (Figura 2). Se esse URL for passado diretamente para Application.OpenURL, como mostrado na Figura 1, a máquina da vítima executará imediatamente o aplicativo naquele link, potencialmente permitindo que um invasor assuma o controle do sistema da vítima.

Na imagem acima, o invasor pode formatar o link acima para aparecer como https://SuperLeetCheats.com/VulnTheGame na janela de bate-papo, mas fazer com que o link real vá para o malware em: file://leethaxorz.net/super_malware.exe. O problema aqui não é que os usuários podem enviar links uns aos outros; o problema está em pegar os links enviados por um usuário (potencialmente o invasor) e passá-los diretamente para Application.OpenURL sem qualquer validação ou higienização, como visto no exemplo de código acima (Figura 1). Sem essa higienização, clicar no link acima faria com que o Unity Editor entregasse o arquivo diretamente ao sistema operacional do jogador alvo, provavelmente resultando na execução do malware do invasor.

Como posso mitigar o risco?

A maneira mais segura de usar Application.OpenURL é nunca usá-lo com dados não confiáveis . Use-o somente para abrir URLs que vêm de seus desenvolvedores ou servidores e por meio de um transporte confiável (por exemplo, HTTPS).

Se você usar configurações remotas (por exemplo, se você hospeda uma lista de URLs de conteúdo para novas atualizações), garanta que esses dados sejam recuperados somente via HTTPS, com aplicação rigorosa. Sempre recupere conteúdo remoto dessa maneira.

Observação: O HTTPS não corrigirá nenhuma vulnerabilidade no seu aplicativo devido a entradas não confiáveis/não higienizadas, conforme descrito no ataque acima. No entanto, isso garantirá que os dados enviados ao seu aparelho não tenham sido adulterados durante o transporte.

Se você decidiu que realmente precisa usar o OpenUrl com dados de fontes não confiáveis, então você deve fazer o possível para higienizar a entrada que você recebe da fonte não confiável. Há algumas maneiras de fazer isso, como com correspondência de padrões regex, criando URLs por meio de bibliotecas .Net ou aproveitando bibliotecas externas de higienização. Entretanto, nenhuma dessas mitigações funcionará 100% do tempo e, não importa qual solução você escolher, algum risco potencial será assumido se Application.OpenUrl (e funções semelhantes) for usado com dados não confiáveis.

Além disso, como mostrado na Figura 2 acima, não há como os usuários saberem qual URL está por trás desse link. No mínimo, forneça aos usuários um prompt com o URL completo que eles estão prestes a visitar. Mas você não deve considerar isso uma solução robusta, pois os usuários costumam clicar cegamente em qualquer prompt que lhes é apresentado.

Por que se preocupar com OpenURL e manipuladores de arquivos?

Usar OpenURL e manipuladores de arquivos é muito comum para desenvolvedores, especialmente com aplicativos de mídia avançada e recursos semelhantes a mídias sociais, como bate-papo no jogo, análises e comentários, onde os usuários normalmente desejam compartilhar conteúdo que reside fora do jogo na Internet. Além disso, há cenários comuns de produtividade, como a edição de um arquivo de configuração, em que você pode querer passar um link para o sistema operacional, abrindo o aplicativo de edição de código preferido do usuário como uma conveniência para o usuário. Application.OpenURL é uma API independente de plataforma para oferecer suporte a manipuladores de arquivos, poupando os desenvolvedores do Unity de ter que escrever seus próprios manipuladores para cada plataforma.

Isso é exclusivo do Unity Editor e Runtime?

Não. Conforme descrito acima, essa é uma funcionalidade comum na maioria dos sistemas operacionais e é suportada por muitas linguagens e estruturas. Esteja atento ao uso da API do Windows Windows.System.LauchURIAsync (para aplicativos da Plataforma Universal do Windows [UWP]) ou do temido System.Diagnostics.Process.Start; ambas as bibliotecas nativas do .Net fornecem a mesma funcionalidade que Application.OpenURL. O LaunchURIAsync permite iniciar aplicativos a partir da sandbox de aplicativos seguros do Windows, e o Process.Start pode ser usado para iniciar qualquer executável no sistema local. Além disso, algumas chamadas nativas do sistema operacional fornecem a mesma funcionalidade, como o open(_:options:completionHandler:)da Apple. Todos esses tipos de APIs podem ser facilmente abusados se entradas não confiáveis e não higienizadas forem passadas para essas APIs.

O que vem depois?

Publicaremos artigos aqui periodicamente sobre tópicos essenciais para praticar e manter as melhores práticas de segurança ao desenvolver com o Unity. Os próximos tópicos incluem transporte seguro para dados de jogos e democratização do ciclo de vida de desenvolvimento de software seguro (SSDLC). Também estamos trabalhando para tornar públicas algumas de nossas orientações internas e ferramentas de segurança.

Existe algum tópico de segurança sobre o qual você gostaria de saber mais em um artigo futuro? Deixe-nos uma mensagem!

Saiba mais sobre o Unity Security, incluindo avisos de segurança.