Ist "Code Access Security" von realer Bedeutung?

68

Warnung:

Neuere Versionen von .Net und .Net Core haben "Code Access Security" (CAS) entfernt und / oder geändert, seit diese Frage gestellt wurde.

Ursprüngliche Frage:

Ich bin gerade dabei, für die Prüfung 70-536 .NET Framework - Application Development Foundation zu studieren , da ich .net seit vielen Jahren programmiere. Dies sollte nicht schwer sein!

Ich muss jedoch etwas über „Code Access Security“ (CAS) lernen. Da ich es nie verwenden oder konfigurieren musste, habe ich mich gefragt, ob jemand anderes eine echte Verwendung dafür gefunden hat.

Bitte geben Sie Beispiele dafür, wann Sie CAS verwendet haben und es eher Teil der Lösung als des Problems war.

(Bisher hatte alles andere eine Beziehung zu der Aufgabe, die ich in meinen Jahren der .NET-Programmierung zu erledigen hatte.)


Verwandte Fragen:


Ergebnisse bisher.

  • CAS ist nützlich, wenn Sie Code von Drittanbietern hosten. Beispielsweise kann ein Webhosting-Unternehmen damit verhindern, dass der Asp.net-Code seines Kunden die Server beschädigt. (Office nutzt es auch, wenn .NET als Ersatz für VBA verwendet wird.)

  • Das einzige detaillierte Beispiel für die Verwendung außerhalb einer Microsoft-Anwendung ist:

    In einem kürzlich von mir durchgeführten Projekt hatte ich etwas Ähnliches: Erlauben Sie dem Benutzer, eine Bibliothek hochzuladen und auf Leistung zu testen ("Wer macht den besten Algorithmus"). Unnötig zu erwähnen, dass wir dort dringend CAS brauchten.

  • CAS scheint nützlich zu sein, um eine JITDC-Zertifizierung zu erhalten, die vom US-Verteidigungsministerium stammt. Ich weiß jedoch nicht, ob CAS einen echten Wert hatte oder ob es sich nur um ein Kästchen handelte.

(Wenn Sie einen Host umgehen müssen, der CAS verwendet, und auf diesem Computer Administratorrechte haben, können Sie Ihre Assemblys einfach in den GAC einfügen.)

Mit Blick auf die Zukunft ist CAS in .net 4 etwas weniger komplex .


Zumindest sieht es so aus, als würden die neuen Microsoft-Prüfungen keine "Grund" -Prüfung haben, die CAS enthält. Ich weiß nicht, ob es in die neuen Winforms / WPF-Prüfungen kommt.

Ian Ringrose
quelle
2
Ich hatte die gleiche Reaktion, als ich für diese Prüfung studierte; Meiner Meinung nach ist dies ein wichtiger Bestandteil des internen .NET-Frameworks, das von Microsoft verwendet wird, um viele Sicherheitslücken zu schließen, und das sie aufgedeckt haben, damit andere Benutzer es auch verwenden können. Aber ich habe es auch nie selbst verwendet oder jemanden gekannt, der es in einer Geschäftsanwendung verwendet hat.
Guy Starbuck
CAS hat eine riesige Oberfläche. Wahrscheinlich enthält es viele Sicherheitslücken. JIT-Fehler können beispielsweise CAS umgehen. Siehe GitHub CoreClr, um zu sehen, wie viele JIT-Fehler es gibt. CAS ist eine Best-Effort-Sicherheitsbarriere. Ein ausreichend motivierter Angreifer kann es überwinden. Das Ausführen von nicht vertrauenswürdigem Code mit CAS ist sehr gefährlich.
usr

Antworten:

35

In der "realen Welt" stoße ich häufig auf Codezugriffssicherheit, oft dann, wenn ich es am wenigsten erwarte. In gewisser Weise wäre SilverLight eine hervorragende Anwendung in der Praxis, wenn SilverLight sich am Ende nicht dafür entschieden hätte, CAS überhaupt nicht einzusetzen .

Hosting-Anbieter

