Sandboxing de um aplicativo Xamarin.Mac

Este artigo aborda a área restrita de um aplicativo Xamarin.Mac para lançamento na App Store. Ele abrange todos os elementos que entram na área restrita, como diretórios de contêiner, direitos, permissões determinadas pelo usuário, separação de privilégios e imposição de kernel.

Visão geral

Ao trabalhar com C# e .NET em um aplicativo Xamarin.Mac, você tem a mesma capacidade de área restrita de um aplicativo que faz ao trabalhar com Objective-C ou Swift.

An example of the running app

Neste artigo, abordaremos os conceitos básicos de como trabalhar com sandboxing em um aplicativo Xamarin.Mac e todos os elementos que entram na área restrita: diretórios de contêiner, direitos, permissões determinadas pelo usuário, separação de privilégios e imposição de kernel. É altamente recomendável que você trabalhe primeiro no artigo Olá, Mac, especificamente nas seções Introdução ao Xcode e ao Construtor de Interface e Saídas e Ações, pois ele aborda os principais conceitos e técnicas que usaremos neste artigo.

Você pode querer dar uma olhada na seção Expondo classes C# / métodos paraObjective-Cdo documento Xamarin.Mac Internals também, ele explica os Register atributos e Export usados para conectar suas classes C# a Objective-C objetos e elementos da interface do usuário.

Sobre a área restrita do aplicativo

O App Sandbox fornece uma forte defesa contra danos que podem ser causados por um aplicativo mal-intencionado sendo executado em um Mac, limitando o acesso que um aplicativo tem aos recursos do sistema.

Um aplicativo sem área restrita tem todos os direitos do usuário que está executando o aplicativo e pode acessar ou fazer qualquer coisa que o usuário puder. Se o aplicativo contiver falhas de segurança (ou qualquer estrutura que esteja usando), um hacker pode potencialmente explorar essas fraquezas e usar o aplicativo para assumir o controle do Mac em que está sendo executado.

Ao limitar o acesso a recursos por aplicativo, um aplicativo em área restrita fornece uma linha de defesa contra roubo, corrupção ou intenção maliciosa por parte de um aplicativo em execução na máquina do usuário.

O App Sandbox é uma tecnologia de controle de acesso integrada ao macOS (aplicada no nível do kernel) que fornece uma estratégia dupla:

  1. O App Sandbox permite que o desenvolvedor descreva como um aplicativo interagirá com o sistema operacional e, dessa forma, ele recebe apenas os direitos de acesso necessários para fazer o trabalho, e não mais.
  2. O App Sandbox permite que o usuário conceda acesso adicional ao sistema por meio das caixas de diálogo Abrir e Salvar, operações de arrastar e soltar e outras interações comuns do usuário.

Preparando-se para implementar o App Sandbox

Os elementos do App Sandbox que serão discutidos em detalhes no artigo são os seguintes:

  • Diretórios de contêineres
  • Qualificações
  • Permissões determinadas pelo usuário
  • Separação de privilégios
  • Imposição do kernel

Depois de entender esses detalhes, você poderá criar um plano para adotar o App Sandbox em seu aplicativo Xamarin.Mac.

Primeiro, você precisará determinar se seu aplicativo é um bom candidato para sandboxing (a maioria dos aplicativos são). Em seguida, você precisará resolver quaisquer incompatibilidades de API e determinar quais elementos do App Sandbox serão necessários. Por fim, analise o uso da Separação de Privilégios para maximizar o nível de defesa do aplicativo.

Ao adotar a App Sandbox, alguns locais do sistema de arquivos que seu aplicativo usa serão diferentes. Particularmente, seu aplicativo terá um diretório de contêiner que será usado para arquivos de suporte de aplicativo, bancos de dados, caches e quaisquer outros arquivos que não sejam documentos do usuário. Tanto o macOS quanto o Xcode oferecem suporte para migrar esses tipos de arquivos de seus locais legados para o contêiner.

Início rápido do sandboxing

Nesta seção, criaremos um aplicativo Xamarin.Mac simples que usa um Modo de Exibição da Web (que requer uma conexão de rede restrita em área restrita, a menos que especificamente solicitado) como um exemplo de introdução à Área Restrita de Aplicativos.

Verificaremos se o aplicativo está realmente em área restrita e aprenderemos como solucionar e resolver erros comuns da área restrita de aplicativos.

Criando o projeto Xamarin.Mac

Vamos fazer o seguinte para criar nosso projeto de exemplo:

  1. Inicie o Visual Studio para Mac e clique no link Nova Solução.

  2. Na caixa de diálogo Novo Projeto, selecione Mac>App>Cocoa App:

    Creating a new Cocoa App

  3. Clique no botão Avançar , digite MacSandbox o nome do projeto e clique no botão Criar :

    Entering the app name

  4. No Solution Pad, clique duas vezes no arquivo Main.storyboard para abri-lo para edição no Xcode:

    Editing the main storyboard

  5. Arraste um Modo de Exibição da Web para a Janela, dimensione-o para preencher a área de conteúdo e defina-o para aumentar e diminuir com a janela:

    Adding a web view

  6. Crie uma saída para o modo de exibição da Web chamada webView:

    Creating a new outlet

  7. Retorne ao Visual Studio para Mac e clique duas vezes no arquivo de ViewController.cs no Solution Pad para abri-lo para edição.

  8. Adicione a seguinte instrução using : using WebKit;

  9. Faça com que o ViewDidLoad método tenha a seguinte aparência:

    public override void AwakeFromNib ()
    {
        base.AwakeFromNib ();
        webView.MainFrame.LoadRequest(new NSUrlRequest(new NSUrl("http://www.apple.com")));
    }
    
  10. Salve suas alterações.

