コード アクセス セキュリティCode Access Security


コード アクセス セキュリティと部分的に信頼できるコードCode Access Security and Partially Trusted Code

.NET Framework には、コード アクセス セキュリティ (CAS) と呼ばれる、同一アプリケーションで実行される各種コードにさまざまな信頼レベルを強制的に適用するメカニズムが備わっています。The .NET Framework provides a mechanism for the enforcement of varying levels of trust on different code running in the same application called Code Access Security (CAS). .NET Framework のコード アクセス セキュリティは、コードの実行元や他の ID 情報に基づいてセキュリティ境界を適用するメカニズムとして使用しないでください。Code Access Security in .NET Framework should not be used as a mechanism for enforcing security boundaries based on code origination or other identity aspects. 現在、部分的に信頼されるコード (特に実行元が不明なコード) では、コード アクセス セキュリティと透過的セキュリティ コードがセキュリティ境界としてサポートされないように、ガイダンスを更新しています。We are updating our guidance to reflect that Code Access Security and Security-Transparent Code will not be supported as a security boundary with partially trusted code, especially code of unknown origin. 発生元の不明なコードの読み込みと実行に関しては、他のセキュリティ対策を適切に導入することなく行わないようにしてください。We advise against loading and executing code of unknown origins without putting alternative security measures in place.

このポリシーは .NET Framework のすべてのバージョンに適用されますが、Silverlight に含まれる .NET Framework には適用されません。This policy applies to all versions of .NET Framework, but does not apply to the .NET Framework included in Silverlight.

複雑にリンクされた現在のコンピューター システムには、多種多様な、多くの場合は不明なソースからコードが送信されてきます。Today's highly connected computer systems are frequently exposed to code originating from various, possibly unknown sources. コードは、電子メールに添付したり、ドキュメントに含めたり、インターネット経由でダウンロードしたりすることができます。Code can be attached to email, contained in documents, or downloaded over the Internet. ウイルスやワームのような悪意のあるコードによってコンピューター上のデータを破損または破壊され、時間的にも金銭的にも直接の被害を受けた経験のあるユーザーは少なくありません。Unfortunately, many computer users have experienced firsthand the effects of malicious mobile code, including viruses and worms, which can damage or destroy data and cost time and money.

ほとんどのセキュリティ機構では、ログオン資格情報 (通常はパスワード) に基づいてユーザーに権限を与え、そのユーザーがアクセスできるリソース (多くの場合はディレクトリとファイル) を制限しています。Most common security mechanisms give rights to users based on their logon credentials (usually a password) and restrict resources (often directories and files) that the user is allowed to access. しかし、この方法では対処できないさまざまな問題が存在します。たとえば、ユーザーはさまざまなソースからコードを入手しますが、中には信頼できない入手先もあります。コードに、悪意のあるコードからねらわれやすいバグがあったり、脆弱性が潜んでいる可能性もあります。また、コードがユーザーの予期しない動作をする場合もあります。However, this approach fails to address several issues: users obtain code from many sources, some of which might be unreliable; code can contain bugs or vulnerabilities that enable it to be exploited by malicious code; and code sometimes does things that the user does not know it will do. これらの結果、ユーザーが慎重で信頼できるとしても、実行したソフトウェアが悪意のあるソフトウェアやエラーを含むソフトウェアであった場合は、コンピューター システムが損害を受けたり、機密データが漏洩したりする可能性があります。As a result, computer systems can be damaged and private data can be leaked when cautious and trustworthy users run malicious or error-filled software. 多くのオペレーティング システムのセキュリティ機構では、Web ページ上のスクリプトなどの場合を除き、コードを実行するためには、その細部にわたるまで完全に信頼されていることが要求されます。Most operating system security mechanisms require that every piece of code must be completely trusted in order to run, except perhaps for scripts on a Web page. そのため、信頼関係のないコンピューター システム間でも、一方のシステムから送信されたコードをもう一方のシステムで安全に実行できるようにするための、幅広く適用できるセキュリティ機構が必要になります。Therefore, there is still a need for a widely applicable security mechanism that allows code originating from one computer system to execute with protection on another system, even when there is no trust relationship between the systems.

