Colocando em área restrita um aplicativo Xamarin.Mac

Este artigo aborda a área restrita de um aplicativo Xamarin.Mac para versão 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 colocar um aplicativo em área restrita que faz ao trabalhar com Objective-C ou Swift.

Um exemplo do aplicativo em execução

Neste artigo, abordaremos as noções básicas de como trabalhar com área restrita 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 Interfaces e Saídas e Ações , pois ele aborda os principais conceitos e técnicas que usaremos neste artigo.

Talvez você queira dar uma olhada na seção Expondo classes/métodos C# a Objective-Cdo documento Internos do Xamarin.Mac também, ele explica os Register atributos e Export usados para conectar suas classes C# a Objective-C objetos e elementos de 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 malicioso sendo executado em um Mac, limitando o acesso que um aplicativo tem aos recursos do sistema.

Um aplicativo não protegido tem todos os direitos do usuário que está executando o aplicativo e pode acessar ou fazer qualquer coisa que o usuário possa. Se o aplicativo contiver falhas de segurança (ou qualquer estrutura que esteja usando), um hacker poderá explorar esses pontos fracos e usar o aplicativo para assumir o controle do Mac em que está sendo executado.

Ao limitar o acesso aos 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 (imposta 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, recebe apenas os direitos de acesso necessários para realizar o trabalho e nada mais.
  2. O App Sandbox permite que o usuário conceda mais acesso 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 a área restrita do aplicativo

Os elementos da área restrita do aplicativo que serão discutidos em detalhes no artigo são os seguintes:

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

Depois de entender esses detalhes, você poderá criar um plano para adotar a Área Restrita do Aplicativo em seu aplicativo Xamarin.Mac.

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

Ao adotar o 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 a aplicativos, bancos de dados, caches e quaisquer outros arquivos que não sejam documentos do usuário. O macOS e o Xcode fornecem suporte para migrar esses tipos de arquivos de seus locais herdados para o contêiner.

Início rápido de 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 do Aplicativo.

Verificaremos se o aplicativo está realmente em área restrita e aprenderemos como solucionar problemas e resolver erros comuns da Área Restrita do Aplicativo.

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:

    Criando um novo aplicativo Cocoa

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

    Inserindo o nome do aplicativo

  4. No Painel de Soluções, clique duas vezes no arquivo Main.storyboard para abri-lo para edição no Xcode:

    Editando o storyboard principal

  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:

    Adicionando uma visualização da Web

  6. Crie uma saída para a visualização da Web chamada webView:

    Criando uma nova saída

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

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

  9. Faça com que o ViewDidLoad método seja semelhante ao seguinte:

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

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

Mostrando um exemplo de execução de aplicativo

Assinando e provisionando o aplicativo

Antes de podermos habilitar a Área Restrita do Aplicativo, primeiro precisamos provisionar e assinar nosso aplicativo Xamarin.Mac.

Vamos fazer o seguinte:

  1. Faça login no Portal do Desenvolvedor da Apple:

    Fazendo login no Portal do Desenvolvedor da Apple

  2. Selecione Certificados, Identificadores e Perfis:

    Selecionando certificados, identificadores e perfis

  3. Em Aplicativos para Mac, selecione Identificadores:

    Selecionando identificadores

  4. Crie uma nova ID para o aplicativo:

    Criando uma nova ID do aplicativo

  5. Em Perfis de Provisionamento, selecione Desenvolvimento:

    Selecionando o desenvolvimento

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

    Criando um novo perfil

  7. Selecione o ID do aplicativo que criamos acima:

    Selecionando a ID do aplicativo

  8. Selecione os desenvolvedores para este perfil:

    Adicionando desenvolvedores

  9. Selecione os computadores para este perfil:

    Selecionar os computadores permitidos

  10. Dê um nome ao perfil:

    Dando um nome ao perfil

  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 instalar. 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 a nova ID do Aplicativo e o Perfil no computador de desenvolvimento. Vamos fazer o seguinte:

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

    Editando contas no Xcode

  2. Clique no botão Exibir detalhes... :

    Clicando no botão Exibir detalhes

  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 Painel de Soluções, clique duas vezes no arquivo Info.plist para abri-lo para edição.

  2. Certifique-se de que o identificador do pacote corresponda ao nosso ID do aplicativo que criamos acima (exemplo: com.appracatappra.MacSandbox):

    Editando o identificador de pacote

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

    Editando o arquivo Entitlements.plist

  4. Salve suas alterações.

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

    Editando as opções da solução

  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:

    Configurando o perfil de provisionamento

  7. Clique no botão Concluído.

Importante

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

Solução de problemas de provisionamento

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

Um exemplo de caixa de diálogo de problema de provisionamento

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 Portal do Desenvolvedor da Apple, atualize os perfis no Xcode e faça um build limpo no Visual Studio para Mac.

Ativar a área restrita do aplicativo

Você habilita o App Sandbox marcando uma caixa de seleção nas opções de seus projetos. Faça o seguinte:

  1. No Painel de Soluções, clique duas vezes no arquivo Entitlements.plist para abri-lo para edição.

  2. Marque Ativar direitos e Ativar sandbox de aplicativos:

    Editando direitos e ativando o sandbox

  3. Salve suas alterações.

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

Mostrando o acesso à Web que está sendo bloqueado

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 colocado em área restrita com êxito:

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

    Abrindo o pacote do aplicativo

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

    • Inicie o Monitor de Atividade (em /Applications/Utilities).
    • Escolha View Columns (Exibir>colunas) e certifique-se de que o item de menu Sandbox esteja marcado.
    • Certifique-se de que a coluna Sandbox seja Yes lida para seu aplicativo:

    Verificando o aplicativo no Monitor de Atividade

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

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

    Verificando o aplicativo na linha de comando

Depurando um aplicativo em área restrita

O depurador se conecta a aplicativos Xamarin.Mac por meio de TCP, o que significa que, por padrão, quando você habilita a área restrita, 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 conectar-se ao depurador".

Definindo as opções necessárias

A permissão Permitir Conexões de Rede de Saída (Cliente) é a necessária para o depurador, habilitar essa 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 builds 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 do App Sandbox

Uma violação de área restrita do aplicativo ocorrerá se um aplicativo Xamarin.Mac em área restrita tentar acessar um recurso que não foi explicitamente permitido. Por exemplo, nossa Web View não pode mais exibir o site da Apple.

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

Descobrindo violações do App Sandbox

Se você suspeitar que uma violação da área restrita do 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 no Visual Studio para Mac.

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

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

    Um exemplo de um problema de sandboxing no console

Para 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 sandbox de aplicativos, vamos ver como elas podem ser resolvidas ajustando os direitos do nosso aplicativo.

Faça o seguinte:

  1. No Painel de Soluções, 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):

    Editando os direitos

  3. Salve as alterações no aplicativo.

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