An den Stellen, an denen Sie es in Aktion sehen, wird eine gesicherte Umgebung benötigt: ASP.NET selbst natürlich, aber ASP.NET-Hosting-Anbieter verwenden ein modifiziertes Sicherheitsmodell , um das Eindringen in ihre wertvollen Systeme zu verhindern. Ich weiß, dass Webhost4Life dies verwendet (keine Informationen auf ihrer Website darüber, aber ich habe mit ihnen gearbeitet, es ist wirklich da). Weitere ASP.NET-Hosting-Anbieter tun dasselbe, sind sich aber auch nicht ganz sicher : Thread auf godaddy.com , der das CAS nicht ändern möchte (und keine Klarheit darüber, was unterstützt wird und was nicht) oder diese verwandte Diskussion zu 1 & 1 . Einige Cloud-Hosting-Sites (Rackspacecloud) gingen noch einen Schritt weiter und "arbeiteten mit Microsoft für eine modifizierte vollständige Vertrauensstufe", was auch immer das sein mag.

Kurz gesagt: Wenn Sie einen ASP.NET-Host finden, haben diese höchstwahrscheinlich CAS verwendet, um Sie daran zu hindern, Dinge zu tun, die Sie nicht tun sollen. Sie können es sogar verwenden, um zwischen "einfachem" (viele Einschränkungen) Hosting und "Enterprise" (wenige Einschränkungen) Hosting zu unterscheiden, was CAS eine ganz andere Bedeutung verleiht.

Andere Anwendungen von CAS

Soviel zu einigen realen Situationen, denen ich selbst begegnet bin. In einem kürzlich von mir durchgeführten Projekt hatte ich etwas Ähnliches: Erlauben Sie dem Benutzer, eine Bibliothek hochzuladen und auf Leistung zu testen ("Wer macht den besten Algorithmus"). Unnötig zu erwähnen, dass wir dort dringend CAS brauchten. Andere Beispiele oder interessante Ressourcen:

  • NAR Loader (eine Codeprojektanwendung) verwendet ein eigenes CAS
  • LR Evaluator (auch Codeprojekt-App) verwendet CAS
  • ClickOnce (siehe unten) verwendet CAS
  • CAS-Entwurfsmuster : Die Popularität "setzt voraus", dass CAS verwendet wird
  • CAS verstehen : Noch größere Popularität und einige Kommentare implizieren Anwendungen
  • Microsoft SharePoint verwendet CAS anscheinend vollständig (Entschuldigung, ich bin kein SP-Spezialist).

In jeder Situation, in der Sie einfach selbst die volle Kontrolle haben, Ihre eigene App und Ihren eigenen Code erstellen (oder erstellen lassen) und die vollständige Kontrolle über Ihr System haben, werden Sie CAS nicht allzu oft benötigen. Es ist eher etwas, das Sie in dem Moment verwenden würden, in dem Sie Code aus weniger vertrauenswürdigen Quellen ausführen können (was im Grunde alles ist, was Sie nicht vollständig kontrollieren können).

CAS gegen ClickOnce

Die Standard-CAS-Einstellungen beschränken die Funktionen von Code, der von einer Netzwerkfreigabe oder anderen nicht lokalen Quellen ausgeführt wird. Dies ist sinnvoll, aber die strengen Einschränkungen machen es schwierig, ein zentrales Repository für verteilte Anwendungen zu haben. .NET 2.0 führte ClickOnce ein, das die Sicherheit erhöhen sollte ( Diskussion hier ).

ClickOnce selbst verwendet CAS , um zu verhindern, dass das Installationsprogramm Systemfunktionen aufruft. Als solches glaube ich, dass es wohl die bekannteste Anwendung ist, die auf CAS basiert .

Der Punkt ist: Sie müssen CAS verstehen, um etwas erstellen zu können, das direkt von einer Freigabe ausgeführt werden kann, oder Sie ignorieren alles und verwenden ClickOnce.

Microsoft-Umfrage zu CAS

Im Jahr 2005 hat Microsoft eine Umfrage durchgeführt , um herauszufinden, warum CAS so unbeliebt ist, in der Hoffnung, es zu verbessern, um es besser anwendbar zu machen. Leider konnte ich die tatsächlichen Umfrageergebnisse nicht finden, abgesehen von diesem Beitrag, in dem detailliert beschrieben wird, warum CAS nicht ausreichend genutzt wird.

CAS in einer anderen Welt

Dieser Beitrag weist jedoch auf eine faszinierende Nische hin: CAS für eine andere Welt: Unix / Linux. Sie nennen es nicht CAS, sondern BitFrost . Wie ist das für eine reale Anwendung: das Projekt "Ein Laptop pro Kind" , bei dem BitFrost als Ersatz für das traditionelle Unix-Sicherheitsmodell verwendet wird.

