Sandkasten für eine Xamarin.Mac-App

In diesem Artikel wird die Sandboxing einer Xamarin.Mac-Anwendung für die Veröffentlichung im App Store behandelt. Es umfasst alle Elemente, die in die Sandboxing gehen, z. B. Containerverzeichnisse, Berechtigungen, vom Benutzer festgelegte Berechtigungen, Berechtigungstrennung und Kernelerzwingung.

Übersicht

Beim Arbeiten mit C# und .NET in einer Xamarin.Mac-Anwendung haben Sie die gleiche Möglichkeit, eine Anwendung wie bei der Arbeit mit Objective-C oder Swift zu sandkastenn.

An example of the running app

In diesem Artikel befassen wir uns mit den Grundlagen der Arbeit mit der Sandkastenerstellung in einer Xamarin.Mac-Anwendung und allen Elementen, die in die Sandboxing gehen: Containerverzeichnisse, Berechtigungen, benutzerbestimmte Berechtigungen, Berechtigungstrennung und Kernelerzwingung. Es wird dringend empfohlen, dass Sie zuerst den Artikel "Hello, Mac " durcharbeiten, insbesondere die Abschnitte "Einführung in Xcode" und "Interface Builder " und "Outlets" und "Actions ", da es sich um wichtige Konzepte und Techniken handelt, die wir in diesem Artikel verwenden werden.

Möglicherweise möchten Sie sich auch die Exposing C#-Klassen /-Methoden im Objective-C Abschnitt des Xamarin.Mac Internals-Dokuments ansehen. Außerdem werden die Register C#-Klassen und Export -Attribute erläutert, die zum Verbinden Ihrer C#-Klassen mit Objective-C Objekten und UI-Elementen verwendet werden.

Informationen zur App-Sandbox

Der App-Sandbox bietet eine starke Verteidigung gegen Schäden, die durch eine schädliche Anwendung verursacht werden können, die auf einem Mac ausgeführt wird, indem der Zugriff beschränkt wird, den eine Anwendung auf Systemressourcen hat.

Eine Nicht-Sandbox-Anwendung verfügt über die vollständigen Rechte des Benutzers, der die App ausführt, und kann auf alles zugreifen, was der Benutzer kann. Wenn die App Sicherheitslöcher enthält (oder ein Framework, das sie verwendet), kann ein Hacker diese Schwachstellen potenziell ausnutzen und die App verwenden, um die Kontrolle über den Mac zu übernehmen, auf dem sie ausgeführt wird.

Durch das Einschränken des Zugriffs auf Ressourcen pro Anwendung bietet eine Sandkasten-App eine Verteidigungslinie gegen Diebstahl, Beschädigung oder böswillige Absicht auf dem Teil einer Anwendung, die auf dem Computer des Benutzers ausgeführt wird.

Der App-Sandbox ist eine in macOS integrierte Zugriffssteuerungstechnologie (auf Kernelebene erzwungen), die eine zweifache Strategie bietet:

  1. Mit der App-Sandbox kann der Entwickler beschreiben , wie eine Anwendung mit dem Betriebssystem interagiert, und auf diese Weise wird nur die Zugriffsrechte gewährt, die erforderlich sind, um den Auftrag zu erledigen, und nicht mehr.
  2. Der App-Sandbox ermöglicht es dem Benutzer, über die Dialogfelder "Öffnen" und "Speichern" nahtlos weiteren Zugriff auf das System zu gewähren, Vorgänge zum Ziehen und Ablegen sowie andere allgemeine Benutzerinteraktionen zu verwenden.

Vorbereiten der Implementierung der App-Sandbox

Die Elemente der App-Sandbox, die im Artikel ausführlich erläutert werden, sind wie folgt:

  • Containerverzeichnisse
  • Berechtigungen
  • Vom Benutzer festgelegte Berechtigungen
  • Rechtetrennung
  • Kernelerzwingung

Nachdem Sie diese Details verstanden haben, können Sie einen Plan für die Einführung der App-Sandbox in Ihrer Xamarin.Mac-Anwendung erstellen.

Zunächst müssen Sie ermitteln, ob Ihre Anwendung ein guter Kandidat für sandkastenbasierte Anwendungen ist (die meisten Anwendungen sind). Als Nächstes müssen Sie alle API-Inkompatibilitäten auflösen und bestimmen, welche Elemente der App-Sandbox erforderlich sind. Sehen Sie sich schließlich die Verwendung der Berechtigungstrennung an, um die Verteidigungsstufe Ihrer Anwendung zu maximieren.

Bei der Einführung der App-Sandbox unterscheiden sich einige Dateisystemspeicherorte, die Ihre Anwendung verwendet. Insbesondere verfügt Ihre Anwendung über ein Containerverzeichnis, das für Anwendungsunterstützungsdateien, Datenbanken, Caches und andere Dateien verwendet wird, die keine Benutzerdokumente sind. Sowohl macOS als auch Xcode unterstützen diese Dateitypen von ihren älteren Speicherorten zum Container.

Sandkastenschnellstart

In diesem Abschnitt erstellen wir eine einfache Xamarin.Mac-App, die eine Webansicht verwendet (die eine Netzwerkverbindung erfordert, die unter Sandkasten eingeschränkt ist, sofern nicht ausdrücklich angefordert), als Beispiel für die ersten Schritte mit der App-Sandbox.

Wir überprüfen, ob die Anwendung tatsächlich sandkasteniert ist, und erfahren, wie Sie allgemeine App-Sandbox-Fehler beheben und beheben.

Erstellen des Xamarin.Mac-Projekts

