2010-06-12 3 views
11

Wie Sandbox in C# für externen Prozess erstellen? Als Sandbox verstehe ich eine Umgebung für Prozess Ich starte von C#, die stoppen diesen Prozess von etwas anderes stören - Kernel, Systemvariablen, Systemkonfiguration, Speicher, Registrierung, Festplatte, Hardware, Ort als Startplatz und so weiter.Wie Sandbox in C# für externen Prozess erstellen?

Ich möchte Place ausführbare an einem Ort und sicher sein, dass dieser Ort ist nur Platz, der durch diesen Prozess geändert werden kann. Zusätzlich kann die ausführbare Datei in C, C++, C# usw. geschrieben werden.

Antwort

2

Verwenden Sie Sandboxie als ein Beispiel für das, was ich denke, dass Sie in gewissem Umfang erreichen wollen. IMHO, Sie können dies nicht in reinen verwalteten Code tun.

Wenn Sie in der Lage sein möchten, welche Aktionen und Auswirkungen einer Anwendung unabhängig davon, ob es sich um eine verwaltete oder native oder sogar Java-Anwendung handelt. Dies bedeutet, dass Sie jede von der Anwendung durchgeführte Aktion überwachen und die entsprechenden Maßnahmen ergreifen müssen, um sicherzustellen, dass sich dies nicht auf Ihr System auswirkt. Die entsprechende Aktion könnte bedeuten, dass Sie die Anwendung an einen anderen Speicherort auf der Festplatte umschreiben, eine virtualisierte Registrierung schreiben, so dass die echte Registrierung nicht betroffen ist usw. usw. All dies erfordert viel Arbeit auf niedriger Ebene, die der verwaltete Code nicht tut stelle heute vor.

Hinweis Ich sagte reinen verwalteten Code, Sie könnten natürlich Interop Services usw. verwenden, um die nicht verwaltete Implementierung bestimmter Codebereiche zu nutzen, oder Sie könnten verwaltetes C++ verwenden. Abhängig von den genauen Details Ihrer Sandbox müssen Sie jedoch wahrscheinlich einen Kernel-Modus-Treiber implementieren, um sicherzustellen, dass Sie die Umgebung für die Sandbox-Anwendungen im Benutzermodus ausreichend virtualisieren können.

+0

Sie sagten über die Umleitung zu einer anderen Registrierung oder Speicherort der Festplatte. Wie wäre es mit der vollständigen Blocknutzung der Registry, und nicht mit Umleitung kümmern? Wird es einfacher sein? Weil diese Anwendungen keine dieser Funktionen benötigen. Ich möchte sie nur blockieren. – SuitUp

+1

@ SuitUp, während dieser vielleicht einfacher der gleiche oder ein ähnlicher Mechanismus noch benötigt wird, um die Anrufe abzufangen und sie zu verfehlen. Die Vereinfachung, die von Bedeutung ist, besteht darin, dass Sie die Registrierung usw. nicht virtualisieren müssen, aber die Komplexität der Überwachung ist immer noch vorhanden. Sie können eine Bibliothek wie Detours für das Abhören verwenden, aber um ehrlich zu sein, bezweifle ich, dass dies Ihnen eine robuste und zuverlässige Sandbox-Lösung gibt. Natürlich gehe ich davon aus, dass Sie eine vollständige zuverlässige und sichere Lösung benötigen, die mehr als nur Abhören erfordert . –

+0

Sie Annahme ist richtig. Kannst du mir ein paar technische Details geben? – SuitUp

3

Wenn Sie nur laufen verwalteten Code wollten, ist es relativ einfach, eine Sandbox-Umgebung unter Verwendung einen AppDomain erstellen w/einen eingeschränkten Berechtigungssatz:

 PermissionSet ps = new PermissionSet(PermissionState.None); 
     // ps.AddPermission(new System.Security.Permissions.*); // Add Whatever Permissions you want to grant here 

     AppDomainSetup setup = new AppDomainSetup(); 
     Evidence ev = new Evidence(); 

     AppDomain sandbox = AppDomain.CreateDomain("Sandbox", 
      ev, 
      setup, 
      ps); 

     sandbox.ExecuteAssembly("ManagedAssembly.exe"); 

Aber sobald man die Tür öffnen, um nicht verwaltete/unsicher Code alle Wetten sind aus, und es wird sehr schwierig, 3rd Party Code zu sichern. Wie bereits erwähnt, müssen Sie grundsätzlich einen Shim zwischen dem ausführenden Code und dem Betriebssystem erstellen, um dessen Möglichkeiten einzuschränken, es sei denn, es reicht aus, es als eingeschränkten Benutzer auszuführen und sich allein auf ACLs/UAC zu verlassen, um Sie zu schützen.

HINWEIS: Dieses Codebeispiel ist kein funktionierendes Beispiel, sondern nur eine Vorstellung davon, wie der Code aussehen würde. Etwas Finagling w/Evidence und AppDomainSetup wird wahrscheinlich notwendig sein, und Sie sollten sicherlich das recherchieren/testen, was die Sicherheitsimplikationen angeht. Hier ist ein guter Artikel zum Thema: http://msdn.microsoft.com/en-us/magazine/cc163701.aspx

+1

Wie steht es mit nicht verwaltetem/unsicheren Code und einigen Code-Schnipseln? – SuitUp

+1

Um ehrlich zu sein, würde ich nicht wirklich wissen, wo ich mit nicht verwaltetem/unsicheren Code anfangen soll, und es wäre ein mehrmonatiges Projekt, das ein tiefes Verständnis des Windows Betriebssystems, Kernel/Systemaufrufe, Speicherzuteilung und Zugriff erfordert. Leute, die bei Microsoft arbeiten, können dieses Zeug nicht einmal richtig machen. –

+1

Mein Rat: Ändern Sie Ihre Anforderungen, akzeptieren Sie nur verwalteten Code oder machen Sie Ihren Benutzern klar, dass sie nur ausführbare Dateien von Drittanbietern verwenden sollten, denen sie vertrauen. Sofern Sie nicht nur einen Prozess als einen anderen Benutzer ausführen möchten, prüfen Sie in diesem Fall die Eigenschaften Domain/UserName/Password der Klasse ProcessStartInfo. –