2013-07-12 16 views
12

Hat jemand Erfahrung mit F # -Code in Teilvertrauenszenarien? Wie in, Erstellen von Baugruppen mit [<AllowPartiallyTrustedCallers>]?Wie effektiv F # Assemblys für partielles Vertrauen zu erstellen?

Ich arbeite an ein paar Projekten, die wir in teilweise Vertrauen ausführen müssen, und wir haben versucht, Level 2 Security Rules (http://msdn.microsoft.com/en-us/library/dd233102.aspx) zu verwenden. In der Praxis für unsere in sich geschlossenen Versammlungen ist das einfach - setzen Sie einfach ein Attribut; aber manchmal verweisen unsere Assemblies auf Drittanbieter-DLLs, die nicht kommentiert sind und "SecurityCritical" angenommen haben. Hier wird es "interessant".

Nachdem ich in den letzten paar Tagen damit gearbeitet habe, scheint es ein ernstes Problem mit F # zu geben. Die .NET-Sicherheitsrichtlinie erwartet, dass Sie Typen/Methoden mit annotieren, wenn sie "SecurityCritical" -Code referenzieren oder aufrufen, was der größte Teil des Codes in NuGet ist, da dies der Standardwert ist. In F # funktioniert das jetzt so lange, bis Sie mit den Schließungen beginnen. Sie können nicht tun:

namespace Foo 

open System.Security 

[<assembly: AllowPartiallyTrustedCallers>] 
[<assembly: SecurityRules(SecurityRuleSet.Level2)>] 
do() 

[<SecurityCritical>] 
module C = 
    let get() = [ 1 .. 10 ] 

[<SecuritySafeCritical>] 
module M = 

    let foo() = 
     seq { 
      for i in 1 .. 10 do 
       yield! 
        C.get() 
        |> Seq.filter (fun x -> x % 2 = 0) 
     } 

Diese Baugruppe versagt SecAnnotate.exe Kontrollen passieren, weil F # -Compiler des Verschlusses an einem separaten Typ hebt, die nun mit [<SecuritySafeCritical>] kommentierten nicht ist, standardmäßig transparent, aber Referenzen einige kritische Code, der eine ist Error.

Es klingt wie eine kleine Einschränkung, aber es kostet mich viele Stunden Code zu ändern, um Schließungen zu vermeiden und SecAnnotate Einschränkungen zu erfüllen. Vielleicht könnte F # Sicherheitsattribute an von ihm erstellte Schließungstypen propagieren? Gibt es einen anderen einfachen Weg, den ich vermisse?

Antwort

6

Sie können SecurityCritical gelten als Montageebene Attribut:

[<assembly: SecurityCritical>] 

Ein besserer Ansatz aber, Sie gehen davon nur eine „plain“ F # Montage Schreiben - das heißt, eine, die nichts zu tun ist die erfordert besondere Sicherheits (zB P/Invoke) - wäre zu ersetzen:

[<assembly: AllowPartiallyTrustedCallers>] 

mit

[<assembly: SecurityTransparent>] 

Die MSDN-Seite für SecurityTransparentAttribute sagt:

Gibt an, dass eine Versammlung nicht eine Erhöhung von Berechtigungen führen kann.

Auf transparente Assemblys kann von teilweise vertrauenswürdigem Code zugegriffen werden und der Zugriff auf geschützte Ressourcen oder Funktionen kann nicht offengelegt werden. Der Code in der Assembly darf keine Codezugriffssicherheitsprüfungen unterdrücken und darf keine Rechteerweiterungen verursachen.

Die F # 3.0-Version von FSharp.Core verwendet dieses Attribut aus dem gleichen Grund auch.

Links zu weiteren Informationen:

+0

Danke für die Links!Leider versuche ich in meinem Szenario, teilweise vertrauenswürdigen Code zu aktivieren, um Drittanbieter-'SecurityCriticalCode' (unnotierter Code) aufzurufen, so dass ich * APTCA +' [] 'zumindest irgendwo brauche. – t0yv0

+0

Möglicherweise können Sie '[]' verwenden und dann alle Methoden/Funktionen markieren, die mit '[]' in die Assembly eines Drittherstellers geladen werden. Ich denke, das wird in den meisten Situationen mit teilweisem Vertrauen funktionieren, außer bei Silverlight. –

+0

Sobald Sie eine Assembly als SecurityTransparent markieren, können Sie SecuritySafeCritical nicht mehr verwenden - versuchen Sie es mit SecAnnotate.exe, beschwert es sich. Daher muss die Assembly APTCA sein. Aber danke trotzdem, ich denke, ich bin auf dem richtigen Weg, werde einfach mit den unnötigen Komplikationen leben müssen, die F # dafür macht. – t0yv0