1. ホーム
  2. security

[解決済み] セキュリティ透過的な方法Xによるセキュリティクリティカルな方法Yへのアクセスの試みは失敗しました。

2022-02-12 14:22:48

質問内容

サーバーアプリケーションのバージョンがかなり安定しており、数十の顧客に1年近く配備されています。

最近、ある新しい顧客がアプリケーションをセットアップしたところ、次のようなエラーが発生しました。

System.MethodAccessException: セキュリティ透過型メソッドによる試行 [SomeMethod] からセキュリティ上重要なメソッド [SomeOtherMethod] にアクセスする。 が失敗しました。

SomeMethod と SomeOtherMethod はどちらも私が書いたアセンブリのメソッドで、.NET 4 に対してビルドされており、Windows サービス内で動作しています。違いがあるとすれば、SomeOtherMethod は .NET 2.0 に対して構築されたサード パーティ製アセンブリ (EntLib 4.1) の型を参照していることです。EntLib 4.1 のコードを見ると、SecurityTransparent 属性と APTC 属性の両方が使用されていますが、他のクライアントでは問題が発生したことがありません。

これらのアセンブリは、.NET 2.0 CLRからアップグレードされましたが、かなり前のことです。このコードは他の顧客でも問題なく実行されており、私はAPTC属性もSecurityCritical属性もどこにも明示的に使用していません。

このことから、設定の問題か、あるいは.NET Frameworkのパッチの問題ではないかという結論に至ったのです。この破壊的な変化を引き起こすような.NETのパッチがリリースされたことはあるのでしょうか?デフォルトではオフになっているが、顧客が有効にしている可能性のある、この種のチェックを強制する構成設定がどこかにあるのでしょうか?

最後にもう一点。私のサービスでは、SSRS RDLCを利用してPDFを生成しています。.NET 4のいくつかの変更により、私は以下の構成を介してレガシーセキュリティポリシーを使用するようにサービスを強制する必要があります。

  <runtime>
    <NetFx40_LegacySecurityPolicy enabled="true" />
  </runtime>

なぜこのようなことをする必要があるのか、詳しくはこのstackoverflowの投稿を参照してください。 .NET 4.0での非常に高いメモリ使用量

重要なのは、他のお客さんでも同じようにやっていることです。この1社だけが問題を抱えているのです。

解決方法は?

エンタープライズライブラリを担当するMicrosoft Patterns And Practicesチームが採用しているパターンやプラクティスは、かなり嘆かわしいものです。 まあ、例外は正確で、quot;I'll definitely check security"で装飾されたメソッドを、quot;Meh, I won't check security so don't bother burning the cpu cycles to check it"で装飾されたコードから呼ぶことはできないんだ。 これは、Javaで使われている例外指定と同じくらいスケールの大きなものです。 CASは非常に便利ですが、例外を診断するのは大きな頭痛の種で、しばしば自分が所有していない、修正できないコードを含んでいます。 .NET 4で非推奨となった大きな理由です。

編集部終了。 この問題を解決するには、なぜCASが適用されるのかを知る必要があります。 最も単純な説明は、サービスが完全に信頼できる状態で実行されていないことです。 の最も簡単な説明は その は、クライアントがローカルハードディスクにサービスをインストールしなかったことです。 あるいは、一般的にローカルアセンブリでもdon't-trust-itモードでコードを実行している場合、非常に偏執的な管理者はそれを好む可能性があります。 これはCaspol.exeで設定する必要があります。このツールのコマンドラインオプションはCASと同じくらい謎めいています。 信頼されない場所の説明でポットシュートすると、クライアントは次のようにCaspolを実行する必要があります。 ブログ記事 . または、単にサービスをローカルにデプロイするだけで、デフォルトの "I trust thee" が適用されます。

OPが発見した本当の理由を編集しています。 代替データストリーム 信頼できないインターネットやネットワークからファイルをダウンロードすると、そのファイルに追加されます。 ファイルは、quot;Zone.Identifier"という名前のストリームを取得し、quot;ZoneId"の値によって、それがどこから来たのか追跡します。 この値によって、保存場所から得られる信頼が上書きされます。 通常、インターネットゾーンに格納します。 エクスプローラーでファイルを右クリックし、「"Unblock"」をクリックして、そのストリームを削除してください。 そのファイルを信頼できることを確認した後に :)