Gehen wir wie folgt vor, um unser Beispielprojekt zu erstellen:

  1. Starten Sie Visual Studio für Mac, und klicken Sie auf den Link "Neue Lösung".

  2. Wählen Sie im Dialogfeld "Neues Projekt" die Mac-App>>"Kakao-App" aus:

    Creating a new Cocoa App

  3. Klicken Sie auf die Schaltfläche "Weiter ", geben Sie MacSandbox den Projektnamen ein, und klicken Sie auf die Schaltfläche "Erstellen ":

    Entering the app name

  4. Doppelklicken Sie im Lösungspad auf die Datei "Main.storyboard", um sie zur Bearbeitung in Xcode zu öffnen:

    Editing the main storyboard

  5. Ziehen Sie eine Webansicht auf das Fenster, verkleinern Sie sie, um den Inhaltsbereich auszufüllen, und legen Sie fest, dass sie mit dem Fenster vergrößert und verkleinern wird:

    Adding a web view

  6. Erstellen Sie eine Steckdose für die Webansicht namens webView:

    Creating a new outlet

  7. Kehren Sie zu Visual Studio für Mac zurück, und doppelklicken Sie auf die ViewController.cs Datei im Lösungspad, um sie zur Bearbeitung zu öffnen.

  8. Fügen Sie die folgende using-Anweisung hinzu: using WebKit;

  9. Sehen Sie die ViewDidLoad Methode wie folgt aus:

    public override void AwakeFromNib ()
    {
        base.AwakeFromNib ();
        webView.MainFrame.LoadRequest(new NSUrlRequest(new NSUrl("http://www.apple.com")));
    }
    
  10. Speichern Sie die Änderungen.

Führen Sie die Anwendung aus, und stellen Sie sicher, dass die Apple-Website im Fenster wie folgt angezeigt wird:

Showing an example app run

Signieren und Bereitstellen der App

Bevor wir die App-Sandbox aktivieren können, müssen wir zuerst unsere Xamarin.Mac-Anwendung bereitstellen und signieren.

Gehen Sie wie folgt vor:

  1. Melden Sie sich beim Apple Developer Portal an:

    Logging into the Apple Developer Portal

  2. Zertifikate, Bezeichner und Profile auswählen:

    Selecting Certificates, Identifiers & Profiles

  3. Wählen Sie unter Mac-Apps Bezeichner aus:

    Selecting Identifiers

  4. Erstellen Sie eine neue ID für die Anwendung:

    Creating a new App ID

  5. Wählen Sie unter Bereitstellungsprofile die Option "Entwicklung" aus:

    Selecting Development

  6. Erstellen Sie ein neues Profil, und wählen Sie "Mac-App-Entwicklung" aus:

    Creating a new profile

  7. Wählen Sie die oben erstellte App-ID aus:

    Selecting the App ID

  8. Wählen Sie die Entwickler für dieses Profil aus:

    Adding developers

  9. Wählen Sie die Computer für dieses Profil aus:

    Selecting the allowed computers

  10. Geben Sie dem Profil einen Namen:

    Giving the profile a name

  11. Klicken Sie auf die Schaltfläche Fertig.

Wichtig

In einigen Fällen müssen Sie möglicherweise das neue Bereitstellungsprofil direkt aus dem Entwicklerportal von Apple herunterladen und doppelklicken, um es zu installieren. Möglicherweise müssen Sie auch Visual Studio für Mac beenden und neu starten, bevor sie auf das neue Profil zugreifen kann.

Als Nächstes müssen wir die neue App-ID und das neue Profil auf dem Entwicklungscomputer laden. Gehen wir wie folgt vor:

  1. Starten Sie Xcode, und wählen Sie "Einstellungen " im Menü "Xcode " aus:

    Editing accounts in Xcode

  2. Klicken Sie auf die Schaltfläche "Details anzeigen"...

    Clicking the View Details button

  3. Klicken Sie auf die Schaltfläche "Aktualisieren" (in der unteren linken Ecke).

  4. Klicken Sie auf die Schaltfläche "Fertig ".

Als Nächstes müssen wir die neue App-ID und das Bereitstellungsprofil in unserem Xamarin.Mac-Projekt auswählen. Gehen wir wie folgt vor:

  1. Doppelklicken Sie im Lösungspad auf die Datei "Info.plist", um sie zur Bearbeitung zu öffnen.

  2. Stellen Sie sicher, dass der Bündelbezeichner mit unserer oben erstellten App-ID übereinstimmt (Beispiel: ): com.appracatappra.MacSandbox

    Editing the Bundle Identifier

  3. Doppelklicken Sie als Nächstes auf die Datei "Entitlements.plist", und stellen Sie sicher, dass unser iCloud Key-Value Store und die iCloud-Container mit unserer oben erstellten App-ID übereinstimmen (Beispiel: ): com.appracatappra.MacSandbox

    Editing the Entitlements.plist file

  4. Speichern Sie die Änderungen.

  5. Doppelklicken Sie auf dem Lösungspad auf die Projektdatei, um die Optionen zum Bearbeiten zu öffnen:

    Editign the solution's options

  6. Wählen Sie "Mac-Signatur" aus, und aktivieren Sie dann das Signieren des Anwendungsbundles und signieren Sie das Installationspaket. Wählen Sie unter "Bereitstellungsprofil" das oben erstellte Profil aus:

    Setting the provisioning profile

  7. Klicken Sie auf die Schaltfläche Fertig.

Wichtig

Möglicherweise müssen Sie Visual Studio für Mac beenden und neu starten, um die neue App-ID und das Bereitstellungsprofil zu erkennen, das von Xcode installiert wurde.

Behandeln von Bereitstellungsproblemen

An diesem Punkt sollten Sie versuchen, die Anwendung auszuführen und sicherzustellen, dass alles signiert und ordnungsgemäß bereitgestellt wird. Wenn die App noch wie zuvor ausgeführt wird, ist alles gut. Im Falle eines Fehlers erhalten Sie möglicherweise ein Dialogfeld wie die folgende:

An example provisioning issue dialog

Hier sind die häufigsten Ursachen für Bereitstellungs- und Signaturprobleme:

  • Die App-Bündel-ID stimmt nicht mit der App-ID des ausgewählten Profils überein.
  • Die Entwickler-ID stimmt nicht mit der Entwickler-ID des ausgewählten Profils überein.
  • Die UUID des mac, auf dem getestet wird, ist nicht als Teil des ausgewählten Profils registriert.

Beheben Sie im Fall eines Problems das Problem im Apple Developer Portal, aktualisieren Sie die Profile in Xcode, und führen Sie einen sauber Build in Visual Studio für Mac aus.

Aktivieren der App-Sandbox

Sie aktivieren den App-Sandkasten, indem Sie in den Projektoptionen ein Kontrollkästchen aktivieren. Gehen Sie folgendermaßen vor:

  1. Doppelklicken Sie im Lösungspad auf die Datei "Entitlements.plist ", um sie zur Bearbeitung zu öffnen.

  2. Aktivieren Von Berechtigungen und Aktivieren von App-Sandboxing:

    Editing entitlements and enabling sandboxing

  3. Speichern Sie die Änderungen.