コンピューター システムを悪意のあるコードから簡単に保護できるようにしたり、発生元の不明なコードを安全に実行できるようにしたり、信頼されているコードを故意または過失によって露呈したセキュリティの脆弱性から保護できるようにしたりするために、.NET Framework はコード アクセス セキュリティというセキュリティ機構を提供しています。The .NET Framework provides a security mechanism called code access security to help protect computer systems from malicious mobile code, to allow code from unknown origins to run with protection, and to help prevent trusted code from intentionally or accidentally compromising security. コード アクセス セキュリティにより、コードの発生元や、そのコードの身元を示すその他の基準に基づいて、コードをさまざまなレベルで信頼できます。Code access security enables code to be trusted to varying degrees depending on where the code originates and on other aspects of the code's identity. また、コードに対してさまざまな信頼レベルを強制的に適用することにより、実行するために完全に信頼されていなければならないコードの数は少なくなります。Code access security also enforces the varying levels of trust on code, which minimizes the amount of code that must be fully trusted in order to run. コード アクセス セキュリティを使用することで、作成したコードが悪意のあるコードやバグのあるコードによって誤用される可能性も低くなります。Using code access security can reduce the likelihood that your code will be misused by malicious or error-filled code. コードによって実行できる一連の操作を指定できるため、開発者の責任を軽減できます。It can reduce your liability, because you can specify the set of operations your code should be allowed to perform. コード アクセス セキュリティは、コードにセキュリティの脆弱性があった場合に、それによって被る可能性のある損害を最小限に抑えるためにも役立ちます。Code access security can also help minimize the damage that can result from security vulnerabilities in your code.


.NET Framework 4 のコードアクセスセキュリティに大きな変更が加えられました。Major changes have been made to code access security in the .NET Framework 4. 最も注目すべき変更点はセキュリティの透過性ですが、コードアクセスセキュリティに影響する重要な変更も他にもあります。The most notable change has been security transparency, but there are also other significant changes that affect code access security. これらの変更の詳細については、「セキュリティの変更」を参照してください。For information about these changes, see Security Changes.

コード アクセス セキュリティは、主にライブラリ コードと部分的に信頼されたアプリケーションに影響します。Code access security primarily affects library code and partially trusted applications. ライブラリ開発者は、部分的に信頼されたアプリケーションによる認証されていないアクセスからコードを保護する必要があります。Library developers must protect their code from unauthorized access from partially trusted applications. 部分的に信頼されたアプリケーションは、インターネットなどの外部リソースから読み込まれるアプリケーションです。Partially trusted applications are applications that are loaded from external sources such as the Internet. デスクトップまたはローカル イントラネットにインストールされているアプリケーションは、完全に信頼されたアプリケーションとして実行されます。Applications that are installed on your desktop or on the local intranet run in full trust. 完全に信頼されたアプリケーションは、完全に信頼されているため、セキュリティ透過的としてマークされている場合を除き、コードアクセスセキュリティの影響を受けません。Full-trust applications are not affected by code access security unless they are marked as security-transparent, because they are fully trusted. 完全に信頼されたアプリケーションの唯一の制限事項は、SecurityTransparentAttribute 属性でマークされているアプリケーションは SecurityCriticalAttribute 属性でマークされているコードを呼び出すことができない点です。The only limitation for full-trust applications is that applications that are marked with the SecurityTransparentAttribute attribute cannot call code that is marked with the SecurityCriticalAttribute attribute. 部分的に信頼されたアプリケーションは、コード アクセス セキュリティを適用できるように、サンドボックス (Internet Explorer など) で実行する必要があります。Partially trusted applications must be run in a sandbox (for example, in Internet Explorer) so that code access security can be applied. インターネットからアプリケーションをダウンロードし、デスクトップから実行しようとすると、NotSupportedException が返されます。このとき、"ネットワーク上の場所からアセンブリの読み込みを試みました。以前のバージョンの .NET Framework では、これによりアセンブリがサンドボックス化されました。If you download an application from the Internet and try to run it from your desktop, you will get a NotSupportedException with the message: "An attempt was made to load an assembly from a network location which would have caused the assembly to be sandboxed in previous versions of the .NET Framework. このリリースの .NET Framework では CAS ポリシーが既定で有効ではないため、この読み込みは危険な場合があります。" というメッセージが表示されます。This release of the .NET Framework does not enable CAS policy by default, so this load may be dangerous." アプリケーションが信頼できることが確実な場合は、 <loadFromRemoteSources > 要素を使用して、アプリケーションを完全信頼として実行できるようにすることができます。If you are sure that the application can be trusted, you can enable it to be run as full trust by using the <loadFromRemoteSources> element. サンドボックスでアプリケーションを実行する方法の詳細については、「方法: サンドボックスで部分信頼コードを実行する」を参照してください。For information about running an application in a sandbox, see How to: Run Partially Trusted Code in a Sandbox.