Execute o aplicativo e certifique-se de que o site da Apple seja exibido na janela da seguinte maneira:

Showing an example app run

Assinando e provisionando o aplicativo

Antes de ativarmos o App Sandbox, primeiro precisamos provisionar e assinar nosso aplicativo Xamarin.Mac.

Vamos fazer o seguinte:

  1. Faça login no Apple Developer Portal:

    Logging into the Apple Developer Portal

  2. Selecione Certificados, Identificadores e Perfis:

    Selecting Certificates, Identifiers & Profiles

  3. Em Aplicativos Mac, selecione Identificadores:

    Selecting Identifiers

  4. Crie uma nova ID para o aplicativo:

    Creating a new App ID

  5. Em Perfis de provisionamento, selecione Desenvolvimento:

    Selecting Development

  6. Crie um novo perfil e selecione Desenvolvimento de aplicativos para Mac:

    Creating a new profile

  7. Selecione o ID do aplicativo que criamos acima:

    Selecting the App ID

  8. Selecione os desenvolvedores para este perfil:

    Adding developers

  9. Selecione os computadores para este perfil:

    Selecting the allowed computers

  10. Dê um nome ao perfil:

    Giving the profile a name

  11. Clique no botão Concluído.

Importante

Em alguns casos, talvez seja necessário baixar o novo Perfil de provisionamento diretamente do Portal do desenvolvedor da Apple e clicar duas vezes nele para instalá-lo. Talvez você também precise parar e reiniciar o Visual Studio para Mac antes que ele possa acessar o novo perfil.

Em seguida, precisamos carregar o novo ID e Perfil do Aplicativo na máquina de desenvolvimento. Vamos fazer o seguinte:

  1. Inicie o Xcode e selecione Preferências no menu Xcode:

    Editing accounts in Xcode

  2. Clique no botão Ver Detalhes...

    Clicking the View Details button

  3. Clique no botão Atualizar (no canto inferior esquerdo).

  4. Clique no botão Concluído .

Em seguida, precisamos selecionar a nova ID do aplicativo e o perfil de provisionamento em nosso projeto Xamarin.Mac. Vamos fazer o seguinte:

  1. No Solution Pad, clique duas vezes no arquivo Info.plist para abri-lo para edição.

  2. Certifique-se de que o Identificador de Pacote corresponda ao nosso ID de Aplicativo que criamos acima (exemplo: com.appracatappra.MacSandbox):

    Editing the Bundle Identifier

  3. Em seguida, clique duas vezes no arquivo Entitlements.plist e verifique se nosso Armazenamento de Chave-Valor do iCloud e os Contêineres do iCloud correspondem ao nosso ID de Aplicativo que criamos acima (exemplo: com.appracatappra.MacSandbox):

    Editing the Entitlements.plist file

  4. Salve suas alterações.

  5. No Solution Pad, clique duas vezes no arquivo de projeto para abrir suas Opções para edição:

    Editign the solution's options

  6. Selecione Assinatura do Mac e, em seguida, marque Assinar o pacote de aplicativos e Assinar o pacote do instalador. Em Perfil de provisionamento, selecione o que criamos acima:

    Setting the provisioning profile

  7. Clique no botão Concluído.

Importante

Talvez seja necessário encerrar e reiniciar o Visual Studio para Mac para que ele reconheça a nova ID do Aplicativo e o Perfil de Provisionamento que foi instalado pelo Xcode.

Solução de problemas de provisionamento

Neste ponto, você deve tentar executar o aplicativo e certificar-se de que tudo está assinado e provisionado corretamente. Se o aplicativo ainda rodar como antes, está tudo bem. Em caso de falha, você pode obter uma caixa de diálogo como a seguinte:

An example provisioning issue dialog

Aqui estão as causas mais comuns de problemas de provisionamento e assinatura:

  • A ID do Pacote de Aplicativos não corresponde à ID do Aplicativo do perfil selecionado.
  • A ID do desenvolvedor não corresponde à ID do desenvolvedor do perfil selecionado.
  • O UUID do Mac que está sendo testado não está registrado como parte do perfil selecionado.

No caso de um problema, corrija o problema no Apple Developer Portal, atualize os perfis no Xcode e faça uma compilação limpa no Visual Studio para Mac.

Ativar a área restrita do aplicativo

Você habilita a área restrita do aplicativo marcando uma caixa de seleção nas opções de seus projetos. Faça o seguinte:

  1. No Solution Pad, clique duas vezes no arquivo Entitlements.plist para abri-lo para edição.

  2. Marque Habilitar direitos e Habilitar área restrita de aplicativos:

    Editing entitlements and enabling sandboxing

  3. Salve suas alterações.

Neste ponto, você habilitou a Área Restrita do Aplicativo, mas não forneceu o acesso à rede necessário para o Modo de Exibição da Web. Se você executar o aplicativo agora, você deve obter uma janela em branco:

Showing the web access being blocked

Verificando se o aplicativo está em área restrita