Zu diesem Zeitpunkt haben Sie den App-Sandkasten aktiviert, aber Sie haben den erforderlichen Netzwerkzugriff für die Webansicht nicht bereitgestellt. Wenn Sie die Anwendung jetzt ausführen, sollten Sie ein leeres Fenster erhalten:

Showing the web access being blocked

Überprüfen, ob die App sandkasteniert ist

Abgesehen vom Verhalten beim Blockieren von Ressourcen gibt es drei Standard Möglichkeiten, um zu ermitteln, ob eine Xamarin.Mac-Anwendung erfolgreich sandkastent wurde:

  1. Überprüfen Sie im Finder den Inhalt des ~/Library/Containers/ Ordners – Wenn die App sandkastenartig ist, wird ein Ordner mit dem Namen "Bundle Identifier" Ihrer App (Beispiel: com.appracatappra.MacSandbox):

    Opening the app's bundle

  2. Das System sieht die App als Sandkasten im Aktivitätsmonitor:

    • Aktivitätsmonitor starten (unter /Applications/Utilities).
    • Wählen Sie "Spalten anzeigen">aus, und stellen Sie sicher, dass das Sandkastenmenüelement aktiviert ist.
    • Stellen Sie sicher, dass die Sandkastenspalte für Ihre Anwendung gelesen wird Yes :

    Checking the app in the Activity Monitor

  3. Überprüfen Sie, ob die App-Binärdatei Sandkasten ist:

    • Starten Sie die Terminal-App.
    • Navigieren Sie zum Anwendungsverzeichnis bin .
    • Geben Sie diesen Befehl aus: codesign -dvvv --entitlements :- executable_path (wo executable_path befindet sich der Pfad zu Ihrer Anwendung):

    Checking the app on the command line

Debuggen einer Sandkasten-App

Der Debugger stellt eine Verbindung mit Xamarin.Mac-Apps über TCP her. Dies bedeutet, dass beim Aktivieren der Sandboxing standardmäßig keine Verbindung mit der App hergestellt werden kann. Wenn Sie also versuchen, die App ohne die entsprechenden Berechtigungen auszuführen, wird die Fehlermeldung "Mit dem Debugger kann keine Verbindung hergestellt werden" angezeigt.

Setting the required options

Die Berechtigung "Ausgehendes Netzwerk zulassen" Verbinden ions (Client) ist die berechtigung, die für den Debugger erforderlich ist. Dadurch wird das Debuggen normal ermöglicht. Da Sie das Debuggen nicht ohne das Problem ausführen können, haben wir das CompileEntitlements Ziel msbuild aktualisiert, um diese Berechtigung automatisch den Berechtigungen für jede App hinzuzufügen, die nur für Debugbuilds verwendet wird. Releasebuilds sollten die in der Berechtigungsdatei angegebenen Berechtigungen verwenden, nicht geändert.

Beheben eines Verstoßes gegen die App-Sandbox

Eine Verletzung des App-Sandkastens tritt auf, wenn eine Sandkastenanwendung Xamarin.Mac versucht hat, auf eine Ressource zuzugreifen, die nicht explizit zulässig ist. Beispielsweise kann unsere Webansicht die Apple-Website nicht mehr anzeigen.

Die häufigste Quelle von App-Sandkastenverletzungen tritt auf, wenn die in Visual Studio für Mac angegebenen Berechtigungseinstellungen nicht den Anforderungen der Anwendung entsprechen. Wieder zurück zu unserem Beispiel, die fehlenden Netzwerk- Verbinden ion-Berechtigungen, die die Webansicht nicht funktionieren.

Ermitteln von Verletzungen des App-Sandkastens

Wenn Sie vermuten, dass eine App-Sandkastenverletzung in Ihrer Xamarin.Mac-Anwendung auftritt, besteht die schnellste Möglichkeit, das Problem mithilfe der Konsolen-App zu ermitteln.

Gehen Sie folgendermaßen vor:

  1. Kompilieren Sie die betreffende App, und führen Sie sie aus Visual Studio für Mac aus.

  2. Öffnen Sie die Konsolenanwendung (von /Applications/Utilties/).

  3. Wählen Sie "Alle Nachrichten" in der Randleiste aus, und geben Sie sandbox in die Suche ein:

    An example of a sandboxing issue in the console

Für unsere Beispiel-App oben können Sie sehen, dass der Kernal den network-outbound Datenverkehr aufgrund der App-Sandbox blockiert, da wir dieses Recht nicht angefordert haben.

Beheben von App-Sandbox-Verstößen mit Berechtigungen

Nachdem wir nun gesehen haben, wie Sie Verletzungen des App-Sandkastens finden, sehen wir uns an, wie sie gelöst werden können, indem wir die Berechtigungen unserer Anwendung anpassen.

Gehen Sie folgendermaßen vor:

  1. Doppelklicken Sie im Lösungspad auf die Datei "Entitlements.plist ", um sie zur Bearbeitung zu öffnen.

  2. Aktivieren Sie im Abschnitt "Berechtigungen" das Kontrollkästchen "Ausgehendes Netzwerk Verbinden ions zulassen" (Client):

    Editing the entitlements

  3. Speichern Sie die Änderungen an der Anwendung.

Wenn wir die obigen Schritte für unsere Beispiel-App ausführen, erstellen und ausführen, wird der Webinhalt nun wie erwartet angezeigt.

Die App-Sandbox im Detail

Die von der App-Sandbox bereitgestellten Zugriffssteuerungsmechanismen sind nur wenige und leicht verständlich. Die Art und Weise, wie die App-Sandbox von jeder App übernommen wird, ist jedoch eindeutig und basiert auf den Anforderungen der App.

Da Sie sich am besten bemühen, Ihre Xamarin.Mac-Anwendung vor böswilligem Code zu schützen, muss es nur eine einzige Sicherheitsanfälligkeit in der App (oder einer der Bibliotheken oder Frameworks, die sie verbraucht) geben, um die Kontrolle über die Interaktionen der App mit dem System zu erlangen.

Die App-Sandbox wurde entwickelt, um die Übernahme zu verhindern (oder den Schaden zu begrenzen, der verursacht werden kann), indem Sie die beabsichtigten Interaktionen der Anwendung mit dem System angeben können. Das System gewährt nur Zugriff auf die Ressource, die Ihre Anwendung benötigt, um ihren Auftrag zu erledigen und nichts mehr.