Update: Abschnitt über CAS unter Unix / Linux als BitFrost und Abschnitt über die Umfrage.
Update: CAS vs ClickOnce-Abschnitt hinzugefügt
Update: Liste der Ressourcen mit CAS hinzugefügt (und Entschuldigung für all diese Updates in Folge!)

Abel
quelle
10

Technisch gesehen ist es sehr nützlich, da es eine sehr feinkörnige Berechtigungsspezifikation ermöglicht. Dies ist sowohl gut für Sie (da es theoretisch das Ausnutzen von Sicherheitslücken erheblich erschwert - selbst wenn ein Angreifer die volle Kontrolle über Ihre App erlangt, ist er immer noch in der CAS-Sandbox gesperrt) als auch für Ihren Kunden (da er genau sehen kann, was Sie tun) Anwendung kann ihre eigene Sicherheitsüberprüfung durchführen.

In der Praxis ist es meistens bedeutungslos. Ich denke, es ist zu komplex, zu wenig unterstützt von den verfügbaren Entwicklertools und die meisten Benutzer kümmern sich sowieso nicht darum.

Es gibt natürlich Ausnahmen (Regierungen und Kunden, die .net / CAS wirklich kennen) und ich würde gerne sagen, dass CAS absolut nützlich und obligatorisch ist, aber die Realität spricht eine klare Sprache.

Michael Stum
quelle
Also noch ein gutes Ideal, das den "Real Life" -Test nicht besteht, schade, dass wir alle es lernen müssen, um die Prüfungen zu bestehen ...
Ian Ringrose
Leider schon. Ich sehe das Hauptproblem darin, dass es einfach kein Werkzeug dafür gibt. Ich weiß einfach nicht, welche Berechtigungen ich benötige (zumindest nicht ihre internen Namen) und das Zeug ist ziemlich komplex. Idealerweise möchte ich meine App in einer "Sandbox" ausführen und dann einen Bericht "Ihre App benötigt diese Berechtigungen" erhalten, damit ich sie überprüfen und die CAS-Richtlinie daraus erstellen kann, aber eine solche Sandbox (AFAIK) existiert nicht.
Michael Stum
Dies ist eine großartige kurze Erklärung, und ich kann Wert darin sehen, es kann die zusätzlichen Kopfschmerzen wert sein.
Dellyjm
5

Hinweis für den Leser: siehe die beiden folgenden Kommentare; Es hört sich so an, als würde ich versehentlich die Definition von CAS aufblasen, um (fälschlicherweise) RBS einzuschließen. Ich werde die Antwort hier als Referenz belassen, aber die Unterscheidung beachten.


CAS hat zwei Probleme. das , was Sie sehen , die meisten werden in dieser Prüfung ist es, alle Nuancen für Code anderer Code aufrufen, die möglicherweise für die teilweise Vertrauen nützlich sein, aber die meiste Zeit ist es einfach ein Schmerz - und noch schlimmer: wenn Ihr Code hat volles Vertrauen ( was das meiste / zu viel tut) nichts davon wird tatsächlich ausgeführt (es wird komplett übersprungen).

Der nützliche Teil des CAS RBS ist Haupt Erlaubnis, das ist gebraucht; Natürlich sollte Ihre Benutzeroberfläche den Zugriff auf Funktionen überprüfen, aber Sie können (in Ihre Low-Down-Logik) Folgendes einfügen:

[PrincipalPermission(SecurityAction.Demand, Role = "ADMIN")]
static void DeleteOrder(int id) { ... }

Dies wird auch in vollem Vertrauen durchgesetzt; Sie können Ihren eigenen Principal (an den Benutzer gebunden) definieren, indem Sie ihn implementieren IPrincipal(siehe IsInRole()). Und da Principals in den meisten Umgebungen (Winforms, Webforms, MVC, WCF usw.) unterstützt werden, kann dies eine sehr flexible Möglichkeit bieten, die Sicherheit auf der Geschäftsebene zu überprüfen, ohne auf das spezifische Sicherheitsmodell verweisen zu müssen . Beachten Sie, dass die obige Prüfung in jeder Umgebung funktioniert .