Além do comportamento de bloqueio de recursos, há três maneiras principais de saber se um aplicativo Xamarin.Mac foi bloqueado com êxito:

  1. No Finder, verifique o ~/Library/Containers/ conteúdo da pasta - Se o aplicativo estiver em área restrita, haverá uma pasta nomeada como o Identificador de pacote do seu aplicativo (exemplo: com.appracatappra.MacSandbox):

    Opening the app's bundle

  2. O sistema vê o aplicativo como área restrita no Monitor de Atividade:

    • Inicie o Monitor de Atividade (em /Applications/Utilities).
    • Escolha Exibir>colunas e verifique se o item de menu Sandbox está marcado.
    • Certifique-se de que a coluna Sandbox lê Yes para seu aplicativo:

    Checking the app in the Activity Monitor

  3. Verifique se o binário do aplicativo está em área restrita:

    • Inicie o aplicativo Terminal.
    • Navegue até o diretório de aplicativos bin .
    • Emita este comando: codesign -dvvv --entitlements :- executable_path (onde executable_path é o caminho para seu aplicativo):

    Checking the app on the command line

Depurando um aplicativo em área restrita

O depurador se conecta aos aplicativos Xamarin.Mac por meio de TCP, o que significa que, por padrão, quando você habilita o sandboxing, ele não consegue se conectar ao aplicativo, portanto, se você tentar executar o aplicativo sem as permissões adequadas habilitadas, receberá um erro "Não é possível se conectar ao depurador".

Setting the required options

A permissão Permitir Conexões de Rede de Saída (Cliente) é a necessária para o depurador, habilitando esta permitirá a depuração normalmente. Como você não pode depurar sem ele, atualizamos o CompileEntitlements destino para msbuild adicionar automaticamente essa permissão aos direitos de qualquer aplicativo que esteja em área restrita apenas para compilações de depuração. As compilações de versão devem usar os direitos especificados no arquivo de direitos, sem modificações.

Resolvendo uma violação de área restrita de aplicativo

Uma violação de área restrita de aplicativo ocorre se um aplicativo Xamarin.Mac em área restrita tentou acessar um recurso que não foi explicitamente permitido. Por exemplo, o nosso Web View já não consegue apresentar o Web site da Apple.

A fonte mais comum de violações de área restrita de aplicativo ocorre quando as configurações de direito especificadas no Visual Studio para Mac não correspondem aos requisitos do aplicativo. Novamente, voltando ao nosso exemplo, os direitos de Conexão de Rede ausentes que impedem o Modo de Exibição da Web de funcionar.

Descobrindo violações da área restrita de aplicativos

Se você suspeitar que uma violação de área restrita de aplicativo está ocorrendo em seu aplicativo Xamarin.Mac, a maneira mais rápida de descobrir o problema é usando o aplicativo Console .

Faça o seguinte:

  1. Compile o aplicativo em questão e execute-o a partir do Visual Studio para Mac.

  2. Abra o aplicativo Console (de /Applications/Utilties/).

  3. Selecione Todas as mensagens na barra lateral e entre sandbox na pesquisa:

    An example of a sandboxing issue in the console

Para o nosso aplicativo de exemplo acima, você pode ver que o Kernal está bloqueando o network-outbound tráfego por causa do App Sandbox, já que não solicitamos esse direito.

Corrigindo violações do App Sandbox com direitos

Agora que vimos como encontrar violações de Sandboxing de aplicativos, vamos ver como elas podem ser resolvidas ajustando os direitos do nosso aplicativo.

Faça o seguinte:

  1. No Solution Pad, clique duas vezes no arquivo Entitlements.plist para abri-lo para edição.

  2. Na seção Direitos, marque a caixa de seleção Permitir conexões de rede de saída (cliente):

    Editing the entitlements

  3. Salve as alterações no aplicativo.

Se fizermos o acima para nosso aplicativo de exemplo, compilá-lo e executá-lo, o conteúdo da Web agora será exibido conforme o esperado.

A área restrita do aplicativo em profundidade

Os mecanismos de controle de acesso fornecidos pelo App Sandbox são poucos e fáceis de entender. No entanto, a forma como o App Sandbox será adotado por cada aplicativo é única e baseada nos requisitos do aplicativo.

Dado o seu melhor esforço para proteger seu aplicativo Xamarin.Mac de ser explorado por código malicioso, precisa haver apenas uma única vulnerabilidade no aplicativo (ou em uma das bibliotecas ou estruturas que ele consome) para obter o controle das interações do aplicativo com o sistema.

O App Sandbox foi projetado para evitar a aquisição (ou limitar os danos que ele pode causar), permitindo que você especifique as interações pretendidas do aplicativo com o sistema. O sistema só concederá acesso ao recurso que seu aplicativo requer para fazer seu trabalho e nada mais.

Ao projetar para a Área Restrita de Aplicativos, você está projetando para o pior cenário. Se o aplicativo for comprometido por código mal-intencionado, ele estará limitado a acessar apenas os arquivos e recursos na área restrita do aplicativo.

Direitos e acesso a recursos do sistema

Como vimos acima, um aplicativo Xamarin.Mac que não foi protegido recebe todos os direitos e acesso do usuário que está executando o aplicativo. Se comprometido por código malicioso, um aplicativo não protegido pode atuar como um agente para comportamento hostil, com um amplo potencial de causar danos.