Beim Entwerfen für den App-Sandkasten entwerfen Sie ein Szenario im ungünstigsten Fall. Wenn die Anwendung durch böswilligen Code kompromittiert wird, ist sie nur auf den Zugriff auf die Dateien und Ressourcen im Sandkasten der App beschränkt.

Berechtigungen und Systemressourcenzugriff

Wie wir oben gesehen haben, wird eine Xamarin.Mac-Anwendung, die nicht sandkastent wurde, die vollen Rechte und den Zugriff des Benutzers gewährt, der die App ausführt. Wenn sie durch böswilligen Code kompromittiert wird, kann eine nicht geschützte App als Agent für feindliches Verhalten fungieren und ein breites Spektrum an Schaden anrichten.

Indem Sie die App-Sandbox aktivieren, entfernen Sie alle, aber nur einen minimalen Satz von Berechtigungen, die Sie dann mit den Berechtigungen Ihrer Xamarin.Mac-App erneut aktivieren.

Sie ändern die App-Sandkastenressourcen Ihrer Anwendung, indem Sie die Datei "Entitlements.plist " bearbeiten und die erforderlichen Rechte in den Dropdownfeldern für Editoren überprüfen oder auswählen:

Editing the entitlements

Containerverzeichnisse und Dateisystemzugriff

Wenn Ihre Xamarin.Mac-Anwendung die App-Sandbox verwendet, hat sie Zugriff auf die folgenden Speicherorte:

  • Das App-Containerverzeichnis – Bei der ersten Ausführung erstellt das Betriebssystem ein spezielles Containerverzeichnis, in dem alle zugehörigen Ressourcen ausgeführt werden, auf die nur sie zugreifen kann. Die App verfügt über vollständigen Lese-/Schreibzugriff auf dieses Verzeichnis.
  • App-Gruppencontainerverzeichnisse – Ihre App kann Zugriff auf einen oder mehrere Gruppencontainer erhalten, die für Apps in derselben Gruppe freigegeben sind.
  • Vom Benutzer angegebene Dateien – Ihre Anwendung erhält automatisch Zugriff auf Dateien, die vom Benutzer explizit geöffnet oder gezogen und auf die Anwendung abgelegt werden.
  • Verwandte Elemente – Mit den entsprechenden Berechtigungen kann Ihre Anwendung Zugriff auf eine Datei mit demselben Namen, aber eine andere Erweiterung haben. Ein Dokument, das beispielsweise als .txt Datei und als Datei .pdfgespeichert wurde.
  • Temporäre Verzeichnisse, Befehlszeilentoolverzeichnisse und bestimmte weltweit lesbare Speicherorte – Ihre App hat unterschiedliche Zugriffsgrade auf Dateien an anderen gut definierten Speicherorten, wie vom System angegeben.

Das App-Containerverzeichnis

Das App-Containerverzeichnis einer Xamarin.Mac-Anwendung weist die folgenden Merkmale auf:

  • Sie befindet sich an einem ausgeblendeten Speicherort im Startverzeichnis des Benutzers (in der Regel ~Library/Containers) und kann mit der NSHomeDirectory Funktion (siehe unten) in Ihrer Anwendung zugegriffen werden. Da sie sich im Home-Verzeichnis befindet, erhält jeder Benutzer einen eigenen Container für die App.
  • Die App verfügt über uneingeschränkten Lese-/Schreibzugriff auf das Containerverzeichnis und alle darin enthaltenen Unterverzeichnisse und Dateien.
  • Die meisten pfadsuche-APIs von macOS sind relativ zum Container der App. Beispielsweise verfügt der Container über eine eigene Bibliothek (über die zugegriffen NSLibraryDirectorywird), Anwendungsunterstützungs - und Einstellungsunterverzeichnisse .
  • macOS richtet die Verbindung zwischen und App und seinem Container über die Codesignatur ein und erzwingt sie. Selbst wenn eine andere App versucht, die App mithilfe des Bündelbezeichners zu spoofen, kann sie aufgrund der Codesignatur nicht auf den Container zugreifen.
  • Der Container richtet sich nicht an vom Benutzer generierte Dateien. Stattdessen gilt es für Dateien, die Ihre Anwendung verwendet, z. B. Datenbanken, Caches oder andere bestimmte Datentypen.
  • Bei Schuhbox-Typen von Apps (z. B. der Foto-App von Apple) wird der Inhalt des Benutzers in den Container verschoben.

Wichtig

Leider verfügt Xamarin.Mac noch nicht über eine API-Abdeckung von 100 % (im Gegensatz zu Xamarin.iOS), daher wurde die NSHomeDirectory API nicht in der aktuellen Version von Xamarin.Mac zugeordnet.

Als temporäre Problemumgehung können Sie den folgenden Code verwenden:

[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 ();
        }
}

Das App-Gruppencontainerverzeichnis

Ab MacOS 10.7.5 (und höher) kann eine Anwendung die Berechtigung für den com.apple.security.application-groups Zugriff auf einen freigegebenen Container verwenden, der für alle Anwendungen in der Gruppe gemeinsam ist. Sie können diesen freigegebenen Container für nicht benutzerorientierte Inhalte wie Datenbank oder andere Arten von Supportdateien (z. B. Caches) verwenden.

Die Gruppencontainer werden automatisch dem Sandkastencontainer der einzelnen Apps hinzugefügt (sofern sie Teil einer Gruppe sind) und unter ~/Library/Group Containers/<application-group-id>. gespeichert. Die Gruppen-ID muss mit Ihrer Entwicklungsteam-ID und einem Punkt beginnen, z. B.:

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

Weitere Informationen finden Sie unter Apples Hinzufügen einer Anwendung zu einer Anwendungsgruppe in der Berechtigungsschlüsselreferenz.

Powerbox- und Dateisystemzugriff außerhalb des App-Containers

Eine Sandkastenanwendung Xamarin.Mac kann auf Dateisystemspeicherorte außerhalb des Containers auf folgende Weise zugreifen:

  • An der spezifischen Richtung des Benutzers (über Das Öffnen und Speichern von Dialogfeldern oder anderen Methoden wie Ziehen und Ablegen).
  • Mithilfe von Berechtigungen für bestimmte Dateisystemspeicherorte (z /bin . B. oder /usr/lib).
  • Wenn sich der Dateisystemspeicherort in bestimmten Verzeichnissen befindet, die weltlesbar sind (z. B. Freigabe).