Sie können dies möglicherweise auch verwenden, um Ihre Benutzeroberfläche zu steuern. Ich hatte einen Usenet-Beitrag, der Winforms-Steuerelemente basierend auf dem Prinzip aktiviert / deaktiviert hat (mithilfe von Laufzeit-Eigenschaften, um die Rolle pro Steuerelement anzugeben, ein bisschen wie ToolTipusw.) - ich kann es jedoch momentan nicht finden (bearbeiten: vielleicht dieses ).

Marc Gravell
quelle
2
AFAIK, PrincipalPermission fällt nicht unter CAS, sondern unter rollenbasierte Sicherheit. CAS legt die Vertrauensermittlung in die Hände des Site-Administrators. RBS legt die Vertrauensbestimmung in die Hände des Entwicklers. Riesiger grundlegender Unterschied.
G-Wiz
1
Ich glaube nicht, dass CAS das Sichern von Code basierend auf der Principal- oder Benutzeridentität beinhaltet. Tatsächlich wird es gemäß der Definition von CAS von Microsoft ( msdn.microsoft.com/en-us/library/930b76w0.aspx ) explizit als etwas beschrieben, das über das Erteilen von Berechtigungen basierend auf der Benutzeridentität hinausgeht , was als nützlich, aber bei weitem nicht ausreichend charakterisiert wird .
Cheeso
@gWiz, @Cheeso - OK; Danke für die Klarstellung. Sie sind also nur verwandte Konzepte. In diesem Fall könnte meine Antwort viel kürzer sein: "IMO, nicht so sehr" ;-p
Marc Gravell
2

Das Verständnis von Code Access Security ist, dass es für einen Anwendungsentwickler nur von geringem Nutzen ist, außer zu verstehen, wie es verwendet wird und auf welcher Berechtigungsstufe für APIs Sie möglicherweise aufrufen. Die einzige Ausnahme, die ich wirklich nützlich gefunden habe, ist ein CAS namens PrincipalPermission. Es erlaubt grundsätzlich nicht, dass bestimmter Code ausgeführt wird, wenn für den aktuellen Principal nicht die richtige Rolle definiert ist. Siehe diesen Beitrag darauf:

http://www.coderjournal.com/2008/03/securing-mvc-controller-actions/

Die Entwickler, die wirklich auf CAS achten müssen und wie es in ihrer Anwendung implementiert werden soll, sind die Entwickler der Framework- und Codebibliothek. Weil es bestimmte Vertrauensstufen gibt, die Sie benötigen, damit Ihre Anwendung funktioniert, insbesondere wenn Sie mit nicht verwalteten Ressourcen wie Dateien, Netzwerkströmen, seriellen Schnittstellen usw. arbeiten. Oder wenn Sie den Code für diese nicht verwaltete Ressource wie eine bestimmte erstellen Server oder jede Art von Zugriff auf Ihre Assemblys auf niedriger Ebene, für die Sie eine gewisse Codezugriffssicherheit erstellen möchten, damit Benutzer nicht etwas ausführen dürfen, das ihnen strikt verweigert wurde.

Es hilft nicht, dass Microsoft nicht wirklich großartige Arbeit geleistet hat, um zu erklären, wie CAS in der täglichen Anwendung verwendet werden sollte. Das ist also wirklich der Grund für die mangelnde Nutzung. CAS ist jedoch einer der vielen Gründe, warum .NET eine so sichere Sprache ist und viel weniger Probleme hat als seine Konkurrenten.

Nick Berardi
quelle
2
PrincipalPermission ist technisch gesehen keine Codezugriffssicherheit, sondern eine rollenbasierte Sicherheit. Der Unterschied besteht darin, dass sich die rollenbasierte Sicherheit auf den CurrentPrincipal als Beweis stützt, während sich die Codezugriffssicherheit auf die Sicherheitsrichtlinien und die starken Namen der Assemblys des Computers stützt. CurrentPrincipal kann vom Anrufer geändert werden, sodass das Vertrauen in den Händen des Entwicklers liegt. Die Sicherheitsrichtlinie wird vom lokalen Administrator festgelegt, sodass das Vertrauen in den Händen des Bedieners liegt.
G-Wiz
2

Ich war der Entwicklungsleiter eines Projekts zur Erlangung der JITC-Zertifizierung (US-Verteidigungsministerium) für eine .NET-basierte Lösung, und die CAS-Einstellungen wurden während der Zertifizierungstests sehr genau überprüft.