Ao ativar a App Sandbox, você remove todos, exceto um conjunto mínimo de privilégios, que você reativa em uma base somente de necessidade usando os direitos do seu aplicativo Xamarin.Mac.

Você modifica os Recursos de Área Restrita de Aplicativo do seu aplicativo editando seu arquivo Entitlements.plist e marcando ou selecionando os direitos necessários nas caixas suspensas dos editores:

Editing the entitlements

Diretórios de contêiner e acesso ao sistema de arquivos

Quando seu aplicativo Xamarin.Mac adota o App Sandbox, ele tem acesso aos seguintes locais:

  • O Diretório de Contêiner de Aplicativo - Na primeira execução, o sistema operacional cria um Diretório de Contêiner especial para onde vão todos os seus recursos, que somente ele pode acessar. O aplicativo terá acesso completo de leitura/gravação a esse diretório.
  • Diretórios de Contêiner de Grupo de Aplicativos - Seu aplicativo pode ter acesso a um ou mais Contêineres de Grupo compartilhados entre aplicativos no mesmo grupo.
  • Arquivos especificados pelo usuário - Seu aplicativo obtém automaticamente acesso a arquivos que são explicitamente abertos ou arrastados e soltos no aplicativo pelo usuário.
  • Itens relacionados - Com os direitos apropriados, seu aplicativo pode ter acesso a um arquivo com o mesmo nome, mas uma extensão diferente. Por exemplo, um documento que foi salvo como um .txt arquivo e um .pdfarquivo .
  • Diretórios temporários, diretórios de ferramentas de linha de comando e locais específicos legíveis pelo mundo - Seu aplicativo tem diferentes graus de acesso a arquivos em outros locais bem definidos, conforme especificado pelo sistema.

O diretório de contêiner do aplicativo

O Diretório de contêineres de aplicativos de um aplicativo Xamarin.Mac tem as seguintes características:

  • Ele está em um local oculto no diretório Home do usuário (geralmente ~Library/Containers) e pode ser acessado com a função (veja abaixo) dentro do NSHomeDirectory seu aplicativo. Como ele está no diretório Home, cada usuário obterá seu próprio contêiner para o aplicativo.
  • O aplicativo tem acesso irrestrito de leitura/gravação ao Diretório de Contêineres e a todos os seus subdiretórios e arquivos dentro dele.
  • A maioria das APIs de localização de caminhos do macOS é relativa ao contêiner do aplicativo. Por exemplo, o contêiner terá sua própria Biblioteca (acessada via NSLibraryDirectory), subdiretórios Application Support e Preferências .
  • O macOS estabelece e impõe a conexão entre o aplicativo e seu contêiner por meio da assinatura de código. Mesmo que outro aplicativo tente falsificar o aplicativo usando seu Identificador de Pacote, ele não poderá acessar o Contêiner por causa da assinatura de código.
  • O contêiner não é para arquivos gerados pelo usuário. Em vez disso, é para arquivos que seu aplicativo usa, como bancos de dados, caches ou outros tipos específicos de dados.
  • Para tipos de aplicativos de caixa de sapatos (como o aplicativo Foto da Apple), o conteúdo do usuário irá para o Contêiner.

Importante

Infelizmente, o Xamarin.Mac ainda não tem 100% de cobertura de API (ao contrário do Xamarin.iOS), como resultado, a NSHomeDirectory API não foi mapeada na versão atual do Xamarin.Mac.

Como uma solução temporária, você pode usar o seguinte código:

[System.Runtime.InteropServices.DllImport("/System/Library/Frameworks/Foundation.framework/Foundation")]
public static extern IntPtr NSHomeDirectory();

public static string ContainerDirectory {
    get {
        return ((NSString)ObjCRuntime.Runtime.GetNSObject(NSHomeDirectory())).ToString ();
        }
}

O diretório de contêiner do grupo de aplicativos

A partir do Mac macOS 10.7.5 (e superior), um aplicativo pode usar o com.apple.security.application-groups direito de acessar um contêiner compartilhado que é comum a todos os aplicativos do grupo. Você pode usar esse contêiner compartilhado para conteúdo não voltado para o usuário, como banco de dados ou outros tipos de arquivos de suporte (como caches).

Os Contêineres de Grupo são adicionados automaticamente ao Contêiner de Área Restrita de cada aplicativo (se fizerem parte de um grupo) e são armazenados em ~/Library/Group Containers/<application-group-id>. A ID do Grupo deve começar com a ID da Equipe de Desenvolvimento e um período, por exemplo:

<team-id>.com.company.<group-name>

Para obter mais informações, consulte Adicionando um aplicativo a um grupo de aplicativos da Apple em Referência de chave de direito.

Acesso ao Powerbox e ao sistema de arquivos fora do contêiner do aplicativo

Um aplicativo Xamarin.Mac em área restrita pode acessar locais do sistema de arquivos fora de seu contêiner das seguintes maneiras:

  • Na direção específica do usuário (via Abrir e Salvar Caixas de Diálogo ou outros métodos, como arrastar e soltar).
  • Usando direitos para locais específicos do sistema de arquivos (como /bin ou /usr/lib).
  • Quando o local do sistema de arquivos está em determinados diretórios que são legíveis pelo mundo (como Compartilhamento).