Powerbox ist die macOS-Sicherheitstechnologie, die mit dem Benutzer interagiert, um die Dateizugriffsrechte ihrer Sandkasten-Xamarin.Mac-App zu erweitern. Powerbox verfügt über keine API, wird aber transparent aktiviert, wenn die App eine oder NSSavePanelmehrere NSOpenPanel Aufrufe aufruft. Der Powerbox-Zugriff wird über die Berechtigungen aktiviert, die Sie für Ihre Xamarin.Mac-Anwendung festgelegt haben.

Wenn eine Sandkasten-App ein Dialogfeld "Öffnen" oder "Speichern" anzeigt, wird das Fenster von Powerbox (und nicht appKit) angezeigt und hat daher Zugriff auf eine Datei oder ein Verzeichnis, auf die der Benutzer Zugriff hat.

Wenn ein Benutzer eine Datei oder ein Verzeichnis aus dem Dialogfeld "Öffnen" oder "Speichern" auswählt (oder entweder auf das Symbol der App zieht), fügt Powerbox den zugeordneten Pfad zum Sandkasten der App hinzu.

Darüber hinaus lässt das System automatisch Folgendes für eine Sandkasten-App zu:

  • Verbinden ion zu einer Systemeingabemethode.
  • Anrufdienste, die vom Benutzer im Menü "Dienste " ausgewählt wurden (nur für Dienste, die als sicher für Sandkasten-Apps vom Dienstanbieter gekennzeichnet sind).
  • Öffnen Sie dateien, die vom Benutzer im Menü "Zuletzt geöffnet" ausgewählt wurden.
  • Verwenden Sie "Kopieren und Einfügen" zwischen anderen Anwendungen.
  • Lesen von Dateien aus den folgenden weltweit lesbaren Speicherorten:
    • /bin
    • /sbin
    • /usr/bin
    • /usr/lib
    • /usr/sbin
    • /usr/share
    • /System
  • Lesen und Schreiben von Dateien in den verzeichnissen, die von NSTemporaryDirectory.

Standardmäßig können Dateien, die von einer Sandkasten-Xamarin.Mac-App geöffnet oder gespeichert werden Standard bis die App beendet wird (es sei denn, die Datei wurde noch geöffnet, wenn die App beendet wurde). Geöffnete Dateien werden automatisch im Sandkasten der App über das MacOS Resume-Feature wiederhergestellt, wenn die App das nächste Mal gestartet wird.

Verwenden Sie Sicherheitsbereichsmarken, um Dateien, die sich außerhalb des Containers einer Xamarin.Mac-App befinden, persistenz zu ermöglichen (siehe unten).

Der App-Sandbox ermöglicht es einer App, auf verwandte Elemente zuzugreifen, die denselben Dateinamen, aber unterschiedliche Erweiterungen aufweisen. Das Feature besteht aus zwei Teilen: a) einer Liste verwandter Erweiterungen in der Datei der App Info.plst , b) Code, um dem Sandkasten mitzuteilen, was die App mit diesen Dateien tut.

Es gibt zwei Szenarien, in denen dies sinnvoll ist:

  1. Die App muss in der Lage sein, eine andere Version der Datei (mit einer neuen Erweiterung) zu speichern. Beispiel: Exportieren einer .txt Datei in eine .pdf Datei. Um diese Situation zu behandeln, müssen Sie einen NSFileCoordinator Für den Zugriff auf die Datei verwenden. Sie rufen zuerst die WillMove(fromURL, toURL) Methode auf, verschieben Sie die Datei in die neue Erweiterung, und rufen Sie dann auf ItemMoved(fromURL, toURL).
  2. Die App muss eine Standard Datei mit einer Erweiterung und mehreren Unterstützenden Dateien mit unterschiedlichen Erweiterungen öffnen. Beispielsweise eine Film- und Untertiteldatei. Verwenden Sie einen NSFilePresenter Zugriff auf die sekundäre Datei. Stellen Sie die Standard Datei für die PrimaryPresentedItemURL Eigenschaft und die sekundäre Datei für die PresentedItemURL Eigenschaft bereit. Wenn die Standard Datei geöffnet wird, rufen Sie die AddFilePresenter Methode der NSFileCoordinator Klasse auf, um die sekundäre Datei zu registrieren.

In beiden Szenarien muss die Info.plist-Datei der App die Dokumenttypen deklarieren, die die App öffnen kann. Fügen Sie für jeden Dateityp den NSIsRelatedItemType Eintrag (mit dem Wert von YES) in das CFBundleDocumentTypes Array ein.

Öffnen und Speichern des Dialogfeldverhaltens mit Sandkasten-Apps

Die folgenden Grenzwerte werden auf die NSOpenPanel und NSSavePanel beim Aufrufen von einer Sandkasten-Xamarin.Mac-App gesetzt:

  • Sie können die Schaltfläche "OK " nicht programmgesteuert aufrufen.
  • Sie können die Auswahl eines Benutzers in einem NSOpenSavePanelDelegateProgramm nicht programmgesteuert ändern.

Darüber hinaus sind die folgenden Vererbungsänderungen vorhanden:

  • Nicht-Sandkasten-App - NSOpenPanelNSSavePanel``NSPanel``NSWindow``NSResponder``NSObject``NSOpenPanel``NSSavePanel``NSObject``NSOpenPanel``NSSavePanel

Sicherheitsbezogene Lesezeichen und beständigen Ressourcenzugriff

Wie oben erwähnt, kann eine Sandboxed Xamarin.Mac-Anwendung über direkte Benutzerinteraktionen (wie von PowerBox bereitgestellt) auf eine Datei oder Ressource außerhalb des Containers zugreifen. Der Zugriff auf diese Ressourcen wird jedoch nicht automatisch über App-Starts oder Systemneustarts hinweg beibehalten.

Mithilfe von Sicherheitsbereichsmarken kann eine Sandboxed Xamarin.Mac-Anwendung die Benutzerabsicht beibehalten und den Zugriff auf bestimmte Ressourcen nach einem Neustart der App Standard beibehalten.

Sicherheitsbereichsbezogene Textmarkentypen

