2015-01-04 3 views
6

C#の匿名メソッド(Action<>Func<>)を使用したり渡したりするときに考慮する必要のあるセキュリティ上の意味は何ですか?匿名メソッド(Action <>、Func <>)をパラメータとして受け入れることに対するセキュリティの影響は何ですか?

Action<>/Func<>を受け入れる方法は、外部コードをプログラムに注入する可能性があるようです。記録のために、私は、注入されたメソッドや関数は、任意のメモリアクセスの意味で本質的に安全でないことを行うことができないことを理解していますが、私はそれが呼び出しコードを呼び出すことができると思います。任意の.Netフレームワーク機能、データの破損、またはアプリケーションの誤動作の原因となることがあります。

この仮説は間違っていますか?

そうでない場合は、これらをロックするために何を行う必要がありますか?さらに、メソッドまたは関数に渡され、期待される形式であることを確認したり、特定の型および名前空間へのアクセスを制限したりするために、 /Func<>を検証する方法はありますか?

また、適切な用語を使用していないと、私はまだ学んでいます。

+0

また、(仮想メソッドと抽象メソッドをオーバーライドして)継承とインターフェイスの実装によって悪質なコードを挿入できることにも注意してください。しかし、SLaksの答えはこれらのケースにも適用されます。例えば、 'System.String'クラスは、密封されることによって、このクラスから自分自身を保護します。 –

+0

どのようなシナリオですか?信頼できるコードと信頼されていないコードを同じプロセスでCASで区切っていますか? – usr

+0

@usr私は本当に懸念がある*シナリオがあるかどうか尋ねています。ここでは、これらのメソッドを使用して、プロパティゲッターやセッターを名前付きメソッドに渡す方法をいくつか見てきました。しかし、私が知る限り、指定されたメソッドが、渡されたAction <>またはFunc <>が予期された方法で動作することを保証したり、保証したりする方法がないため、これは間違っています。名前付きメソッドが本当に気にしない限り、これらをパラメーターとして使用するのは悪い習慣ですか?例えば。 Assert.ThrowsException ()。 –

答えて

9

>/FUNC <アクション<を受け入れる方法>完全に間違っているプログラム

に注入される外国人のコードの潜在的な方法であると思われます。関数を呼び出してデリゲートを渡す人は、定義上、プログラム内ですでにコードを実行しています。
デリゲートを渡しているコードは、必要なものを何でも実行できます。同じAppDomain内にセキュリティ境界を設定することはできません。 (.Netの以前のバージョンでは、これを実行しようとしたコードアクセスセキュリティがありましたが、良い考えではありませんでした)

しかし、予期しない再入可能性があり、スレッドセーフなコードで問題を引き起こす可能性があります。

+0

私は理解していると思います。実行可能なものはコード自体を呼び出すだけで、そのようなコードで推定される悪意のあるコードによって得られるものは何もないと言っていますか?故意に起こった再入国があるとしましょう。それにはセキュリティ上のリスクがありますか、あるいはプログラムを不安定にする可能性がありますか?私が無限ループを通過すると、それは私が想像するような問題になる可能性があります。その場合は、リスクを軽減するための推奨設計がありますか?これらを控えめに、内部的に、公的に使用するなど、再入場と不安定性について完全にテストされていますか? –

+0

@NickBauer:あなたが実際のセキュリティ境界を持っていなければ、話すセキュリティはありません。 http://blogs.msdn.com/b/oldnewthing/archive/2014/05/29/10529251.aspxおよびhttp://blogs.msdn.com/b/oldnewthing/archive/2007/08/07/4268706を参照してください。 .aspx#4282521 – SLaks

+0

さて、あなたと一緒にいます。しかし、私はあなたがそれを言及して以来、あなたが再入国に関して何を意味しているかについて、まだ興味があります。編集:つまり、再入場は問題ではありませんが、このように再入国するための窓を許可すると問題になる可能性があります。 –

2

シナリオ戻る

CASポリシーがまだ使用されていた(例えばメディアの信頼ASP.NET)安全、信頼できないコードを呼び出すことができませんでしたコードの信頼された部分がある場合は、私が本当に求めていますスタックアサートが存在するとき。たとえば、

new SecurityPermission(Unrestricted).Assert() 

の場合、セキュリティチェックスタックウォークはこの時点で停止します。これにより、信頼できないコードが検出されなくなる可能性があります。 See the docs for Assert.

シナリオは難しいので、私はここでやや漠然としています。それは時代遅れです。


同じプロセス内に信頼境界がない場合、呼び出し側はコードをどこかに注入しなくてもすべての権限を既に持っています。その必要はありません。

関連する問題