O Powerbox é a tecnologia de segurança do macOS que interage com o usuário para expandir os direitos de acesso a arquivos do aplicativo Xamarin.Mac em área restrita. O Powerbox não tem API, mas é ativado de forma transparente quando o aplicativo chama um NSOpenPanel ou NSSavePanel. O acesso ao Powerbox é habilitado por meio dos Direitos definidos para seu aplicativo Xamarin.Mac.

Quando um aplicativo em área restrita exibe uma caixa de diálogo Abrir ou Salvar, a janela é apresentada pelo Powerbox (e não pelo AppKit) e, portanto, tem acesso a qualquer arquivo ou diretório ao qual o usuário tenha acesso.

Quando um usuário seleciona um arquivo ou diretório na caixa de diálogo Abrir ou Salvar (ou arrasta para o ícone do aplicativo), o Powerbox adiciona o caminho associado à área restrita do aplicativo.

Além disso, o sistema permite automaticamente o seguinte para um aplicativo em área restrita:

  • Conexão com um método de entrada do sistema.
  • Chamar serviços selecionados pelo usuário no menu Serviços (somente para serviços marcados como seguros para aplicativos de área restrita pelo provedor de serviços).
  • Abra arquivos escolhidos pelo usuário no menu Abrir recente .
  • Use Copiar & Colar entre outros aplicativos.
  • Leia arquivos dos seguintes locais legíveis mundialmente:
    • /bin
    • /sbin
    • /usr/bin
    • /usr/lib
    • /usr/sbin
    • /usr/share
    • /System
  • Ler e gravar arquivos nos diretórios criados pelo NSTemporaryDirectory.

Por padrão, os arquivos abertos ou salvos por um aplicativo Xamarin.Mac em área restrita permanecem acessíveis até que o aplicativo seja encerrado (a menos que o arquivo ainda estivesse aberto quando o aplicativo for encerrado). Os arquivos abertos serão restaurados automaticamente para a área restrita do aplicativo por meio do recurso macOS Resume na próxima vez que o aplicativo for iniciado.

Para fornecer persistência a arquivos localizados fora do contêiner de um aplicativo Xamarin.Mac, use marcadores com escopo de segurança (veja abaixo).

A área restrita do aplicativo permite que um aplicativo acesse itens relacionados que têm o mesmo nome de arquivo, mas extensões diferentes. O recurso tem duas partes: a) uma lista de extensões relacionadas no arquivo do Info.plst aplicativo, b) código para dizer à sandbox o que o aplicativo fará com esses arquivos.

Há dois cenários em que isso faz sentido:

  1. O aplicativo precisa ser capaz de salvar uma versão diferente do arquivo (com uma nova extensão). Por exemplo, exportar um .txt arquivo para um .pdf arquivo. Para lidar com essa situação, você deve usar um NSFileCoordinator para acessar o arquivo. Você chamará o WillMove(fromURL, toURL) método primeiro, moverá o arquivo para a nova extensão e, em seguida, chamará ItemMoved(fromURL, toURL).
  2. O aplicativo precisa abrir um arquivo principal com uma extensão e vários arquivos de suporte com diferentes extensões. Por exemplo, um arquivo de filme e um arquivo de legenda. Use um NSFilePresenter para obter acesso ao arquivo secundário. Forneça o arquivo principal para a PrimaryPresentedItemURL propriedade e o arquivo secundário para a PresentedItemURL propriedade. Quando o arquivo principal é aberto, chame o AddFilePresenterNSFileCoordinator método da classe para registrar o arquivo secundário.

Em ambos os cenários, o arquivo Info.plist do aplicativo deve declarar os Tipos de Documento que o aplicativo pode abrir. Para qualquer tipo de arquivo, adicione o NSIsRelatedItemType (com um valor de YES) à sua entrada na CFBundleDocumentTypes matriz.

Abrir e salvar o comportamento da caixa de diálogo com aplicativos em área restrita

Os seguintes limites são colocados no NSOpenPanel e NSSavePanel ao chamá-los de um aplicativo Xamarin.Mac em área restrita:

  • Não é possível invocar programaticamente o botão OK .
  • Não é possível alterar programaticamente a seleção de um usuário em um NSOpenSavePanelDelegatearquivo .

Além disso, as seguintes modificações de herança estão em vigor:

  • Aplicativo não em área restrita - NSOpenPanelNSSavePanel``NSPanel``NSWindow``NSResponder``NSObject``NSOpenPanel``NSSavePanel``NSObject``NSOpenPanel``NSSavePanel

Marcadores com escopo de segurança e acesso persistente a recursos

Como dito acima, um aplicativo Xamarin.Mac em área restrita pode acessar um arquivo ou recurso fora de seu contêiner por meio da interação direta do usuário (conforme fornecido pelo PowerBox). No entanto, o acesso a esses recursos não persiste automaticamente nas inicializações do aplicativo ou nas reinicializações do sistema.

Usando marcadores com escopo de segurança, um aplicativo Xamarin.Mac em área restrita pode preservar a intenção do usuário e manter o acesso a determinados recursos após a reinicialização de um aplicativo.

Tipos de marcadores com escopo de segurança