Beim Arbeiten mit sicherheitsbezogenen Lesezeichen und dem Zugriff auf persistente Ressourcen gibt es zwei sistinische Anwendungsfälle:

  • Eine Textmarke mit App-Bereich bietet beständigen Zugriff auf eine vom Benutzer angegebene Datei oder einen ordner.

    Wenn die Sandkastenanwendung Xamarin.Mac z. B. das Öffnen eines externen Dokuments für die Bearbeitung (mit a NSOpenPanel) ermöglicht, kann die App eine Textmarke mit App-Bereich erstellen, damit sie in Zukunft erneut auf dieselbe Datei zugreifen kann.

  • Eine Textmarke mit Dokumentbereich bietet einen bestimmten dauerhaften Zugriff auf eine Unterdatei.

Beispielsweise eine Videobearbeitungs-App, die eine Projektdatei erstellt, die Zugriff auf die einzelnen Bilder, Videoclips und Audiodateien hat, die später in einem einzigen Film kombiniert werden.

Wenn der Benutzer eine Ressourcendatei in das Projekt importiert (über a NSOpenPanel), erstellt die App eine Dokumentbereichsmarke für das Element, das im Projekt gespeichert ist, sodass die Datei immer für die App zugänglich ist.

Eine Textmarke mit Dokumentbereich kann von jeder Anwendung aufgelöst werden, die die Lesezeichendaten und das Dokument selbst öffnen kann. Dies unterstützt die Portabilität, sodass der Benutzer die Projektdateien an einen anderen Benutzer sendet und alle Lesezeichen auch für sie verwendet werden kann.

Wichtig

Eine Textmarke mit Dokumentbereich kann nur auf eine einzelne Datei und nicht auf einen Ordner verweisen, und diese Datei kann sich nicht an einem Speicherort befinden, der vom System verwendet wird (z /private . B. oder /Library).

Verwenden von Textmarken mit Sicherheitsbereich

Wenn Sie einen der Typen von Sicherheitsbereichsmarken verwenden, müssen Sie die folgenden Schritte ausführen:

  1. Legen Sie die entsprechenden Berechtigungen in der Xamarin.Mac-App fest, die Sicherheitsbereichsmarken verwenden müssen – Für Textmarken mit App-Bereich legen Sie den com.apple.security.files.bookmarks.app-scope Berechtigungsschlüssel auf true. Legen Sie für Textmarken mit Dokumentbereich den com.apple.security.files.bookmarks.document-scope Berechtigungsschlüssel auf true.
  2. Erstellen Sie eine Textmarke mit Sicherheitsbereich – Sie tun dies für jede Datei oder jeden Ordner, auf die der Benutzer Zugriff gewährt hat (z. B. über NSOpenPanel ), auf die die App beständigen Zugriff benötigt. Verwenden Sie die public virtual NSData CreateBookmarkData (NSUrlBookmarkCreationOptions options, string[] resourceValues, NSUrl relativeUrl, out NSError error) Methode der NSUrl Klasse, um die Textmarke zu erstellen.
  3. Beheben Sie das Sicherheitslesezeichen . Wenn die App erneut auf die Ressource zugreifen muss (z. B. nach einem Neustart), muss die Textmarke in eine sicherheitsbereichsbezogene URL aufgelöst werden. Verwenden Sie die public static NSUrl FromBookmarkData (NSData data, NSUrlBookmarkResolutionOptions options, NSUrl relativeToUrl, out bool isStale, out NSError error) Methode der NSUrl Klasse, um die Textmarke aufzulösen.
  4. Benachrichtigen Sie das System explizit, dass Sie über die SICHERHEITSbereichs-URL auf die Datei zugreifen möchten . Dieser Schritt muss unmittelbar nach dem Abrufen der oben aufgeführten URL mit Sicherheitsbereich ausgeführt werden, oder wenn Sie später wieder auf die Ressource zugreifen möchten, nachdem Sie Den Zugriff auf die Ressource aufgegeben haben. Rufen Sie die StartAccessingSecurityScopedResource () Methode der NSUrl Klasse auf, um mit dem Zugriff auf eine url mit Sicherheitsbereich zu beginnen.
  5. Benachrichtigen Sie das System explizit, dass Sie den Zugriff auf die Datei über die SICHERHEITSbereichs-URL abgeschlossen haben . So bald wie möglich sollten Sie das System informieren, wenn die App keinen Zugriff mehr auf die Datei benötigt (z. B. wenn der Benutzer sie schließt). Rufen Sie die StopAccessingSecurityScopedResource () Methode der NSUrl Klasse auf, um den Zugriff auf eine url mit Sicherheitsbereich zu beenden.

Nachdem Sie den Zugriff auf eine Ressource aufgegeben haben, müssen Sie zu Schritt 4 zurückkehren, um den Zugriff erneut herzustellen. Wenn die Xamarin.Mac-App neu gestartet wird, müssen Sie zu Schritt 3 zurückkehren und die Textmarke erneut auflösen.

Wichtig

Wenn der Zugriff auf Ressourcen mit Sicherheitsbereichs-URL nicht freigegeben wurde, führt dies dazu, dass eine Xamarin.Mac-App Kernelressourcen durchleckt. Daher kann die App dem Container keine Dateisystemspeicherorte mehr hinzufügen, bis sie neu gestartet wird.

App-Sandbox und Codesignatur

Nachdem Sie die App-Sandbox aktiviert und die spezifischen Anforderungen für Ihre Xamarin.Mac-App (über Berechtigungen) aktiviert haben, müssen Sie das Projekt codieren, damit das Sandkastenprojekt wirksam wird. Sie müssen die Codesignatur ausführen, da die für die App-Sandboxing erforderlichen Berechtigungen mit der Signatur der App verknüpft sind.

macOS erzwingt eine Verknüpfung zwischen dem Container einer App und der zugehörigen Codesignatur. Auf diese Weise kann keine andere Anwendung auf diesen Container zugreifen, auch wenn er die App-Bundle-ID spooft. Dieser Mechanismus funktioniert wie folgt:

  1. Wenn das System den Container der App erstellt, legt es eine Zugriffssteuerungsliste (Access Control List , ACL) für diesen Container fest. Der erste Zugriffssteuerungseintrag in der Liste enthält die designierte Anforderung (DR) der App, die beschreibt, wie zukünftige Versionen der App erkannt werden können (wenn sie aktualisiert wurde).
  2. Jedes Mal, wenn eine App mit derselben Bundle-ID gestartet wird, überprüft das System, ob die Codesignatur der App den in einem der Einträge in der ACL des Containers angegebenen festgelegten Anforderungen entspricht. Wenn das System keine Übereinstimmung findet, wird verhindert, dass die App gestartet wird.