O App Sandbox em detalhes

Os mecanismos de controle de acesso fornecidos pelo App Sandbox são poucos e fáceis de entender. No entanto, a maneira como a Área Restrita do Aplicativo será adotada por cada aplicativo é exclusiva e baseada nos requisitos do aplicativo.

Dado o seu melhor esforço para proteger seu aplicativo Xamarin.Mac de ser explorado por código mal-intencionado, é necessário 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 ela pode causar), permitindo que você especifique as interações pretendidas do aplicativo com o sistema. O sistema concederá acesso apenas ao recurso que seu aplicativo requer para realizar seu trabalho e nada mais.

Ao projetar para a Área Restrita do Aplicativo, 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 colocado em área restrita 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 habilitar a Área Restrita do Aplicativo, você remove todos, exceto um conjunto mínimo de privilégios, que você habilita novamente somente quando necessário usando os direitos do aplicativo Xamarin.Mac.

Você modifica os recursos de área restrita do aplicativo editando seu arquivo Entitlements.plist e verificando ou selecionando os direitos necessários nas caixas suspensas dos editores:

Editando os direitos

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

Quando seu aplicativo Xamarin.Mac adota a Área Restrita do Aplicativo, 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 total de leitura/gravação a esse diretório.
  • Diretórios de Contêiner de Grupo de Aplicativos – seu aplicativo pode receber 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 com 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 legíveis por mundo específicos – seu aplicativo tem vários graus de acesso a arquivos em outros locais bem definidos, conforme especificado pelo sistema.

O diretório do contêiner do aplicativo

O Diretório de Contêiner de Aplicativos de um aplicativo Xamarin.Mac tem as seguintes características:

  • Ele está em um local oculto no diretório inicial do usuário (geralmente ~Library/Containers) e pode ser acessado com a NSHomeDirectory função (veja abaixo) em seu aplicativo. Como ele está no diretório inicial, cada usuário receberá seu próprio contêiner para o aplicativo.
  • O aplicativo tem acesso irrestrito de leitura/gravação ao Diretório de Contêiner e a todos os seus subdiretórios e arquivos dentro dele.
  • A maioria das APIs de localização de caminho do macOS é relativa ao contêiner do aplicativo. Por exemplo, o contêiner terá sua própria Biblioteca (acessada via NSLibraryDirectory), Subdiretórios de Suporte a Aplicativos e Preferências .
  • O macOS estabelece e impõe a conexão entre um 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 devido à 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 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 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 sandbox 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 sua ID da Equipe de Desenvolvimento e um ponto, por exemplo:

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