Ao trabalhar com Marcadores com Escopo de Segurança e Acesso a Recursos Persistentes, há dois casos de uso sistêmicos:

  • Um Indicador com escopo de aplicativo fornece acesso persistente a um arquivo ou pasta especificado pelo usuário.

    Por exemplo, se o aplicativo Xamarin.Mac em área restrita permitir o uso para abrir um documento externo para edição (usando um NSOpenPanel), o aplicativo poderá criar um Marcador com escopo de aplicativo para que possa acessar o mesmo arquivo novamente no futuro.

  • Um indicador com escopo de documento fornece a um documento específico acesso persistente a um subarquivo.

Por exemplo, um aplicativo de edição de vídeo que cria um arquivo de projeto que tem acesso a imagens individuais, clipes de vídeo e arquivos de som que serão posteriormente combinados em um único filme.

Quando o usuário importa um arquivo de recurso para o projeto (por meio de um NSOpenPanel), o aplicativo cria um Indicador com Escopo de Documento para o item armazenado no projeto, para que o arquivo esteja sempre acessível ao aplicativo.

Um indicador com escopo de documento pode ser resolvido por qualquer aplicativo que possa abrir os dados do indicador e o próprio documento. Isso suporta portabilidade, permitindo que o usuário envie os arquivos do projeto para outro usuário e fazendo com que todos os marcadores funcionem para eles também.

Importante

Um indicador com escopo de documento só pode apontar para um único arquivo e não para uma pasta e esse arquivo não pode estar em um local usado pelo sistema (como /private ou /Library).

Usando marcadores com escopo de segurança

Usando qualquer tipo de indicador de escopo de segurança, requer que você execute as seguintes etapas:

  1. Defina os Direitos apropriados no aplicativo Xamarin.Mac que precisa usar Marcadores com Escopo de Segurança - Para Marcadores com Escopo de Aplicativo, defina a com.apple.security.files.bookmarks.app-scope chave de Direito como true. Para Marcadores com escopo de documento, defina a com.apple.security.files.bookmarks.document-scope chave Entitlement como true.
  2. Criar um indicador com escopo de segurança - Você fará isso para qualquer arquivo ou pasta ao qual o usuário tenha fornecido acesso (por exemplo NSOpenPanel ), ao qual o aplicativo precisará de acesso persistente. Use o public virtual NSData CreateBookmarkData (NSUrlBookmarkCreationOptions options, string[] resourceValues, NSUrl relativeUrl, out NSError error)NSUrl método da classe para criar o indicador.
  3. Resolver o indicador com escopo de segurança - Quando o aplicativo precisar acessar o recurso novamente (por exemplo, após a reinicialização), ele precisará resolver o indicador para uma URL com escopo de segurança. Use o public static NSUrl FromBookmarkData (NSData data, NSUrlBookmarkResolutionOptions options, NSUrl relativeToUrl, out bool isStale, out NSError error)NSUrl método da classe para resolver o indicador.
  4. Notificar explicitamente o sistema de que você deseja acessar o arquivo a partir da URL com escopo de segurança - Esta etapa precisa ser feita imediatamente após obter a URL com escopo de segurança acima ou, quando você quiser recuperar o acesso ao recurso depois de ter renunciado ao acesso a ele. Chame o StartAccessingSecurityScopedResource ()NSUrl método da classe para começar a acessar uma URL com escopo de segurança.
  5. Notifique explicitamente o Sistema de que você terminou de acessar o arquivo a partir da URL com escopo de segurança - Assim que possível, você deve informar o Sistema quando o aplicativo não precisar mais acessar o arquivo (por exemplo, se o usuário fechá-lo). Chame o StopAccessingSecurityScopedResource ()NSUrl método da classe para parar de acessar uma URL com escopo de segurança.

Depois de abrir mão do acesso a um recurso, você precisará retornar à etapa 4 novamente para restabelecer o acesso. Se o aplicativo Xamarin.Mac for reiniciado, você deverá retornar à etapa 3 e resolver novamente o marcador.

Importante

A falha ao liberar o acesso aos recursos de URL com escopo de segurança fará com que um aplicativo Xamarin.Mac vaze recursos do kernel. Como resultado, o aplicativo não poderá mais adicionar locais do sistema de arquivos ao seu contêiner até que seja reiniciado.

A área restrita do aplicativo e a assinatura de código

Depois de habilitar a área restrita do aplicativo e habilitar os requisitos específicos para seu aplicativo Xamarin.Mac (por meio de direitos), você deve assinar o código do projeto para que a área restrita entre em vigor. Você deve executar a assinatura de código porque os Direitos necessários para o App Sandboxing estão vinculados à assinatura do aplicativo.

O macOS impõe um link entre o Contêiner de um aplicativo e sua assinatura de código, dessa forma nenhum outro aplicativo pode acessar esse contêiner, mesmo que esteja falsificando o ID do Pacote de aplicativos. Esse mecanismo funciona da seguinte forma:

  1. Quando o Sistema cria o Contêiner do aplicativo, ele define uma Lista de Controle de Acesso (ACL) nesse Contêiner. A entrada de controle de acesso inicial na lista contém o DR (Requisito Designado) do aplicativo, que descreve como versões futuras do aplicativo podem ser reconhecidas (quando ele foi atualizado).
  2. Sempre que um aplicativo com a mesma ID de pacote é iniciado, o sistema verifica se a assinatura de código do aplicativo corresponde aos Requisitos designados especificados em uma das entradas na ACL do contêiner. Se o sistema não encontrar uma correspondência, ele impede que o aplicativo seja iniciado.