Die Codesignierung funktioniert wie folgt:

  1. Bevor Sie das Xamarin.Mac-Projekt erstellen, erhalten Sie ein Entwicklungszertifikat, ein Verteilungszertifikat und ein Entwickler-ID-Zertifikat aus dem Apple Developer Portal.
  2. Wenn der Mac App Store die Xamarin.Mac-App verteilt, wird sie mit einer Apple-Codesignatur signiert.

Beim Testen und Debuggen verwenden Sie eine Version der von Ihnen signierten Xamarin.Mac-Anwendung (die zum Erstellen des App-Containers verwendet wird). Wenn Sie die Version später aus dem Apple App Store testen oder installieren möchten, wird sie mit der Apple-Signatur signiert und kann nicht gestartet werden (da sie nicht über dieselbe Codesignatur wie der ursprüngliche App-Container verfügt). In dieser Situation erhalten Sie einen Absturzbericht ähnlich der folgenden:

Exception Type:  EXC_BAD_INSTRUCTION (SIGILL)

Um dies zu beheben, müssen Sie den ACL-Eintrag so anpassen, dass er auf die signierte Apple-Version der App verweist.

Weitere Informationen zum Erstellen und Herunterladen der für sandkastenbasierten Bereitstellungsprofile erforderlichen Bereitstellungsprofile finden Sie im Abschnitt "Signieren und Bereitstellen der App " weiter oben.

Anpassen des ACL-Eintrags

Gehen Sie wie folgt vor, um die von Apple signierte Version der Xamarin.Mac-App auszuführen:

  1. Öffnen Sie die Terminal-App (in /Applications/Utilities).
  2. Öffnen Sie ein Finder-Fenster in der von Apple signierten Version der Xamarin.Mac-App.
  3. Geben Sie asctl container acl add -file das Terminalfenster ein.
  4. Ziehen Sie das Symbol der Xamarin.Mac-App aus dem Finder-Fenster, und legen Sie es im Terminalfenster ab.
  5. Der vollständige Pfad zur Datei wird dem Befehl im Terminal hinzugefügt.
  6. Drücken Sie die EINGABETASTE, um den Befehl auszuführen.

Die ACL des Containers enthält jetzt die festgelegten Codeanforderungen für beide Versionen der Xamarin.Mac-App und macOS lassen jetzt beide Versionen ausführen.

Anzeigen einer Liste der ACL-Codeanforderungen

Sie können eine Liste der Codeanforderungen in der ACL eines Containers anzeigen, indem Sie die folgenden Schritte ausführen:

  1. Öffnen Sie die Terminal-App (in /Applications/Utilities).
  2. Geben Sie asctl container acl list -bundle <container-name>ein.
  3. Drücken Sie die EINGABETASTE, um den Befehl auszuführen.

Dies <container-name> ist in der Regel der Bundle-Bezeichner für die Xamarin.Mac-Anwendung.

Entwerfen einer Xamarin.Mac-App für die App-Sandbox

Es gibt einen allgemeinen Workflow, der beim Entwerfen einer Xamarin.Mac-App für die App-Sandbox befolgt werden sollte. Die Besonderheiten der Implementierung von Sandboxing in einer App werden jedoch nur für die Funktionalität der app gelten.

Sechs Schritte für die Einführung der App-Sandbox

Das Entwerfen einer Xamarin.Mac-App für die App-Sandbox besteht in der Regel aus den folgenden Schritten:

  1. Ermitteln Sie, ob die App für Sandkasten geeignet ist.
  2. Entwerfen Sie eine Entwicklungs- und Vertriebsstrategie.
  3. Lösen Sie alle API-Inkompatibilitäten auf.
  4. Wenden Sie die erforderlichen App-Sandbox-Berechtigungen auf das Xamarin.Mac-Projekt an.
  5. Fügen Sie die Rechtetrennung mithilfe von XPC hinzu.
  6. Implementieren sie eine Migrationsstrategie.

Wichtig

Sie müssen nicht nur die Standard ausführbare Datei im App-Bündel, sondern auch jede enthaltene Hilfs-App oder jedes enthaltene Tool in diesem Bundle sandkasten. Dies ist für jede App erforderlich, die über den Mac App Store verteilt wird, und sollte, falls möglich, für jede andere Form der App-Verteilung erfolgen.

Geben Sie für eine Liste aller ausführbaren Binärdateien im Paket einer Xamarin.Mac-App den folgenden Befehl in Terminal ein:

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

Dabei [Your-App-Bundle] handelt es sich um den Namen und Pfad zum Bündel der Anwendung.

Ermitteln, ob eine Xamarin.Mac-App für Sandkasten geeignet ist

Die meisten Xamarin.Mac-Apps sind vollständig mit der App-Sandbox kompatibel und eignen sich daher für Sandkasten. Wenn für die App ein Verhalten erforderlich ist, das der App-Sandbox nicht zulässt, sollten Sie einen alternativen Ansatz in Betracht ziehen.

Wenn Ihre App eins der folgenden Verhaltensweisen erfordert, ist sie nicht mit der App-Sandbox kompatibel:

  • Autorisierungsdienste – Mit der App-Sandbox können Sie nicht mit den funktionen arbeiten, die in der C-Referenz für Autorisierungsdienste beschrieben sind.
  • Barrierefreiheits-APIs – Sie können keine Sandkasten-Hilfs-Apps wie Bildschirmsprachausgaben oder Apps verwenden, die andere Anwendungen steuern.
  • Senden Von Apple-Ereignissen an beliebige Apps – Wenn die App Apple-Ereignisse an eine unbekannte, beliebige App sendet, kann sie nicht sandkastengeschützt werden. Bei einer bekannten Liste der aufgerufenen Apps kann die App weiterhin sandkasteniert werden, und die Berechtigungen müssen die aufgerufene App-Liste enthalten.
  • Benutzerinformationsverzeichnisse in verteilten Benachrichtigungen an andere Aufgaben senden – Mit dem App-Sandkasten können Sie beim userInfo Posten in ein NSDistributedNotificationCenter Objekt für andere Aufgaben kein Wörterbuch einschließen.
  • Laden von Kernelerweiterungen – Das Laden von Kernelerweiterungen ist durch die App-Sandbox verboten.
  • Das Simulieren von Benutzereingaben in "Dialogfelder öffnen" und "Speichern" - Programmgesteuertes Bearbeiten von Dialogfeldern zum Simulieren oder Ändern von Benutzereingaben ist durch die App-Sandbox untersagt.
  • Der Zugriff oder das Festlegen von Einstellungen für andere Apps – Das Bearbeiten der Einstellungen anderer Apps ist durch die App-Sandbox verboten.
  • Konfigurieren von Netzwerk-Einstellungen – Das Bearbeiten von Netzwerk-Einstellungen ist durch die App-Sandbox verboten.
  • Beenden anderer Apps – Die App-Sandbox verbietet die Verwendung NSRunningApplication zum Beenden anderer Apps.

