12

部分信頼シナリオで F# コードを使用した経験のある人はいますか? [<AllowPartiallyTrustedCallers>]同様に、 ?を使用してアセンブリを作成します。

私は、部分信頼で実行できるようにする必要があるいくつかのプロジェクトに取り組んでおり、レベル 2 セキュリティ ルール ( http://msdn.microsoft.com/en-us/library/dd233102. aspx )。自己完結型アセンブリの実際には、これは簡単です。属性を入力するだけです。ただし、アセンブリが、注釈が付けられておらず、「SecurityCritical」と想定されていないサードパーティの DLL を参照する場合があります。ここが「面白い」ところです。

過去数日間使用した結果、F# には深刻な問題があるようです。.NET セキュリティ ポリシーでは、"SecurityCritical" コードを参照または呼び出す場合に型/メソッドに注釈を付けることを期待して[<SecuritySafeCritical>]います。これは、たまたま NuGet にあるほとんどのコードであり、これが既定値であるためです。これで、F# では、クロージャーを使い始めるまで問題なく動作します。次のことはできません。

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)
        }

このアセンブリはSecAnnotate.exeチェックに合格しません。これは、F# コンパイラがクロージャを別の型にリフトするためです。これは、現在は で注釈が付けられていません[<SecuritySafeCritical>]。デフォルトは透明ですが、エラーであるいくつかの重要なコードを参照しています。

小さな制限のように聞こえますが、コードを変更してクロージャーを回避し、SecAnnotate の制約を満たすには、何時間もかかりました。たぶん、F# はセキュリティ属性をそれが作成するクロージャー型に伝播できるでしょうか? 私が見逃している別の簡単な方法はありますか?

4

1 に答える 1

6

SecurityCriticalアセンブリ レベルの属性として適用できます。

[<assembly: SecurityCritical>]

ただし、"プレーンな" F# アセンブリ (つまり、特別なセキュリティ (P/Invoke など) を必要とするもの) を何も実行していないアセンブリを作成していると仮定すると、より良いアプローチは次のように置き換えられます。

[<assembly: AllowPartiallyTrustedCallers>]

[<assembly: SecurityTransparent>]

SecurityTransparentAttributeの MSDN ページには、次のように記載されています。

アセンブリが特権の昇格を引き起こすことができないことを指定します。

透過的なアセンブリは、部分的に信頼されたコードからアクセスでき、保護されたリソースや機能へのアクセスを公開することはできません。アセンブリ内のコードは、コード アクセス セキュリティ チェックを抑制することは許可されておらず、特権の昇格を引き起こすことはできません。

F# 3.0 バージョンの FSharp.Core も同じ理由でこの属性を使用します。

追加情報へのリンク:

于 2013-07-12T14:45:12.440 に答える