A assinatura de código funciona das seguintes maneiras:

  1. Antes de criar o projeto Xamarin.Mac, obtenha um Certificado de Desenvolvimento, um Certificado de Distribuição e um Certificado de ID de Desenvolvedor no Apple Developer Portal.
  2. Quando a Mac App Store distribui o aplicativo Xamarin.Mac, ele é assinado com uma assinatura de código da Apple.

Ao testar e depurar, você usará uma versão do aplicativo Xamarin.Mac que você assinou (que será usada para criar o Contêiner de Aplicativo). Mais tarde, se você quiser testar ou instalar a versão da Apple App Store, ela será assinada com a assinatura da Apple e não será iniciada (já que não tem a mesma assinatura de código do App Container original). Nessa situação, você receberá um relatório de falha semelhante à seguinte:

Exception Type:  EXC_BAD_INSTRUCTION (SIGILL)

Para corrigir isso, você precisará ajustar a entrada ACL para apontar para a versão assinada pela Apple do aplicativo.

Para obter mais informações sobre como criar e baixar os perfis de provisionamento necessários para Sandboxing, consulte a seção Assinando e provisionando o aplicativo acima.

Ajustando a entrada ACL

Para permitir que a versão assinada pela Apple do aplicativo Xamarin.Mac seja executada, faça o seguinte:

  1. Abra o aplicativo Terminal (em /Applications/Utilities).
  2. Abra uma janela do Finder para a versão assinada pela Apple do aplicativo Xamarin.Mac.
  3. Digite asctl container acl add -file na janela Terminal.
  4. Arraste o ícone do aplicativo Xamarin.Mac da janela do Finder e solte-o na janela do Terminal.
  5. O caminho completo para o arquivo será adicionado ao comando no Terminal.
  6. Pressione Enter para executar o comando.

A ACL do contêiner agora contém os requisitos de código designados para ambas as versões do aplicativo Xamarin.Mac e o macOS agora permitirá que qualquer versão seja executada.

Exibir uma lista de requisitos de código ACL

Você pode exibir uma lista dos requisitos de código na ACL de um contêiner fazendo o seguinte:

  1. Abra o aplicativo Terminal (em /Applications/Utilities).
  2. Digite asctl container acl list -bundle <container-name>.
  3. Pressione Enter para executar o comando.

O <container-name> é geralmente o identificador de pacote para o aplicativo Xamarin.Mac.

Criando um aplicativo Xamarin.Mac para o App Sandbox

Há um fluxo de trabalho comum que deve ser seguido ao projetar um aplicativo Xamarin.Mac para a área restrita do aplicativo. Dito isso, as especificidades da implementação do sandboxing em um aplicativo serão exclusivas para a funcionalidade do aplicativo em questão.

Seis passos para adotar o App Sandbox

A criação de um aplicativo Xamarin.Mac para a área restrita de aplicativos normalmente consiste nas seguintes etapas:

  1. Determine se o aplicativo é adequado para área restrita.
  2. Desenhar uma estratégia de desenvolvimento e distribuição.
  3. Resolva quaisquer incompatibilidades de API.
  4. Aplique os direitos de área restrita de aplicativo necessários ao projeto Xamarin.Mac.
  5. Adicione separação de privilégios usando XPC.
  6. Implementar uma estratégia de migração.

Importante

Você deve não apenas colocar na área restrita o executável principal em seu pacote de aplicativos, mas também cada aplicativo ou ferramenta auxiliar incluído nesse pacote. Isso é necessário para qualquer aplicativo distribuído da Mac App Store e, se possível, deve ser feito para qualquer outra forma de distribuição de aplicativos.

Para obter uma lista de todos os binários executáveis no pacote de um aplicativo Xamarin.Mac, digite o seguinte comando no Terminal:

find -H [Your-App-Bundle].app -print0 | xargs -0 file | grep "Mach-O .*executable"

Onde [Your-App-Bundle] é o nome e o caminho para o pacote do aplicativo.

Determine se um aplicativo Xamarin.Mac é adequado para área restrita

A maioria dos aplicativos Xamarin.Mac são totalmente compatíveis com o App Sandbox e, portanto, adequados para sandboxing. Se o aplicativo exigir um comportamento que a área restrita do aplicativo não permite, você deve considerar uma abordagem alternativa.

Se o seu aplicativo exigir um dos seguintes comportamentos, ele será incompatível com a Área Restrita do Aplicativo:

  • Serviços de Autorização - Com a Área Restrita do Aplicativo, você não pode trabalhar com as funções descritas em Referência C dos Serviços de Autorização.
  • APIs de acessibilidade - Você não pode fazer sandbox de aplicativos assistivos, como leitores de tela ou aplicativos que controlam outros aplicativos.
  • Enviar eventos da Apple para aplicativos arbitrários - Se o aplicativo exigir o envio de eventos da Apple para um aplicativo desconhecido e arbitrário, ele não poderá ser colocado em área restrita. Para uma lista conhecida de aplicativos chamados, o aplicativo ainda pode ser em área restrita e os Direitos precisarão incluir a lista de aplicativos chamados.
  • Enviar dicionários de informações do usuário em notificações distribuídas para outras tarefas - Com a área restrita do aplicativo, você não pode incluir um userInfo dicionário ao postar em um NSDistributedNotificationCenter objeto para enviar mensagens para outras tarefas.
  • Carregar extensões do kernel - O carregamento de extensões do kernel é proibido pelo App Sandbox.
  • Simular a entrada do usuário em caixas de diálogo Abrir e Salvar - Manipular programaticamente as caixas de diálogo Abrir ou Salvar para simular ou alterar a entrada do usuário é proibido pela área restrita do aplicativo.
  • Acessar ou definir preferências em outros aplicativos - Manipular as configurações de outros aplicativos é proibido pela área restrita do aplicativo.
  • Definir configurações de rede - Manipular configurações de rede é proibido pela área restrita do aplicativo.
  • Encerrando outros aplicativos - A área restrita de aplicativos proíbe o uso NSRunningApplication para encerrar outros aplicativos.