Auflösen von API-Inkompatibilitäten

Beim Entwerfen einer Xamarin.Mac-App für die App-Sandbox treten möglicherweise Inkompatibilitäten mit der Verwendung einiger macOS-APIs auf.

Hier sind einige häufige Probleme und Dinge, die Sie tun können, um sie zu lösen:

  • Öffnen, Speichern und Nachverfolgen von Dokumenten – Wenn Sie Dokumente mit einer anderen NSDocumentTechnologie als verwalten, sollten Sie aufgrund der integrierten Unterstützung für die App-Sandbox zu ihr wechseln. NSDocument funktioniert automatisch mit PowerBox und bietet Unterstützung für die Aufbewahrung von Dokumenten in Ihrem Sandkasten, wenn der Benutzer sie in Finder verschiebt.
  • Beibehalten des Zugriffs auf Dateisystemressourcen – Wenn die Xamarin.Mac-App vom dauerhaften Zugriff auf Ressourcen außerhalb des Containers abhängt, verwenden Sie sicherheitsbezogene Lesezeichen, um den Zugriff zu Standard.
  • Erstellen Sie ein Anmeldeelement für eine App – Mit der App-Sandbox können Sie kein Anmeldeelement erstellen LSSharedFileList oder den Status der Startdienste mithilfe LSRegisterURLvon . bearbeiten. Verwenden Sie die SMLoginItemSetEnabled Funktion wie in apples Adding Login Items Using the Service Management Framework documentation beschrieben.
  • Zugreifen auf Benutzerdaten – Wenn Sie POSIX-Funktionen verwenden, z getpwuid . B. um das Heimverzeichnis des Benutzers aus Verzeichnisdiensten abzurufen, erwägen Sie die Verwendung von Cocoa- oder Core Foundation-Symbolen wie NSHomeDirectory.
  • Zugreifen auf die Einstellungen anderer Apps – Da die App-Sandbox Pfadsuche-APIs an den Container der App leitet, erfolgt das Ändern von Einstellungen innerhalb dieses Containers und der Zugriff auf andere Apps-Einstellungen in diesem Container nicht zulässig.
  • Verwenden von HTML5 Embedded Video in Webansichten – Wenn die Xamarin.Mac-App WebKit zum Wiedergeben eingebetteter HTML5-Videos verwendet, müssen Sie die App auch mit dem AV Foundation-Framework verknüpfen. Der App-Sandbox verhindert, dass CoreMedia diese Videos andernfalls wiederzugeben.

Anwenden erforderlicher App-Sandbox-Berechtigungen

Sie müssen die Berechtigungen für jede Xamarin.Mac-Anwendung bearbeiten, die Sie im App-Sandkasten ausführen möchten, und das Kontrollkästchen "App-Sandboxing aktivieren".

Basierend auf der Funktionalität der App müssen Sie möglicherweise andere Berechtigungen für den Zugriff auf Betriebssystemfeatures oder -ressourcen aktivieren. Die App-Sandboxing funktioniert am besten, wenn Sie die Berechtigungen minimieren, die Sie für die Ausführung Ihrer App anfordern, um nur zufällig Berechtigungen zu aktivieren.

Gehen Sie wie folgt vor, um zu ermitteln, welche Berechtigungen eine Xamarin.Mac-App erfordert:

  1. Aktivieren Sie die App-Sandbox, und führen Sie die Xamarin.Mac-App aus.
  2. Führen Sie die Features der App durch.
  3. Öffnen Sie die Konsolen-App (verfügbar in/Applications/Utilities), und suchen Sie im Protokoll "Alle Nachrichten" nach sandboxd Verstößen.
  4. Beheben Sie für jeden sandboxd Verstoß das Problem entweder mithilfe des App-Containers anstelle anderer Dateisystemspeicherorte, oder wenden Sie App-Sandkastenberechtigungen an, um den Zugriff auf eingeschränkte Betriebssystemfeatures zu ermöglichen.
  5. Führen Sie alle Xamarin.Mac-App-Features erneut aus, und testen Sie sie erneut.
  6. Wiederholen Sie den Vorgang, bis alle sandboxd Verstöße behoben wurden.

Hinzufügen einer Rechtetrennung mit XPC

Betrachten Sie beim Entwickeln einer Xamarin.Mac-App für die App-Sandbox das Verhalten der App in bezug auf Berechtigungen und Zugriff, und trennen Sie dann Vorgänge mit hohem Risiko in ihre eigenen XPC-Dienste.

Weitere Informationen finden Sie im Programmierhandbuch für die Erstellung von XPC-Diensten und Daemons und Diensten von Apple.

Implementieren einer Migrationsstrategie

Wenn Sie eine neue Sandkastenversion einer Xamarin.Mac-Anwendung veröffentlichen, die zuvor nicht sandkastenweise ausgeführt wurde, müssen Sie sicherstellen, dass aktuelle Benutzer über einen reibungslosen Upgradepfad verfügen.

Ausführliche Informationen zum Implementieren eines Containermigrationsmanifests finden Sie in der Dokumentation zum Migrieren einer App zu einer Sandbox von Apple.

Zusammenfassung

Dieser Artikel hat einen detaillierten Blick auf die Sandboxing einer Xamarin.Mac-Anwendung genommen. Zunächst haben wir eine einfach Xamarin.Mac-App erstellt, um die Grundlagen der App-Sandbox anzuzeigen. Als Nächstes haben wir gezeigt, wie Sandkastenverletzungen behoben werden. Anschließend haben wir einen ausführlichen Blick auf die App-Sandbox genommen und schließlich haben wir uns mit dem Entwerfen einer Xamarin.Mac-App für die App-Sandbox befasst.