2012-07-06 13 views
7

Ich arbeite gerade an einem sehr modularen und pluginbasierten Framework für meine Bachelorarbeit. Die Hauptidee ist, dass es einen Ordner in meiner Anwendungsstruktur mit dem Namen plugins gibt, wo Sie kompilierte Plugins (z. B. .dll-Dateien) einwerfen können, die einer speziellen Schnittstelle IPlugin entsprechen. Die Anwendung führt dann Aufgaben mit dem Plugin aus, das ein Benutzer auswählt. Also, wenn ich eine Aufgabe einmal in einer PDF-Datei ausführen möchte, würde ich die PdfPlugin wählen und einmal in einem Word-Dokument würde ich die DocPlugin zur Arbeit wählen.So verhindern Sie, dass Plugins schädlichen Code ausführen

Die Ausgabe ist auch in Schnittstellen definiert, so dass jedes Plugin die gleiche Datenstruktur zurückgibt. Nur die tatsächliche Arbeit unterscheidet sich für jede Bibliothek.

Nun ruft die Anwendung nur die Methoden auf, die in der Schnittstelle definiert sind, z. ParseDocument() und wie kann ich verhindern, dass die Plugins (die möglicherweise von Dritten entwickelt wurden) schädlichen Code ausführen?

Ich arbeite an .NET3.5 (vielleicht wird auf 4, noch nicht entschieden) und C#.

Antwort

8

Ich arbeite an NET3.5

In diesem Fall würde ich Ihre Plugins isolieren in einem separaten AppDomain, verwenden Code Access Security und beschränken den Berechtigungssatz der App Domain laufen. Dies "sandboxes" Ihre Plugin-Assemblies.

Zum Beispiel könnten Sie alle Unmanaged Code-Berechtigungen und File IO-Berechtigungen entfernen, und dann wäre Ihr Plugin niemals in der Lage, in das Dateisystem zu schreiben.

Dies ist nichts für schwache Nerven. AppDomains können schwierig zu handhaben sein und Serialisierung, Richtlinien für die Lebenszeit von Objekten usw. erfordern. Sie könnten MAF verwenden, da es viel von den Rohrleitungen entfernt.

+0

Ist es möglich, ein Plugin nach den gewünschten Code Access Security-Berechtigungen abzufragen? Im Vergleich zu etwas wie Intents auf Android? I.e. Ich möchte wahrscheinlich ein Plugin-Framework, mit dem ich feststellen kann, welche Berechtigungen ein Plugin verlangt, damit ich den Benutzer vor dem Laden des Plugins zur Bestätigung auffordern kann. Oder ist es andersherum, in dem ich Berechtigungen in meiner App erzwinge, und dann scheitert das Plugin einfach/Ausnahme zu werfen, wenn es versucht, etwas außerhalb der zulässigen Berechtigungen zu tun? – AaronLS

+0

Nicht nach einem "How to" fragen, da das irgendwie außerhalb des Bereichs der Frage liegt, aber neugierig, für welche dieser zwei verschiedenen Ansätze CAS geeignet ist. – AaronLS

0

Ich weiß, dass in diesem Bereich einiges erforscht wird. Ein Arbeitsansatz besteht darin, den IL-Code zu prüfen und nach verbotenen Methodensignaturen zu suchen. Dann können Sie sie zu einem Fehler-Hook umleiten, der das Plugin davon abhält, weiteren Code auszuführen.

Eine Anwendung ist z.B. erhöhte Sicherheit für Smartphones, wo Sie den IL-Code von heruntergeladenen Apps auf Zugriffsmethoden zum GPS-Modul, zur Kamera, zum Mikrofon usw. überprüfen können. Die Sicherheitsanwendung kann dann diese Zugriffsmethoden patchen und den Benutzer fragen, ob die Anwendung wirklich sein sollte erlaubt das Mikrofon zu aktivieren.

Mit .NET können Sie einen IL-Reader wie Mono.Cecil verwenden, um den IL-Code auf schädliche Signaturen zu überprüfen. Es gibt jedoch immer Möglichkeiten, da Sie Code dynamisch generieren oder Code als Ressource speichern und von einer Ressource im Rume-Modus laden können. Für einen Machbarkeitsnachweis ist dieser Ansatz ziemlich einfach.

Sie könnten sogar eine FXCop-Regel schreiben und damit statisch die Plugins auf verbotene Methodenaufrufe überprüfen.

+2

"Ein Arbeitsansatz besteht darin, den IL-Code zu überprüfen und nach verbotenen Methodensignaturen zu suchen" ick. Was ist mit Methodenaufrufen, die über dynamischen Dispatch wie DLR, Reflektion usw. gemacht werden? – vcsjones

+0

Ich sage nicht, dass ich das getan habe. Ich habe nur gesagt, dass die Forscher es getan haben und ziemlich viel Echo bekommen haben (Smartphone-Sicherheit ist cool). Ich denke, sie waren einfach keine so harten Kernentwickler wie die durchschnittlichen Stackoverflow-Besucher. Vielleicht hätten sie nach SO fragen sollen, ob ihre Idee eine gute Idee war. –

-2

Sie können nicht.

DLLs sind Binärcode, der mit den Rechten des aufrufenden Programms ausgeführt wird. Wenn eine Methode von einer DLL aufgerufen wird, haben Sie keine Kontrolle darüber, was es tut.

Wenn Sie begrenzen wollen, was ein Plugin tun kann, müssen Sie die Ausführung in Ihr Hauptprogramm verschieben.Eine gute Möglichkeit wäre, Plugins in einer Skriptsprache zu implementieren, die von Ihrem Programm anstelle von Binärbibliotheken analysiert und ausgeführt wird.

+0

* DLLs sind Binärcode * - nicht in .Net – DaveShaw

+1

"Sie können nicht." Ja, du kannst. Genau dafür wurde CAS entwickelt. Denken Sie daran, dass das .NET Framework eine virtuelle Maschine ist, sodass diese Regeln zur Laufzeit durchgesetzt werden können. – vcsjones

Verwandte Themen