Para obter mais informações, consulte Adicionando um aplicativo a um grupo de aplicativos na 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 (por meio de Abrir e Salvar Diálogos 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 por todos (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 que você definiu 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 a um método de entrada do sistema.
  • Chame 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).
  • Abrir arquivos escolhidos pelo usuário no menu Abrir recentes .
  • Use Copiar & Colar entre outros aplicativos.
  • Leia arquivos dos seguintes locais legíveis por todos:
    • /bin
    • /sbin
    • /usr/bin
    • /usr/lib
    • /usr/sbin
    • /usr/share
    • /System
  • Leia e grave 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 esteja aberto quando o aplicativo for encerrado). Os arquivos abertos serão restaurados automaticamente para a sandbox 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 indicadores com escopo de segurança (veja abaixo).

O App Sandbox 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 informar à sandbox o que o aplicativo fará com esses arquivos.

Existem 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 a NSFileCoordinator para acessar o arquivo. Você chamará o WillMove(fromURL, toURL) método primeiro, moverá o arquivo para a nova extensão e chamará ItemMoved(fromURL, toURL).
  2. O aplicativo precisa abrir um arquivo principal com uma extensão e vários arquivos de suporte com extensões diferentes. Por exemplo, um arquivo de filme e 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 for aberto, chame o AddFilePresenter NSFileCoordinator 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:

  • Você não pode invocar programaticamente o botão OK .
  • Você não pode 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 - NSOpenPanel sem área restrita NSSavePanel``NSPanel``NSWindow``NSResponder``NSObject``NSOpenPanel``NSSavePanel``NSObject``NSOpenPanel``NSSavePanel

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

Conforme mencionado 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 entre inicializações de aplicativos ou reinicializações do sistema.

Usando indicadores 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 indicadores com escopo de segurança

Ao trabalhar com marcadores com escopo de segurança e acesso persistente a recursos, há dois casos de uso sistine:

  • Um indicador no escopo do 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 indicador no escopo do aplicativo para que ele 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, videoclipes e arquivos de som individuais 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 no escopo do 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 de projeto para outro usuário e faça com que todos os favoritos 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 indicadores com escopo de segurança

O uso de qualquer tipo de indicador com escopo de segurança exige que você execute as seguintes etapas:

  1. Defina os Direitos apropriados no aplicativo Xamarin.Mac que precisa usar indicadores com escopo de segurança – Para indicadores no escopo do aplicativo, defina a com.apple.security.files.bookmarks.app-scope chave de direito como true. Para Indicadores com escopo de documento, defina a com.apple.security.files.bookmarks.document-scope chave de direito 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. Notifique explicitamente o sistema que você deseja acessar o arquivo 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 da URL com escopo de segurança – assim que possível, você deve informar o sistema quando o aplicativo não precisar mais de acesso ao arquivo (por exemplo, se o usuário o fechar). 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 indicador.

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 maneira:

  1. Quando o sistema cria o contêiner do aplicativo, ele define uma lista de controle de acesso (ACL) nesse contêiner. A entrada inicial de controle de acesso na lista contém o DR (Requisito Designado ) do aplicativo, que descreve como as versões futuras do aplicativo podem ser reconhecidas (quando ele tiver sido atualizado).
  2. Cada vez que um aplicativo com o mesmo 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 impedirá 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 do Portal do Desenvolvedor da Apple.
  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). Posteriormente, 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 que o App Container original). Nessa situação, você receberá um relatório de falha semelhante ao seguinte:

Exception Type:  EXC_BAD_INSTRUCTION (SIGILL)

Para corrigir isso, você precisará ajustar a entrada da 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 da 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 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 uma das versões seja executada.

Exibir uma lista de requisitos de código do 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.

Geralmente, <container-name> é o Identificador de Pacote para o aplicativo Xamarin.Mac.

Criando um aplicativo Xamarin.Mac para a Área Restrita do Aplicativo

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

Seis etapas para adotar o App Sandbox

A criação de um aplicativo Xamarin.Mac para a Área Restrita do Aplicativo normalmente consiste nas seguintes etapas:

  1. Determine se o aplicativo é adequado para sandbox.
  2. Projete uma estratégia de desenvolvimento e distribuição.
  3. Resolva quaisquer incompatibilidades de API.
  4. Aplique os Direitos de Área Restrita do Aplicativo necessários ao projeto Xamarin.Mac.
  5. Adicione separação de privilégios usando XPC.
  6. Implemente uma estratégia de migração.