Wie die meisten anderen Zertifizierungsanforderungen konnte der Code nur die zum Arbeiten erforderlichen Berechtigungen verwenden und nicht mehr.

Wenn Sie Sicherheitszertifizierungen erhalten möchten, kann CAS auf jeden Fall wichtig sein.

Dana Holt
quelle
1

Eine Sache, die Sie wissen sollten, ist, dass die Codezugriffssicherheit als Manipulationsschutzmethode ziemlich kaputt ist. Sehen:

CAS-Manipulationsschutz ist defekt: Konsequenzen für die Softwarelizenzierung

...

Auf die Codezugriffssicherheit kann nicht mehr vertraut werden, um die Verwendung manipulierter Baugruppen in ausgelieferten Produkten zu verhindern. Dies bedeutet, dass es für einen Angreifer trivial ist, Ihre Lizenzierungsbaugruppe durch eine andere zu ersetzen, wenn Ihre Anwendung zur Durchführung von Lizenzprüfungen von Code Access Security abhängig ist, um freien Zugriff auf Ihre Anwendung zu erhalten.

...

Duncan Bayne
quelle
1
Hier geht es eher darum, die Anforderung für digital signierte "untergeordnete" Assemblys zu beseitigen, als um CAS. Sie konnten den Host immer zerlegen, die Signaturprüfungen entfernen und dann wieder zusammenbauen. Wie Sie dies mit wenigen Mausklicks tun können ... +1, um darauf hinzuweisen, dass CAS nur so gut ist wie der Schutz, den Sie auf dem Host haben.
Ian Ringrose
1

Obwohl ich es nie benutzt habe, war mein Verständnis von CAS, dass es auch verwendet werden kann, um die objektorientierte Konstruktionsmechanik zu erweitern. Angenommen, Sie entwickeln ein umfangreiches Datenzugriffspaket für eine Bank, die Datenbankzugriff und Caching implementieren muss. Obwohl sie angesichts der hypothetischen Größe des Projekts Teil desselben Bereitstellungspakets sind, sollte die Logik in separaten Assemblys implementiert werden, da es sich um ausreichend unterschiedliche Problemgruppen handelt, die von unterschiedlichen externen Kräften abhängen (Datenbankinfrastruktur vs. Verbrauchernutzung).

Der Caching-Code muss jedoch möglicherweise auf einige vertrauliche Klassen oder Methoden in der Datenzugriffsassembly zugreifen, auf die Benutzer des Gesamtpakets keinen Zugriff haben sollten. Daher können diese Datenzugriffsklassen und -methoden nicht einfach sein public. Geschützte Methoden in der Datenzugriffsassembly mit Unterklassen in der Caching-Assembly können einige Fälle umgehen, aber häufig handelt es sich um einen Vererbungsmissbrauch. Es könnte einfach eleganter sein, publicLinkDemands für Anrufer zu hinterlassen, um eine benutzerdefinierte Berechtigung (z. B. DataPackagePermisson) zu erhalten, die Administratoren nur der Caching-Assembly erteilen würden.

G-Wiz
quelle
0

Wir haben CAS für unsere Anwendungen verwendet, was nicht wirklich zu schwierig war, da wir nur versucht hatten, die nicht autorisierte Codeausführung zu stoppen. Bei der Verwendung unserer Software von der lokalen Netzwerkfreigabe sind einmal Probleme aufgetreten, aber eine Cas-Richtlinie hat das Problem behoben.

  1. Wir haben alle unsere Baugruppen mit einem starken Namen gesichert.
  2. Wir haben eine cas-Richtlinie für alle Assemblys mit unserem starken Namen erstellt und zugelassen, dass mit unserem starken Namen signierter Code vom lokalen Netzwerk und lokal platzierten Code ausgeht.
  3. Assemblies, die aus einem lokalen Netzwerk geladen werden und lokalen Dateizugriff benötigen (Komponente zum Brennen von Daten-CDs), werden benötigt, um das Link-Demand-Attribut für alle öffentlichen Klassen abzurufen.

Seit dem Update von .NET3.5 gab es keine Probleme mehr, da Code im lokalen Netzwerk jetzt wie lokaler Code behandelt wird.

Oliver Friedrich
quelle