共通言語ランタイムに対応したマネージド コードすべては、単一コード アクセス セキュリティ呼び出しを行わない場合でも、コード アクセス セキュリティの利点を享受することになります。All managed code that targets the common language runtime receives the benefits of code access security, even if that code does not make a single code access security call. 詳細については、「 Code Access Security Basics」を参照してください。For more information, see Code Access Security Basics.

コード アクセス セキュリティの主な機能Key Functions of Code Access Security

コード アクセス セキュリティにより、コードがアクセスする対象を保護されたリソースと保護された操作に制限できます。Code access security helps limit the access that code has to protected resources and operations. .NET Framework では、コード アクセス セキュリティは次の機能を果たします。In the .NET Framework, code access security performs the following functions:

  • 各種システム リソースにアクセスするための権限や権限セットを定義する。Defines permissions and permission sets that represent the right to access various system resources.

  • 呼び出し元が特定の権限を所有していることをコードから要求できるようにする。Enables code to demand that its callers have specific permissions.

  • 呼び出し元にデジタル署名があることをコード自身が要求できるようにします。これにより、特定の組織またはサイトからの呼び出し元だけが、保護されたコードを呼び出すことができます。Enables code to demand that its callers possess a digital signature, thus allowing only callers from a particular organization or site to call the protected code.

  • 呼び出し履歴上で、各呼び出し元に付与された権限を、その呼び出し元に求められる権限と比較することにより、コードに対する制限を実行時に強制する。Enforces restrictions on code at run time by comparing the granted permissions of every caller on the call stack to the permissions that callers must have.

コール スタック ウォークの実行Walking the Call Stack

コードがリソースにアクセスしたり、操作を実行したりすることを許可されているかどうかを判断するために、ランタイムのセキュリティ システムはコール スタック ウォークを行い、コール スタック内の各呼び出し元に与えられているアクセス許可と、確認要求されているアクセス許可とを比較します。To determine whether code is authorized to access a resource or perform an operation, the runtime's security system walks the call stack, comparing the granted permissions of each caller to the permission being demanded. コール スタックに、確認要求されたアクセス許可を持っていない呼び出し元があった場合は、セキュリティ例外がスローされ、アクセスは拒否されます。If any caller in the call stack does not have the demanded permission, a security exception is thrown and access is refused. スタック ウォークは、信頼レベルの低いコードが信頼レベルの高いコードを呼び出して利用し、承認されていないアクションを実行しようとする攻撃を防止できるようにするために実行します。The stack walk is designed to help prevent luring attacks, in which less-trusted code calls highly trusted code and uses it to perform unauthorized actions. コードの呼び出し元すべてに対して実行時にアクセス許可を確認要求することは、確かにパフォーマンスに影響しますが、信頼レベルの低いコードによる攻撃からコードを保護できるようにするためには必要です。Demanding permissions of all callers at run time affects performance, but it is essential to help protect code from luring attacks by less-trusted code. パフォーマンスを最適化するためにコードが実行するスタック ウォークを減らすこともできますが、その場合は、セキュリティの脆弱性を露呈しないように常に注意する必要があります。To optimize performance, you can have your code perform fewer stack walks; however, you must be sure that you do not expose a security weakness whenever you do this.

アセンブリ A4 のメソッドが、その呼び出し元にアクセス許可 P が与えられていることを確認要求する場合に、結果として行われるスタック ウォークを次の図に示します。The following illustration shows the stack walk that results when a method in Assembly A4 demands that its callers have permission P.

コードアクセスセキュリティCode access security
セキュリティ スタック ウォークSecurity stack walk

タイトルTitle 説明Description
コード アクセス セキュリティの基礎Code Access Security Basics コード アクセス セキュリティとその最も一般的な使用方法について説明します。Describes code access security and its most common uses.
透過的セキュリティコード、レベル2Security-Transparent Code, Level 2 .NET Framework 4 のセキュリティ透過性モデルについて説明します。Describes the security transparency model in the .NET Framework 4.
部分信頼コードからのライブラリの使用Using Libraries from Partially Trusted Code ライブラリを有効にしてアンマネージ コードと共に使用できるようにする方法と、アンマネージ コードからライブラリを使用する方法について説明します。Describes how to enable libraries for use with unmanaged code and how to use libraries from unmanaged code.
セキュリティの基本概念Key Security Concepts .NET Framework セキュリティ システムで使用されるさまざまな重要用語と概念について、概要を示します。Provides an overview of many of the key terms and concepts used in the .NET Framework security system.
ロール ベースのセキュリティRole-Based Security ロールに基づいて、セキュリティを組み込む方法について説明します。Describes how to incorporate security based on roles.
暗号サービスCryptographic Services アプリケーションに暗号を組み込む方法について説明します。Describes how to incorporate cryptography into your applications.