Importante

Você deve não apenas colocar em sandbox o executável principal em seu pacote de aplicativos, mas também todos os aplicativos ou ferramentas auxiliares incluídos 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] está o nome e o caminho para o pacote do aplicativo.

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

A maioria dos aplicativos Xamarin.Mac é totalmente compatível com a Área Restrita do Aplicativo e, portanto, adequada para área restrita. Se o aplicativo exigir um comportamento que a Área Restrita do Aplicativo não permite, você deverá considerar uma abordagem alternativa.

Se o seu aplicativo exigir um dos seguintes comportamentos, ele será incompatível com o App Sandbox:

  • Serviços de Autorização - Com a Área Restrita do Aplicativo, você não pode trabalhar com as funções descritas na Referência C dos Serviços de Autorização.
  • APIs de acessibilidade – você não pode colocar aplicativos assistivos em sandbox, 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 colocado 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 a outras tarefas.
  • Carregar extensões de kernel - O carregamento de extensões de kernel é proibido pela área restrita do aplicativo.
  • Simulando a entrada do usuário em caixas de diálogo Abrir e Salvar - A manipulação programática de caixas de diálogo Abrir ou Salvar para simular ou alterar a entrada do usuário é proibida pela Área Restrita do Aplicativo.
  • Acessando ou definindo preferências em outros aplicativos - Manipular as configurações de outros aplicativos é proibido pelo App Sandbox.
  • Definindo configurações de rede - A manipulação de configurações de rede é proibida pela área restrita do aplicativo.
  • Encerrando outros aplicativos - O App Sandbox proíbe o uso NSRunningApplication para encerrar outros aplicativos.

Resolvendo incompatibilidades de API

Ao criar um aplicativo Xamarin.Mac para a Área Restrita do Aplicativo, 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:

  • Abrir, salvar e rastrear documentos - Se você estiver gerenciando documentos usando qualquer tecnologia diferente NSDocumentdo , deverá alternar para ela devido ao suporte integrado para o App Sandbox. NSDocument funciona automaticamente com o PowerBox e fornece suporte para manter documentos dentro de sua sandbox se o usuário os mover no Finder.
  • Reter o acesso aos recursos do sistema de arquivos – se o aplicativo Xamarin.Mac depender do acesso persistente a recursos fora de seu contêiner, use indicadores com escopo de segurança para manter o acesso.
  • Criar um item de logon para um aplicativo - Com o App Sandbox, você não pode criar um item de logon usando LSSharedFileList nem manipular o estado dos serviços de inicialização usando LSRegisterURL. Use a SMLoginItemSetEnabled função conforme descrito na documentação Adicionando itens de login da Apples usando a estrutura de gerenciamento de serviços.
  • Acessando dados do usuário - Se você estiver usando funções POSIX, como getpwuid obter o diretório inicial do usuário dos serviços de diretório, considere o uso de símbolos Cocoa ou Core Foundation, como NSHomeDirectory.
  • Acessando as preferências de outros aplicativos – como a área restrita do aplicativo direciona as APIs de localização de caminho para o contêiner do aplicativo, a modificação das preferências ocorre dentro desse contêiner e o acesso às preferências de outros aplicativos não é permitido.
  • Usando vídeo inserido HTML5 em exibições da Web – se o aplicativo Xamarin.Mac usar o WebKit para reproduzir vídeos HTML5 inseridos, 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 Área Restrita do Aplicativo e marcar a caixa de seleção Habilitar Área Restrita do Aplicativo.

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, ative os direitos aleatoriamente.

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

  1. Habilite a Área Restrita do Aplicativo e execute o aplicativo Xamarin.Mac.
  2. Percorra os recursos do aplicativo.
  3. Abra o aplicativo Console (disponível em /Applications/Utilities) e procure sandboxd violações no registro de 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 de Á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 a Área Restrita do Aplicativo, examine 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 Criação de Serviços e Daemons e Programação de Serviços XPC 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 colocado em área restrita anteriormente, precisará 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 examinou detalhadamente a área restrita de um aplicativo Xamarin.Mac. Primeiro, criamos um aplicativo Xamarin.Mac simples para mostrar as noções básicas da Área Restrita do Aplicativo. Em seguida, mostramos como resolver violações de sandbox. Em seguida, examinamos detalhadamente a Área Restrita do Aplicativo e, por fim, examinamos o design de um aplicativo Xamarin.Mac para a Área Restrita do Aplicativo.