Resolvendo incompatibilidades de API

Ao projetar um aplicativo Xamarin.Mac para o App Sandbox, você pode encontrar incompatibilidades com o uso de algumas APIs do macOS.

Aqui estão alguns problemas comuns e coisas que você pode fazer para resolvê-los:

  • Abrindo, salvando e rastreando documentos - Se você estiver gerenciando documentos usando qualquer tecnologia que não NSDocumentseja , você deve alternar para ele por causa do suporte interno para o App Sandbox. NSDocument funciona automaticamente com o PowerBox e fornece suporte para manter documentos dentro de sua área restrita se o usuário movê-los no Finder.
  • Reter acesso aos recursos do sistema de arquivos - Se o aplicativo Xamarin.Mac depender de acesso persistente a recursos fora de seu contêiner, use marcadores com escopo de segurança para manter o acesso.
  • Criar um item de login para um aplicativo - Com a área restrita do aplicativo, você não pode criar um item de logon usando LSSharedFileList nem pode manipular o estado dos serviços de inicialização usando LSRegisterURLo . Use a SMLoginItemSetEnabled função conforme descrito em Apples Adicionando itens de login usando a documentação do Service Management Framework .
  • Acessando dados do usuário - Se você estiver usando funções POSIX, como getpwuid para obter o diretório base do usuário de serviços de diretório, considere usar símbolos Cocoa ou Core Foundation, como NSHomeDirectory.
  • Acessando as preferências de outros aplicativos - Como a área restrita de aplicativos direciona as APIs de localização de caminhos para o contêiner do aplicativo, a modificação das preferências ocorre dentro desse contêiner e o acesso a outras preferências de aplicativos não é permitido.
  • Usando vídeo incorporado HTML5 em exibições da Web - Se o aplicativo Xamarin.Mac usar o WebKit para reproduzir vídeos HTML5 incorporados, você também deverá vincular o aplicativo à estrutura do AV Foundation. A área restrita do aplicativo impedirá que a CoreMedia reproduza esses vídeos de outra forma.

Aplicando os direitos necessários do App Sandbox

Você precisará editar os Direitos de qualquer aplicativo Xamarin.Mac que deseja executar na Caixa de Proteção de Aplicativos e marcar a caixa de seleção Habilitar Área Restrita de Aplicativos.

Com base na funcionalidade do aplicativo, talvez seja necessário habilitar outros Direitos para acessar recursos ou recursos do sistema operacional. O App Sandboxing funciona melhor quando você minimiza os direitos solicitados ao mínimo necessário para executar seu aplicativo, portanto, habilite os direitos aleatoriamente.

Para determinar quais direitos um aplicativo Xamarin.Mac requer, faça o seguinte:

  1. Habilite o App Sandbox e execute o aplicativo Xamarin.Mac.
  2. Execute os recursos do aplicativo.
  3. Abra o aplicativo Console (disponível em /Applications/Utilities) e procure sandboxd violações no log Todas as Mensagens .
  4. Para cada sandboxd violação, resolva o problema usando o contêiner do aplicativo em vez de outros locais do sistema de arquivos ou aplique os Direitos da Área Restrita do Aplicativo para habilitar o acesso a recursos restritos do sistema operacional.
  5. Execute novamente e teste todos os recursos do aplicativo Xamarin.Mac novamente.
  6. Repita até que todas as sandboxd violações tenham sido resolvidas.

Adicionar separação de privilégios usando XPC

Ao desenvolver um aplicativo Xamarin.Mac para o App Sandbox, observe os comportamentos do aplicativo em termos de privilégios e acesso e, em seguida, considere separar as operações de alto risco em seus próprios serviços XPC.

Para obter mais informações, consulte o Guia de Programação de Criação de Serviços XPC e Daemons e Serviços da Apple.

Implementar uma estratégia de migração

Se você estiver lançando uma nova versão em área restrita de um aplicativo Xamarin.Mac que não foi anteriormente em área restrita, será necessário garantir que os usuários atuais tenham um caminho de atualização suave.

Para obter detalhes sobre como implementar um manifesto de migração de contêiner, leia a documentação Migrando um aplicativo para uma área restrita da Apple.

Resumo

Este artigo deu uma olhada detalhada na área restrita de um aplicativo Xamarin.Mac. Primeiro, criamos um aplicativo simplesmente Xamarin.Mac para mostrar os conceitos básicos do App Sandbox. Em seguida, mostramos como resolver violações de sandbox. Em seguida, demos uma olhada detalhada no App Sandbox e, finalmente, analisamos o design de um aplicativo Xamarin.Mac para o App Sandbox.