Java Development Kit (JDK)でのアクセス権

アクセス権は、システム・リソースへのアクセスを表します。アプレット(またはセキュリティ・マネージャとともに実行するアプリケーション)が、リソースへのアクセスを許可されるためには、アクセスを試みるコードに対し、該当するアクセス権を明示的に与える必要があります。

一般に、アクセス権には名前(「ターゲット名」とも呼ばれる)があり、場合によっては、カンマで区切られた1つ以上のアクションのリストを持つこともあります。たとえば、次のコードでは、/tmpディレクトリのabcという名前のファイルへの読取りアクセスを表すFilePermissionオブジェクトを作成します。

perm = new java.io.FilePermission("/tmp/abc", "read");

この場合、ターゲット名が「/tmp/abc」で、アクション文字列が「read」になります。

重要: 前述の文によって、アクセス権オブジェクトが作成されます。アクセス権オブジェクトは、システム・リソースを表しますが、システム・リソースへのアクセスを許可することはありません。アクセス権オブジェクトは、実効性のあるポリシーに基づいて作成され、コードへ割り当てられ(「付与」され)ます。アクセス権オブジェクトが、あるコードに割り当てられると、そのコードはアクセス権オブジェクトで指定されたシステム・リソースへ、指定された方法でアクセスするアクセス権が付与されます。現在のセキュリティ・マネージャが、アクセス判断を行う際に、アクセス権オブジェクトを作成することもあります。この場合、ターゲットのアクセス権オブジェクトは、要求されたアクセスに基づいて作成されます。さらに、ターゲットのアクセス権オブジェクトは、要求を行うコードに付与され、かつ要求を行うコードが保持する、アクセス権オブジェクトに照らしてチェックされます。

Javaアプリケーション環境のポリシーは、Policyオブジェクトにより表現されます。"JavaPolicy" Policy実装では、1つまたは複数のポリシー構成ファイルからポリシーを指定できます。ポリシー・ファイルは、指定したコード・ソースのコードにどのアクセス権を許可するかを指定します。たとえば、/home/sysadminディレクトリのコードに対して/tmp/abcファイルへの読取りアクセスを許可する場合、ポリシー・ファイルのエントリは次のようになります。

grant codeBase "file:/home/sysadmin/" {
    permission java.io.FilePermission "/tmp/abc", "read";
};

ポリシー・ファイルの場所、およびポリシー・ファイルにより付与するアクセス権の詳細については、「デフォルトのPolicyの実装とポリシー・ファイルの構文」を参照してください。Policy Toolを使用してアクセス権を指定する方法については、Policy Toolのドキュメント(Solaris、LinuxまたはMac OS X版)(Windows版)を参照してください。Policy Toolを使うと、入力やポリシー・ファイルの構文規則を記憶する手間を減らすことができます。

技術的な観点から言うと、リソースへのアクセスを試みる場合は、実行スレッド上のコードに「特権設定」のマークが付けられていないかぎり、実行スレッドが利用するコードはすべて、そのリソースへのアクセス権を保持する必要があります。特権の設定されたコードの詳細については、「特権ブロックのためのAPI」を参照してください。

このドキュメントでは、JDKに組込みのアクセス権型を示すとともに、それぞれのアクセス権を与えた場合のリスクについて説明します。また、呼出しにアクセス権を必要とするメソッドと、それぞれのメソッドが必要とするアクセス権の一覧も示します。

次の項目について説明します。

アクセス権や、スーパー・クラスjava.security.Permissionおよびjava.security.BasicPermissionについての詳細と、アクセス権オブジェクトの作成およびアクセス権の付与の例については、セキュリティ・アーキテクチャの仕様を参照してください。


アクセス権の説明とリスク

ここでは、JDKに組込みのアクセス権型の一覧表を示すとともに、それぞれのアクセス権を与えた場合のリスクについて説明します。

AWTPermission

java.awt.AWTPermissionは、AWTのアクセス権を表します。

AWTPermissionに指定できるターゲット名と、それで与えられるアクセス権により可能になる操作、および、そのアクセス権をコードに与えることにより生じるリスクを次の表に示します。

java.awt.AWTPermission
のターゲット名
アクセス権により許可される操作 このアクセス権を許可した場合のリスク
accessClipboard AWTクリップボードとの間での情報の送信と取得 不正なコードにより機密情報が共有されるようになる可能性があります。
accessEventQueue AWTイベント・キューへのアクセス 悪意のあるコードが、AWTのイベント・キューを取得したあと、システムのイベントを覗いたり削除したりする可能性があるほか、アプリケーションやアプレットが不正な振る舞いをするような偽のイベントをポストする可能性があります。
accessSystemTray AWT SystemTrayインスタンスへのアクセス 悪意のあるコードによりシステム・トレイにトレイ・アイコンが追加される可能性があります。まず、ファイアウォールやウィルス対策などの既知のアプリケーションのアイコンに似たアイコンを使用して、安全でない操作を実行するようヘルプ・メッセージや吹出しメッセージでユーザーに指示します。次に、システム・トレイがトレイ・アイコンでいっぱいになり、それ以上トレイ・アイコンを追加できなくなる可能性があります。
createRobot java.awt.Robotオブジェクトの作成 java.awt.Robotオブジェクトによって、コードがネイティブ・レベルのマウス・イベントおよびキーボード・イベントを生成し、画面を読み込むことができるようになります。悪意のあるコードがシステムを制御し、ほかのプログラムを実行させ、ディスプレイを読み込み、ユーザーからのマウスおよびキーボードによるアクセスを拒否できるようになる場合があります。
fullScreenExclusive フル・スクリーン排他モードへの切替え フル・スクリーン排他モードに切り替え、低レベルのグラフィック・カード・メモリーへの直接アクセスを可能にします。プログラムがレンダリングを直接制御するため、システムの動作妨害に使用できます。
listenToAllAWTEvents システム内のすべてのAWTイベントの待機 悪意のあるコードが、AWTイベント・リスナーを追加後、システム内でディスパッチされるすべてのAWTイベントを調べられるようになります。この結果、パスワードなど、すべてのユーザーの入力を読み取ることができます。各AWTイベント・リスナーはイベント・キューのEventDispatchThreadのコンテキスト内から呼び出されます。このため、accessEventQueueアクセス権も有効な場合、悪意のあるコードはシステム全体でAWTイベント・キューの内容を変更し、アプリケーションまたはアプレットを安全でない方法で誤作動させる可能性があります。
readDisplayPixels 画面からのピクセルの読込み 任意のコードに表示画面のピクセルを検査することを許可するjava.awt.Compositeインタフェースなどのインタフェースにより、悪質なコードがユーザーの活動を覗き見るのを許可してしまう可能性があります。
replaceKeyboardFocusManager 特定のスレッドにKeyboardFocusManagerを設定する。 SecurityManagerがインストールされている場合、呼出し側のスレッドには、現在のKeyboardFocusManagerを置き換えるために、このアクセス権が与えられていなければなりません。アクセス権が与えられていない場合SecurityExceptionがスローされます。
setAppletStub アプレット・コンテナ・サービスを実装するスタブの設定 悪意あるコードがアプレットのスタブを設定すると、予期しない動作またはアプレットへのサービス拒否が発生するおそれがあります。
setWindowsAlwaysOnTop ウィンドウの最前面プロパティを設定する: Window.setAlwaysOnTop(boolean) 悪意のあるウィンドウが実物の完全なデスクトップのように見せて動作することがあるため、疑いを持たないユーザーがキャプチャされ、悪用されるおそれがあります。
showWindowWithoutWarningBanner ウィンドウがアプレットによって生成されたことを警告するバナーを表示しないでウィンドウを表示する この警告がない場合、アプレットがウィンドウを表示しても、ユーザーはこのウィンドウがアプレットに属することに気付きません。ユーザーは、ウィンドウがアプレットに属するかどうかに基づいて、セキュリティにかかわる決定を行う(たとえばダイアログ・ボックスでのユーザー名やパスワードの入力など)場合があるので、この警告バナーを無効にすると、適切でないウィンドウにユーザー名などの情報を入力してしまう可能性があります。
toolkitModality TOOLKIT_MODALダイアログの作成とTOOLKIT_EXCLUDEウィンドウ・プロパティの設定。 アプレットからツールキット・モーダル・ダイアログが表示されるときに、ブラウザ内のほかのアプレットがすべてブロックされます。Java Web Startからアプリケーションを起動するときに、これらのアプリケーションから表示されたツールキット・モーダル・ダイアログによって、セキュリティ・ダイアログなどのウィンドウがブロックされる可能性もあります。
watchMousePointer いつでもマウス・ポインタ位置に関する情報を取得する 絶えずマウス・ポインタを監視することで、アプレットはユーザーが何を行なっているか(つまり、マウスを画面の左下隅に移動することは、おそらくユーザーがアプリケーションを起動しようとしていることを意味する)を推測できます。キーボードでマウスの使用をエミュレートするために仮想キー・パッドを使用している場合、アプレットは何が入力されているかを推測できます。

FilePermission

java.io.FilePermissionは、ファイルまたはディレクトリへのアクセスを表します。FilePermissionは、パス名と、そのパス名に対して有効なアクションの集合から成ります。

パス名には、指定したアクションを許可するファイルまたはディレクトリのパス名を指定します。「/*」(「/」はファイル区切り文字File.separatorChar)で終わるパス名は、ディレクトリと、そのディレクトリに含まれるすべてのファイルを表します。「/-」で終わるパス名は、そのディレクトリに含まれるすべてのファイルとサブディレクトリを(再帰的に)表します。パス名に特殊なトークン「<<ALL FILES>>」を指定した場合は、すべてのファイルに一致します。

1つの「*」で構成されるパス名は、現在のディレクトリのすべてのファイルを示し、1つの「-」で構成されるパス名は、現在のディレクトリのすべてのファイル、および(再帰的に)現在のディレクトリに格納されているすべてのファイルおよびサブディレクトリを示します。

許可するアクションは、カンマで区切られた0個以上のキーワードのリストを内容とする文字列としてコンストラクタに引き渡されます。指定できるキーワードは、「read」、「write」、「execute」、「delete」および「readLink」です。それぞれの意味は、次のように定義されます。

キーワード 意味
read 読取り権。
write 書込み権(作成権も含む)。
execute 実行権。Runtime.execの呼出しを許可します。SecurityManager.checkExecに対応します。
delete 削除権。File.deleteの呼出しを許可します。SecurityManager.checkDeleteに対応します。
readLink リンクの読取りアクセス権。readSymbolicLinkメソッドを呼び出すことにより、シンボリック・リンクのターゲットを読み取ることができます。

アクション文字列は、処理の前に小文字に変換されます。

FilePermissionを付与する場合には注意してください。さまざまなファイルやディレクトリへの読取りアクセス、特に書込みアクセスを許可するとどうなるかをよく検討してください。writeアクションに対して「<<ALL FILES>>」を指定するのは特に危険です。これは、ファイル・システム全体に対する書込みを許可するということです。このような指定をすると、事実上、JVM実行環境を含め、システム・バイナリを置き換えることが可能になってしまいます。

注: コードは同一ディレクトリ(またはそのディレクトリのサブディレクトリ)内のファイルを常に読み取ることができるので、読取り時のアクセス権を明示する必要はありません。コードは実行元のディレクトリのパス名を取得することもでき、このパス名には機密情報が含まれることがあります。たとえば、コードをホーム・ディレクトリ(またはホーム・ディレクトリのサブディレクトリ)から実行する場合、パス名によって現在のユーザーの名前が明らかになる場合があります。

SerializablePermission

java.io.SerializablePermissionは、直列化可能アクセス権を表します。SerializablePermissionには名前(「ターゲット名」とも呼ばれる)は含まれますが、アクション・リストは含まれません。したがって、名前付きアクセス権を得るか、アクセス権を得ないかのどちらかになります。

ターゲット名は、直列化可能アクセス権の名前です(以降を参照)。

SerializablePermissionに指定できるターゲット名と、それで与えられるアクセス権により可能になる操作、および、そのアクセス権をコードに与えることにより生じるリスクを次の表に示します。

java.io.SerializablePermission
ターゲット名
アクセス権により許可される操作 このアクセス権を許可した場合のリスク
enableSubclassImplementation ObjectOutputStreamまたはObjectInputStreamのサブクラスを実装し、オブジェクトのデフォルトの直列化または直列化復元をオーバーライドする コードはこれを利用し、悪意を持ってクラスの直列化や直列化復元を行う可能性があります。たとえば、直列化中、非常に重要なprivateフィールド・データを、攻撃者が簡単にアクセスできる形で保存する可能性があります。また、直列化復元中、クラスのprivateフィールドをすべてゼロにして直列化復元する可能性があります。
enableSubstitution 直列化または直列化復元の際に、オブジェクトを別のオブジェクトと置き換える 悪意のあるコードはこれによって実際のオブジェクトを、不正なデータまたは悪意のあるデータを持つオブジェクトに置き換えることができるため、危険です。

ManagementPermission

SecurityManagerによって実行されるコードがJavaプラットフォームの管理インタフェースで定義されたメソッドを呼び出すときに、SecurityManagerがチェックするアクセス権です。

次の表に、アクセス権により許可される機能と、コードにそのアクセス権を与えた場合のリスクについて簡単に説明します。

java.lang.management.ManagementPermissionターゲット名 アクセス権により許可される操作 このアクセス権を許可した場合のリスク
control クラスのロードまたはメモリー・システムの詳細出力の有効化と無効化、メモリー・プールのしきい値の設定、スレッド・コンテンション・モニタリングのサポートの有効化または無効化など、Java仮想マシンの実行時特性を管理する機能。-verbose:classフラグのように、このアクセス権によって制御されるいくつかのアクションでは、実行中のアプリケーションに関する情報を公開できます。 これにより、攻撃者はJava仮想マシンの実行時特性をコントロールし、システムを誤動作させることができる攻撃者も実行中のアプリケーションに関する情報にアクセスできます。
monitor スレッド・スタック・トレース、ロードされたすべてのクラス名のリスト、Java仮想マシンへの入力引数など、Java仮想マシンに関する実行時情報を取得する機能 悪意のあるコードを使って実行時情報をモニターし、脆弱性を発見できる

通常、プログラマは直接ManagementPermissionオブジェクトを作成しません。その代わり、こうしたオブジェクトはセキュリティ・ポリシー・ファイルの読込みに基づくセキュリティ・ポリシー・コードによって作成されます。

ReflectPermission

java.lang.reflect.ReflectPermissionはリフレクション操作を表します。ReflectPermissionは名前付きアクセス権であり、アクションはとりません。suppressAccessChecks名により、リフレクトされたオブジェクトが使用される位置で実行される、標準の言語アクセス・チェック(public、default(package)アクセス、protected、privateメンバーに対する)を抑止できます。newProxyInPackage.{package name}は、プロキシ・クラスが実装するpublicでないインタフェースの指定したパッケージに、プロキシ・インスタンスを作成する機能を提供します。

次の表に、アクセス権により許可される機能と、コードにそのアクセス権を与えた場合のリスクについて簡単に説明します。

java.lang.reflect.ReflectPermission
のターゲット名
アクセス権により許可される操作 このアクセス権を許可した場合のリスク
suppressAccessChecks 警告: このアクセス権をコードに与えるときは、十分な注意を払ってください。これは、クラスのフィールドにアクセスし、メソッドを呼び出す機能を提供するためです。publicだけでなく、protected、privateなどのフィールドおよびメソッドも含まれます。 通常はアクセスできない機密情報やメソッドが、悪意のあるコードによってアクセスされる恐れがある
newProxyInPackage.{package name} プロキシ・クラスが実装するpublicでないインタフェースの指定したパッケージに、プロキシ・インスタンスを作成する機能。 通常はアクセスできないパッケージ内のクラスに、コードからアクセスできるようになり、動的プロキシ・クラスはシステム保護ドメイン内にあります。このため、悪意のあるコードが、このようなクラスを利用してシステムのセキュリティを脅かす可能性があります。

RuntimePermission

java.lang.RuntimePermissionは、実行時アクセス権を表します。RuntimePermissionには名前(「ターゲット名」とも呼ばれる)は含まれますが、アクション・リストは含まれません。したがって、名前付きアクセス権を得るか、アクセス権を得ないかのどちらかになります。

ターゲット名には、実行時アクセス権(下を参照)の名前を指定します。命名規約は、階層的なプロパティ命名規約に従います。また、ターゲット名のあとにアスタリスクを指定し(「.」のあとに指定するか、単独で指定)、ワイルドカードによる照合を行うこともできます。たとえば、"「loadLibrary.*」や「*」は有効ですが、「*loadLibrary」や「a*b」は無効です。

RuntimePermissionに指定できるターゲット名と、それで与えられるアクセス権により可能になる操作、および、そのアクセス権をコードに与えることにより生じるリスクを次の表に示します。

java.lang.RuntimePermissionのターゲット名 アクセス権により許可される操作 このアクセス権を許可した場合のリスク
createClassLoader クラス・ローダーの作成 このアクセス権を与えるのはきわめて危険です。悪意のあるアプリケーションが独自のクラス・ローダーのインスタンスを生成し、破壊行為を行うクラスをシステムにロードする可能性があります。この新たにロードされたクラスが同じクラス・ローダーによって保護ドメインに置かれ、ロードされたクラスに、そのドメインのアクセス権が自動的に与えられる可能性があります。
getClassLoader クラス・ローダー(クラスを呼び出すためのクラス・ローダーなど)の取得 これにより、特定のクラスのクラス・ローダーを取得するためのアクセス権を、攻撃者に与えることになります。あるクラスのクラス・ローダーにアクセスできると、攻撃者は、そのクラス・ローダーから使用できるほかのクラスをロードできるようになるため、このアクセス権は危険です。本来は、そのようなクラスにはアクセスすることはできません。
setContextClassLoader スレッドが使うコンテキスト・クラス・ローダーの設定 コンテキスト・クラス・ローダーは、システム・クラス・ローダーに存在しない可能性のあるリソースを探す必要があるときに、システム・コードおよびエクステンションによって使用されます。setContextClassLoaderアクセス権を与えると、コードは、システム・スレッドを含め、特定のスレッドで使用するコンテキスト・クラス・ローダーを変更できるようになります。
enableContextClassLoaderOverride スレッドのコンテキスト・クラス・ローダー・メソッドのサブクラス実装 コンテキスト・クラス・ローダーは、システム・クラス・ローダーに存在しない可能性のあるリソースを探す必要があるときに、システム・コードおよびエクステンションによって使用されます。enableContextClassLoaderOverrideアクセス権の許可によって、スレッドのサブクラスは、特定のスレッドのコンテキスト・クラス・ローダーの取得または設定に使用されるメソッドをオーバーライドできます。
closeClassLoader ClassLoaderのクローズ このアクセス権を付与すると、コード内から参照している任意のURLClassLoaderを閉じることができるようになります。
setSecurityManager セキュリティ・マネージャの設定(既存の設定を置き換える可能性あり) セキュリティ・マネージャとは、アプリケーションがセキュリティ・ポリシーを実装できるクラスです。setSecurityManagerアクセス権を与えると、コードは、別のセキュリティ・マネージャ(より制限の少ないセキュリティ・マネージャなど)をインストールして、使用するセキュリティ・マネージャを変更できるようになり、この結果、元のセキュリティ・マネージャによって課されていたチェックを回避できるようになります。
createSecurityManager 新しいセキュリティ・マネージャの作成 ほかのクラスまたは実行スタックの情報を公開する可能性がある、保護された、機密性の高いメソッドへのアクセスをコードに与えます。
getenv.{variable name} 指定された環境変数の値の読取り。 コードを使って特定の環境変数の値の読み取りや存在の判定を行うことができる。変数が機密データを格納している場合、これは危険です。
exitVM.{exit status} 指定された終了ステータスでのJava仮想マシンの停止。 仮想マシンを自動的に停止させることで、攻撃者はサービス妨害攻撃を展開することができます。注: アプリケーション・クラス・パスからロードされたすべてのコードにアクセス権「exitVM.*」が付与されるため、アプリケーションは自らを終了させることができます。また、アクセス権「exitVM」は「exitVM.*」と同等です。
shutdownHooks 仮想マシンのシャットダウン・フックの登録および解除。 悪意のあるシャットダウン・フックを登録することで、攻撃者は仮想マシンの正常なシャットダウンの妨害攻撃を展開できます。
setFactory ServerSocketまたはSocketにより使用されるソケット・ファクトリ、またはURLにより使用されるストリーム・ハンドラ・ファクトリの設定。 これにより、コードから、ソケット、サーバー・ソケット、ストリーム・ハンドラ、またはRMIソケット・ファクトリの実際の実装を設定できるようになります。攻撃者は、データ・ストリームを狂わせる異常な実装を設定する可能性があります。
setIO System.out、System.in、およびSystem.errの設定。 標準システム・ストリームの値を変更できるようになります。攻撃者は、System.inを変更して、ユーザーの入力をモニターおよび盗聴したり、System.errを「null」のOutputSteamに設定して、System.errに送られたエラー・メッセージがまったく表示されないようにしたりできます。
modifyThread ThreadのinterruptstopsuspendresumesetDaemonsetPrioritysetName、およびsetUncaughtExceptionHandlerメソッドの呼び出しなどによるスレッドの変更 攻撃者がシステム内の任意のスレッドの動作を変更できるようになります。
stopThread Threadのstopメソッドの呼出しによるスレッドの停止 スレッドへのアクセス権をすでに取得している場合、コードから、システム内のどのスレッドでも停止できるようになります。実行中のスレッドが終了させられ、システムが破壊される可能性があります。
modifyThreadGroup ThreadGroupのdestroygetParentresumesetDaemonsetMaxPrioritystop、およびsuspendメソッドの呼び出しなどによるスレッド・グループの変更 攻撃者は、スレッド・グループを作成してその実行優先順位を設定できます。
getProtectionDomain クラスのProtectionDomainの取得 コードから、特定のコード・ソースのポリシー情報を取得できるようになります。ポリシー情報が盗まれてもシステムのセキュリティが脅かされるわけではないが、攻撃の狙いをより正確に定めるためのローカル・ファイル名などの追加情報を攻撃者に与えてしまうことになります。
getFileSystemAttributes ファイル・システム属性の取得 呼出し側に使用可能なディスク使用量やディスク容量などのファイル・システム情報を、コードで取得できるようにします。これは、システムのハードウェア構成に関する情報と呼出し側のファイルの書込み特権に関する一部の情報を開示するため、危険を伴う可能性があります。
readFileDescriptor ファイル記述子の読取り コードから、読み出したファイル記述子に関連付けられているファイルを読み出すことができるようになります。ファイルに機密データが含まれている場合、このアクセス権は危険です。
writeFileDescriptor ファイル記述子への書込み コードから、そのファイル記述子に関連付けられているファイルに書き込めるようになります。悪意のあるコードにより、ウィルスが仕掛けられたり、ディスクをいっぱいにされたりする可能性があるため、このアクセス権は危険です。
loadLibrary.{library name} 特定のライブラリへの動的リンク Javaのセキュリティ・アーキテクチャが、ネイティブ・コードのレベルで悪意のある動作を防止するようには設計されていないため、ネイティブ・コード・ライブラリをロードするアクセス権をアプレットに与えるのは危険です。
accessClassInPackage.
{package name}
クラス・ローダーがセキュリティ・マネージャのcheckPackageAcesssメソッドを呼び出すときに、クラス・ローダーのloadClassメソッドを介して、指定されたパッケージにアクセスする 通常はアクセスできないパッケージ内のクラスに、コードからアクセスできるようになります。このため、悪意のあるコードが、このようなクラスを利用してシステムのセキュリティを脅かす可能性があります。
defineClassInPackage.
{package name}
クラス・ローダーがセキュリティ・マネージャのcheckPackageDefinitionメソッドを呼び出すときに、そのクラス・ローダーのdefineClassメソッドを使用して、指定したパッケージ内にクラスを定義する。 これにより、特定のパッケージ内にクラスを定義するためのアクセス権をコードに与えることになります。このアクセス権が与えられた悪意のあるコードは、java.securityjava.langなどの信頼できるパッケージ内に破壊行為を行うクラスを定義する可能性があるため、このアクセス権は危険です。
accessDeclaredMembers 警告: このアクセス権をコードに与えるときは、十分な注意を払ってください。このアクセス権により、特定のクラスで宣言されているメンバーへのアクセスが可能になります。 特定のクラス内のpublic、デフォルト(パッケージ)アクセス、protected、およびprivateなフィールドやメソッドに関する問い合わせを行うコード・アクセス権をコードに与えることになります。このアクセス権が与えられたコードは、privateおよびprotectedなフィールド名とメソッド名にはアクセスできるが、privateおよびprotectedなフィールドのデータにはアクセスできないし、privateなメソッドを呼び出すことはできません。しかし、攻撃の狙いをより正確に定めるため、悪意のあるコードがこの情報を利用する可能性があります。また、クラス内のpublicなメソッドを呼び出したり、publicなフィールドにアクセスしたりする可能性があります。コードが、メソッドとフィールドが含まれるクラスやインタフェースにオブジェクトをキャストできないために、通常はコードがこれらのメソッドを呼び出したり、フィールドにアクセスしたりできない場合は危険です。
queuePrintJob 印刷ジョブ要求の発行 機密情報を印刷してしまうか、用紙の無駄になります。
getStackTrace 別のスレッドのスタック・トレース情報の取得 別のスレッドのスタック・トレース情報を取得できる。スレッドの実行をモニターし、アプリケーションの脆弱性を発見する悪意のあるコードを可能にするので危険です。
setDefaultUncaughtExceptionHandler キャッチされない例外により、突然スレッドが終了したときに使用されるデフォルトのハンドラを設定する。 攻撃者が、スレッドの終了を妨害できる、悪意のあるキャッチされない例外ハンドラを登録できるようになります。
preferences java.util.prefsへのアクセスに必要なアクセス権を表す。preferences実装のユーザーまたはシステム・ルートは、preferencesの持続バッキング・ストア内で取得または更新操作を実行できる。 このアクセス権により、コードを実行しているユーザーが必要なOS特権を持っている場合、そのユーザーはpreferences持続バッキング・ストアに読み取りや書込みを行うことができます。実際のバッキング・ストアは、従来のファイル・システム・ディレクトリか、プラットフォームのOSに依存するレジストリ内にあります。
usePolicy このアクセス権を付与すると、Java Plug-Inのデフォルトのセキュリティ・プロンプト動作が無効になる。 詳細については、Java Plug-Inのガイド、アプレットのセキュリティの基本、およびusePolicyアクセス権を参照してください。

NIO関連ターゲット

JavaSE JDKのリリース1.4では、次の2つのNIOに関するRuntimePermissionターゲットが追加されました。
selectorProvider
charsetProvider
これらのRuntimePermissionは、java.nio.channel.spi.SelectorProviderまたはjava.nio.charset.spi.CharsetProviderをサブクラス化して実装するクラスに付与する必要があります。アクセス権は、抽象基底クラス・コンストラクタの呼出し時にチェックされます。これらのアクセス権は、重要なプロバイダ・メカニズムを実装するクラスの信頼性を保証します。

詳細は、java.nio.channels.spi.SelectorProviderおよびjava.nio.channels.spi.CharsetProviderを参照してください。

NetPermission

java.net.NetPermissionは、様々なネットワーク・アクセス権を表します。NetPermissionには名前は含まれますが、アクション・リストは含まれません。したがって、名前付きアクセス権を得るか、アクセス権を得ないかのどちらかになります。

NetPermissionに指定できるターゲット名と、それで与えられるアクセス権により可能になる操作、および、そのアクセス権をコードに与えることにより生じるリスクを次の表に示します。

java.net.NetPermission
ターゲット名
アクセス権により許可される操作 このアクセス権を許可した場合のリスク
setDefaultAuthenticator プロキシまたはHTTPサーバーが証明書を要求したときに使用する、認証情報の取得方法を設定する。 これにより、ユーザーからの入力を取得のときに、ユーザーの認証情報入力をモニターし、それを盗むオーセンティケータが悪意のあるコードにより設定される可能性があります。
requestPasswordAuthentication システムに登録されたオーセンティケータにパスワードを要求。 悪意のあるコードにより、このパスワードが盗まれる可能性があります。
specifyStreamHandler URLの作成時にストリーム・ハンドラを指定。 悪質なコードが、それが実際にアクセスする場所から実効バイトを取得するストリーム・ハンドラを指定して、通常はアクセスすることのないリソース(file:/foo/fum/のように)を使ってURLを作成する可能性があります。このようにしてシステムをだまして、あるクラスの出所を偽り、そのクラスのProtectionDomain/CodeSourceを作成させてしまう可能性があります。
setProxySelector ネットワーク接続の確立時に使用すべきプロキシの決定に使用されるプロキシ・セレクタを設定する機能。 悪意のあるコードは、ネットワーク・トラフィックをある任意のネットワーク・ホストに転送するようなProxySelectorを設定できます。
getProxySelector ネットワーク接続の確立時に使用すべきプロキシの決定に使用されるプロキシ・セレクタを取得する機能。 悪意のあるコードは、ProxySelectorを取得することで、内部ネットワーク上のプロキシ・ホストやそのポートを発見することができます。すると、それらが攻撃の標的になる可能性があります。
setCookieHandler 高レベルのセキュリティ保護を必要とする、HTTPセッションのCookie情報を処理するCookieハンドラを設定する機能。 悪意のあるコードは、Cookieハンドラを設定することで、高レベルのセキュリティ保護を必要とするCookie情報にアクセスできます。Webサーバーのなかには、Cookieを使ってアクセス制御情報などのユーザーの非公開情報を保存したり、ユーザーの閲覧傾向を追跡したりするものもあります。
getCookieHandler 高レベルのセキュリティ保護を必要とする、HTTPセッションのCookie情報を処理するCookieハンドラを取得する機能。 悪意のあるコードは、Cookieハンドラを取得することで、高レベルのセキュリティ保護を必要とするCookie情報にアクセスできます。Webサーバーのなかには、Cookieを使ってアクセス制御情報などのユーザーの非公開情報を保存したり、ユーザーの閲覧傾向を追跡したりするものもあります。
setResponseCache ローカル応答キャッシュへのアクセス機能を提供する応答キャッシュを設定する機能。 ローカル応答キャッシュにアクセスできる悪意のあるコードは、セキュリティ保護を必要とする情報にアクセスしたり、応答キャッシュ内に不正なエントリを作成したりできます。
getResponseCache ローカル応答キャッシュへのアクセス機能を提供する応答キャッシュを取得する機能。 ローカル応答キャッシュにアクセスできる悪意のあるコードは、セキュリティ保護を必要とする情報にアクセスできます。

SocketPermission

java.net.SocketPermissionは、ソケットを利用したネットワーク・アクセスを表します。SocketPermissionは、ホストの指定と、そのホストへの接続方法を指定したアクションの集合からなります。ホストは、次のように指定します。

host = (hostname | IPaddress)[:portrange]
portrange = portnumber | -portnumber | portnumber-[portnumber]

ホストは、DNS名、数値によるIPアドレス、localhost (ローカル・マシンの場合)のどれかで表されます。DNS名によるホストの指定では、ワイルドカード「*」を1つだけ使うことができます。これを使う場合は、「*.sun.com」のようにいちばん左の位置に使います。

ポートまたはポート範囲は省略可能です。ポートを「N-」(Nはポート番号)という形で指定した場合は、ポート番号Nとそれより上のすべてのポート番号を表します。また、「-N」という形で指定した場合は、ポート番号Nとそれより下のすべてのポート番号を表します。

ホストへの接続方法としては、次のどれかを指定できます。

accept
connect
listen
resolve

「listen」アクションは、「localhost」とともに使用した場合だけ意味を持ちます。「resolve」(ホストおよびIPネーム・サービスの参照を解決)アクションは、それ以外のアクションのいずれかを指定すると、自動的に指定したことになります。

SocketPermissionsの作成およびその意味の例として、ポリシー・ファイルに次のエントリがある場合を考えてみましょう。

grant signedBy "mrm" {
    permission java.net.SocketPermission "puffin.example.com:7777", "connect, accept";
};

このエントリにより、次のアクセス権オブジェクトが生成され、「mrm」により署名されたコードに許可が与えられます。

p1 = new SocketPermission("puffin.example.com:7777", "connect,accept");

p1は、puffin.example.com上のポート7777へ接続するアクセス権、および接続を受け付けるアクセス権を表します。

同様に、ポリシーに次のエントリがあるとします。

grant signedBy "paul" {
    permission java.net.SocketPermission "localhost:1024-", "accept, connect, listen";
};

この場合、次のアクセス権オブジェクトが生成され、「paul」により署名されたコードに許可が与えられます。

p2 = new SocketPermission("localhost:1024-", "accept,connect,listen");

p2は、ローカル・ホストの1024から65535までの任意のポートへの接続の受け付け、そのポートへの接続、およびそのポートでの待機を許可するアクセス権を表します。

注: リモート・ホストへの接続要求を受け付けるためのアクセス権やリモート・ホストへ接続するためのアクセス権をコードに与えると、悪意のあるコードが、そのようなアクセス権がなければそのデータにアクセスできないホスト間で、機密データをより簡単に転送および共有できるようになるため危険です。

URLPermission

指定のURLで定義されたリソースまたは一連のリソースにアクセスするためのアクセス権と、指定された一連のユーザー設定可能な要求メソッドと要求ヘッダーを表します。アクセス権の名前はURL文字列です。アクション文字列は要求メソッドとヘッダーを連結したものです。メソッドとヘッダーの名前の範囲はこのクラスによって制限されません。

URL

URL文字列は次のような構造が期待されます。

     scheme : // authority [ / path ]
 
schemeは一般にhttpまたはhttpsになりますが、このクラスによって制限されません。authorityは次のように指定されます。
     authority = [ userinfo @ ] hostrange [ : portrange ]
     portrange = portnumber | -portnumber | portnumber-[portnumber] | *
     hostrange = ([*.] dnsname) | IPv4address | IPv6address
 
dnsnameは標準DNSホスト名またはドメイン名で、つまり「.」によって区切られた1つ以上のラベルです。IPv4addressは標準のリテラルIPv4アドレスで、IPv6addressRFC 2732で定義されているとおりです。ただし、リテラルIPv6アドレスは「[]」文字で囲む必要があります。dnsnameの指定は、「*.」を先頭に付けることができ、これは名前が、右端のドメイン・ラベルがこの名前と同じすべてのホスト名に一致することを意味します。たとえば、「*.oracle.com」は「foo.bar.oracle.com」に一致します。

portrangeは、このアクセス権が適用されているポート番号、またはバインドされているかバインドされていないポートの範囲を指定するために使用します。ポート範囲が存在しないか、無効の場合、schemeがhttp (デフォルトは80)またはhttps (デフォルトは443)であれば、デフォルトのポート番号が想定されます。他のschemeの場合デフォルトは想定されません。すべてのポートを意味するワイルドカードを指定できます。

userinfoはオプションです。userinfoコンポーネントは存在する場合に、URLPermissionの作成時に無視され、このクラスによって定義されている他のすべてのメソッドに影響しません。

pathコンポーネントは「/」文字によって区切られたパス・セグメントのシーケンスから構成されます。pathは空にすることもできます。パスはFilePermissionのパスと同じように指定します。次の例に示すように、3つの異なる方法があります。

URLの例
URLの例説明
http://www.oracle.com/a/b/c.html 特定の(単一の)リソースを識別するURL
http://www.oracle.com/a/b/* 「*」文字は同じ「ディレクトリ」内のすべてのリソース、つまり、パス・コンポーネントの数が同じで、「*」で表現された最後のパス・コンポーネントのみが異なるすべてのリソースを表します。
http://www.oracle.com/a/b/- 「-」文字はそれより前のパスの下のすべてのリソースを再帰的に表します(つまり、http://www.oracle.com/a/b/c/d/e.htmlはこの例に一致します)。

「*」と「-」はパスの最後のセグメントにのみ指定でき、そのセグメント内の唯一の文字である必要があります。URLの問合せまたはフラグメント・コンポーネントは、URLPermissionsの構築時に無視されます。

特殊なケースとして、形式「scheme:*」のURLは受け付けられ、指定のスキームの任意のURLを意味します。

URL文字列のschemeおよびauthorityコンポーネントは大文字と小文字に関係なく処理されます。このことは、equals(Object)hashCode()およびimplies(Permission)は、これらのコンポーネントに関して大文字と小文字が区別されることを意味します。authorityにリテラルIPアドレスが含まれる場合、このアドレスは比較のため正規化されます。パス・コンポーネントは大文字と小文字が区別されます。

アクション文字列

URLPermissionのアクション文字列はメソッド・リスト要求ヘッダー・リストを連結したものです。これらは、それぞれアクセス権の許可された要求メソッドと許可された要求ヘッダーのリストです。2つのリストはコロン「:」で区切り、各リストの要素はカンマで区切ります。例:

         "POST,GET,DELETE"
         "GET:X-Foo-Request,X-Bar-Request"
         "POST,GET:Header1,Header2"
 
最初の例はメソッドPOST、GETおよびDELETEを指定していますが、要求ヘッダーは指定していません。2つ目の例は1つの要求メソッドと2つのヘッダーを指定しています。3つ目の例は2つの要求メソッドと2つのヘッダーを指定しています。

要求ヘッダー・リストが空の場合、コロンのセパレータが存在する必要はありません。アクション文字列には空白を使用できません。URLPermissionコンストラクタに指定されるアクション文字列は大文字と小文字が区別されず、メソッド名を大文字に変換し、ヘッダー名をRFC2616に定義された形式(各単語の頭文字を大文字にする)に変換することによって正規化されます。どちらのリストにも、それぞれすべての要求メソッドまたはヘッダーを示すワイルドカード「*」文字を含めることができます。

注: 使用するコンテキストに応じて、要求メソッドおよびヘッダーの中には、常に許可されるものや、いつも許可されないものがある場合があります。たとえば、HTTPプロトコル・ハンドラは、適用されているセキュリティ・ポリシーにかかわらず、Content-Lengthなどの特定のヘッダーがアプリケーション・コードによって設定されるのを許可しない場合があります。

注: リモート・ホスト上のリソースにアクセスするためのアクセス権をコードに与えることは、そのようなアクセス権がなければデータにアクセスできないパーティ間で、悪意のあるコードによって機密データを簡単に転送および共有できてしまうため危険な場合があります。

LinkPermission

リンク作成操作のためのPermissionクラスです。

次の表に、アクセス権により許可される機能と、コードにそのアクセス権を与えた場合のリスクについて簡単に説明します。

java.nio.file.LinkPermissionターゲット名 アクセス権により許可される操作 このアクセス権を許可した場合のリスク
hard 既存のファイルをディレクトリに追加する機能。これは、リンク(ハード・リンク)の作成と呼ばれることもあります。 このアクセス権を付与するときは、十分な注意を払ってください。これにより、ファイル・システム内のどのファイルまたはディレクトリへのリンクも可能になるため、攻撃者がすべてのファイルにアクセスできるようになります。
symbolic シンボリック・リンクを作成する機能。 このアクセス権を付与するときは、十分な注意を払ってください。これにより、ファイル・システム内のどのファイルまたはディレクトリへのリンクも可能になるため、攻撃者がすべてのファイルにアクセスできるようになります。

AllPermission

java.security.AllPermissionは、すべてのアクセス権を意味するアクセス権です。

注: AllPermissionは、ほかのすべてのアクセス権を包含するので、慎重に付与してください。このアクセス権を指定すると、コードはセキュリティ無効の状態で実行されるようになります。このようなアクセス権をコードに与えるときは、十分な注意を払ってください。このアクセス権は、テスト時か、アプリケーションまたはアプレットが完全に信頼できる場合で、なおかつ必要なアクセス権をポリシーに追加するのが非常に煩雑な作業になるような、きわめてまれなケースでだけ使用するようにしてください。

SecurityPermission

java.security.SecurityPermissionはセキュリティ・アクセス権を表します。SecurityPermissionには名前(「ターゲット名」とも呼ばれる)は含まれますが、アクション・リストは含まれません。したがって、名前付きアクセス権を得るか、アクセス権を得ないかのどちらかになります。

ターゲット名には、セキュリティ構成パラメータの名前(下記を参照)を指定します。現在、SecurityPermissionオブジェクトを使うと、PolicySecurityProviderSigner、およびIdentityオブジェクトへのアクセスを保護できます。

SecurityPermissionに指定できるターゲット名と、それで与えられるアクセス権により可能になる操作、および、そのアクセス権をコードに与えることにより生じるリスクを次の表に示します。

java.security.SecurityPermission
ターゲット名
アクセス権により許可される操作 このアクセス権を許可した場合のリスク
createAccessControlContext AccessControlContextの作成 これにより、DomainCombinerを使用してAccessControlContextをインスタンス化できます。このアクセス権を付与するときは、十分な注意を払う必要があります。悪意のあるコードは、コードに与えるアクセス権のセットを拡張したり、コードAllPermissionさえも付与したりするDomainCombinerを作成する可能性があります。
getDomainCombiner AccessControlContextDomainCombinerの取得 特定のCodeSourceに対してどのようなアクセス権が与えられているかを知ることができるgetPermissionsの呼出しにより、システム全体のセキュリティ・ポリシーに対して問い合わせができるようになります。ポリシー情報が盗まれてもシステムのセキュリティが脅かされるわけではありませんが、攻撃の狙いをより正確に定めるための追加情報を悪意のあるコードに与えてしまいます。必要以上の情報は公開しないようにする必要があります。
getPolicy システム全体のセキュリティ・ポリシー(具体的には、現在インストールされているPolicyオブジェクト)の取得。 特定のCodeSourceに対してどのようなアクセス権が与えられているかを知ることができるgetPermissionsの呼出しにより、システム全体のセキュリティ・ポリシーに対して問い合わせができるようになります。ポリシー情報が盗まれてもシステムのセキュリティが脅かされるわけではありませんが、攻撃の狙いをより正確に定めるための追加情報を悪意のあるコードに与えてしまいます。必要以上の情報は公開しないようにする必要があります。
setPolicy システム全体のセキュリティ・ポリシー(具体的には、Policyオブジェクト)の設定。 このアクセス権を与えると、悪意のあるコードは、システムを攻撃するのに必要なアクセス権のすべてを自らに与えることができるようになるため、きわめて危険です。
createPolicy.{policy type} Policy.getInstanceを使用したPolicyのインスタンスの取得 このアクセス権を付与すると、コードはPolicyオブジェクトを取得できるようになります。悪意のあるコードが、Policyオブジェクトを照会することにより、自分以外のコードに付与されているアクセス権を特定しようとする場合があります。
getProperty.{key} 鍵を指定してのセキュリティ・プロパティの取得。 指定した鍵により可能になるアクセスの種類によっては、コードから、システム全体のポリシーとユーザー・セキュリティ・ポリシーの場所のほか、セキュリティ・プロバイダのリストにもアクセスできるようになります。この情報が盗まれてもシステムのセキュリティが脅かされるわけではありませんが、攻撃の狙いをより正確に定めるための追加情報を悪意のあるコードに与えてしまいます。
setProperty.{key} 鍵を指定してのセキュリティ・プロパティの設定。 これには、セキュリティ・プロバイダの設定と、システム全体のセキュリティ・ポリシーの場所の定義が含まれます。新しいセキュリティ・プロバイダを設定するアクセス権が与えられた悪意のあるコードは、暗号化非公開鍵などの機密情報を盗むプロバイダを設定する可能性があります。また、システム全体のセキュリティ・ポリシーの場所を設定するアクセス権が与えられた悪意のあるコードは、システムを攻撃するのに必要なアクセス権のすべてを攻撃者に与えるセキュリティ・ポリシーの場所をその場所に設定する可能性があります。
insertProvider 新しいプロバイダの追加 悪意のあるプロバイダ(受け取った非公開鍵を暴露するプロバイダなど)を、もっとも高い優先順位を持つプロバイダとして追加できるようになります。これは、インストールされているプロバイダを管理する現在のSecurityオブジェクトは、プロバイダを追加する前に、その整合性や信頼性のチェックは行わないためです。「insertProvider」アクセス権には、「insertProvider.{provider name}」アクセス権を含みます(詳細については、下のセクションを参照してください)。
removeProvider.{provider name} 指定したプロバイダの削除。 プログラムのほかの部分の動作を変更したり、その実行を無効にすることができるようになります。プログラムが要求したプロバイダがすでに削除されてしまった場合、実行が異常終了する可能性があります。また、削除されたプロバイダがプログラムの残りの部分で要求されていなくても、そのプロバイダが、通常、暗号化サービスが要求されたときに選ばれるプロバイダである場合は(プロバイダのリストで前の方にあるため)、代わりに別のプロバイダが選ばれるか、適切なプロバイダが見つからない場合はエラーになります。
clearProviderProperties.{provider name} Providerによって実装されているサービスの参照に使用されるプロパティが空になるように、Providerを「クリア」する。 プロバイダによって実装されているサービスの参照が無効になります。したがって、アクセス権「removeProvider.{provider name}」の部分で説明しているように、通常はそのProviderを利用しているプログラムのほかの部分の動作が変更されたり、その実行が無効になったりする可能性があります。
putProviderProperty.{provider name} 指定したProviderのプロパティの設定。 プロバイダのプロパティは、そのプロバイダによって実装されている特定のサービスの名前と場所を指定します。このアクセス権を与えると、コードからサービスの指定を変更し、別の実装を指定できるようになります。
removeProviderProperty.{provider name} 指定したProviderからのプロパティの削除。 プロバイダによって実装されているサービスの参照が無効になります。プロバイダの名前と場所を指定したプロパティが削除されるため、そのプロバイダにはアクセスできなくなります。したがって、アクセス権「removeProvider.{provider name}」の部分で説明しているように、通常はそのProviderを利用しているプログラムのほかの部分の動作が変更されたり、その実行が無効になったりする可能性があります。

アクセス権IdentityIdentityScopeSignerは、非推奨のクラスに関連付けられています。それらの使用は非推奨です。詳細については、該当するクラスを参照してください。

java.security.SecurityPermission
ターゲット名
アクセス権により許可される操作 このアクセス権を許可した場合のリスク
insertProvider.{provider name} 指定した新しいプロバイダの追加。 悪意のあるプロバイダ(受け取った非公開鍵を暴露するプロバイダなど)を、もっとも高い優先順位を持つプロバイダとして追加できるようになります。これは、インストールされているプロバイダを管理する現在のSecurityオブジェクトは、プロバイダを追加する前に、その整合性や信頼性のチェックは行わないためです。
setSystemScope システムのアイデンティティ・スコープの設定。 攻撃者は、信頼されるべきでない証明書を使用してシステムのアイデンティティ・スコープを構成し、そのような証明書を使用して署名されたアプレットやアプリケーションのコードに、システムの元のアイデンティティ・スコープでは拒否されていた特権を与えることができます。
setIdentityPublicKey Identityの公開鍵の設定。 アイデンティティが「信頼できるもの」としてマークされている場合、攻撃者は、システムのアイデンティティ・スコープが信頼していない別の公開鍵(独自の公開鍵など)を設定し、その公開鍵を使用して署名されたアプレットやアプリケーションのコードに、本来なら否定されていた特権を与えることができます。
setIdentityInfo Identityの概要を表す文字列の設定。 攻撃者は、アイデンティティの概要を表す文字列を設定できるようになります。これにより攻撃者は、アプリケーションを騙して目的のものとは異なるアイデンティティを使用させるようにしたり、特定のアイデンティティを見つけることができないようにしたりできます。
addIdentityCertificate Identityの証明書の追加。 攻撃者は、アイデンティティの公開鍵に証明書を設定できるようになります。システム全体の信頼関係に影響するため、このアクセス権は危険です。この公開鍵は、本来よりも広い範囲のコードに対して急に信頼性を持つようになります。
removeIdentityCertificate Identityの証明書の削除。 攻撃者は、アイデンティティの公開鍵のための証明書を削除できるようになります。システム全体の信頼関係に影響するため、このアクセス権は危険です。この公開鍵は、急に本来よりも信頼性が低く見なされるようになります。
printIdentity プリンシパルの名前、オプションでそのプリンシパルが使用されるスコープ、およびそのプリンシパルがスコープ内で「信頼できる」と見なされているかどうかを表示します。 出力されるスコープがファイル名の場合があり、その場合はローカル・システムの情報が伝達されてしまうことがあります。たとえば、ユーザーの識別情報データベースで信頼されないとしてマーク付けされている「carol」という名前の識別情報のサンプル出力を示します。
carol[/home/luehe/identitydb.obj][not trusted]
getSignerPrivateKey 署名者の非公開鍵の取得。 秘密鍵へのアクセスを許可するのは非常に危険です。秘密鍵は、秘密にしておくことが前提になっています。そうでない場合、コードはその秘密鍵を使用して様々なファイルに署名し、署名がその署名者のものであると主張できるようになります。
setSignerKeyPair 署名者の鍵のペア(公開鍵と非公開鍵)の設定。 攻撃者は、他人(標的)の鍵のペアを、それよりも弱い鍵のペア(キー・サイズの小さいものなど)と置き換えることができるようになります。また、標的とその通信相手との間の暗号化されたやりとりを傍受できるようにもなります。標的の通信相手が、標的の「新しい」公開鍵を使用して暗号化セッション鍵をラップしても、攻撃者(対応する非公開鍵の所有者)は、「新しい」公開鍵を使用してそのセッション鍵のラップを解除し、そのセッション鍵を使用して暗号化された通信データを解読できます。

UnresolvedPermission

java.security.UnresolvedPermissionクラスは、ポリシーが初期化されたときに「未解決」になっているアクセス権を保持するために使用されます。解決されていないアクセス権とは、Policyの初期化時に実際のPermissionクラスがまだ存在していないアクセス権のことです(下記を参照)。

Java実行時のポリシー(さまざまなプリンシパルからコードで利用できるアクセス権を指定する)は、Policyオブジェクトによって表現されます。Policyが初期化または再表示されるたびに、Policyによって許可されるすべてのアクセス権に対して適切なクラスのPermissionオブジェクトが作成されます。

ポリシーの構成によって参照されるアクセス権クラス・タイプの多くは、ローカルに存在します(つまり、CLASSPATH上に置かれている)。このようなアクセス権のオブジェクトは、Policyの初期化時にインスタンスを生成できます。たとえば、FilePermissionクラスはCLASSPATHで見つかるので、いつでもjava.io.FilePermissionのインスタンスを生成できます。

ほかのアクセス権クラスは、Policyの初期化時にはまだ存在しない場合もあります。たとえば、参照されたアクセス権クラスは、あとにロードされるJARファイル内にある可能性があります。そのような各クラスでは、UnresolvedPermissionのインスタンスが生成されます。このため、UnresolvedPermissionは基本的に、アクセス権についての情報を保持する「プレースホルダー」です。

そのあと、以前解決されなかったがそのあとクラスがロードされた型のアクセス権に対し、AccessController.checkPermissionがコード内から呼び出されると、その型の未解決のアクセス権が「解決」されます。つまり、そのような個々のUnresolvedPermissionごとに、UnresolvedPermission内の情報に基づいて適切なクラス型の新しいオブジェクトが生成されます。UnresolvedPermissionはこの新規オブジェクトに置き換えられ、削除されます。

SQLPermission

アプレット内で実行中のコードまたはSecurityManagerのインスタンスが有効になっているアプリケーションが次のいずれかのメソッドを呼び出したときにSecurityManagerがチェックするアクセス権です。

SQLPermissionオブジェクトがない場合、これらのメソッドは実行時例外としてjava.lang.SecurityExceptionをスローします。

SQLPermissionオブジェクトには名前(「ターゲット名」とも呼ばれる)は含まれますが、アクション・リストは含まれません。したがって、名前付きアクセス権が存在するか、存在しないかのどちらかになります。ターゲット名はアクセス権の名前です(可能なすべてのSQLPermission名を示す次の表を参照してください)。命名規約は、階層的なプロパティ命名規約に従います。また、アスタリスク(*)を名前の最後に、ドット(.)の後、または単独で指定して、ワイルドカードによる照合を示すこともできます。たとえば、loadLibrary.**は有効ですが、*loadLibrarya*bは無効です。

SQLPermissionに指定できるターゲット名を次の表に示します。表には、アクセス権により許可される操作、およびそのアクセス権をコードに与えた場合のリスクが示されます。

java.sql.SQLPermissionターゲット名 アクセス権により許可される機能 このアクセス権を許可した場合のリスク
setLog ロギング・ストリームの設定 このアクセス権を与えるのは危険です。ログの内容には、ユーザー名とパスワード、SQL文、およびSQLデータが含まれます。
callAbort Connectionメソッドabortの呼出し データベースへの物理的な接続を終了させることをアプリケーションに許可します。
setSyncFactory SyncFactoryのメソッドsetJNDIContextおよびsetLoggerの呼出し SyncProvider実装の取得元として使用可能なJNDIコンテキストと、SyncProvider実装によって使用されるログ・オブジェクトを指定することをアプリケーションに許可します。
setNetworkTimeout ConnectionメソッドsetNetworkTimeoutの呼出し ConnectionまたはConnectionオブジェクトから作成されたオブジェクトが、データベースによる任意の1つの要求への応答を待つ最大期間を指定することを、アプリケーションに許可します。
deregisterDriver DriverManagerメソッドderegisterDriverの呼出しを許可します。 アプリケーションに登録済のドライバのリストからJDBCドライバを削除し、そのリソースを解放することを許可します。

LoggingPermission

SecurityManagerは、SecurityManagerを使用して実行されているコードがLogger.setLevelなどのロギング制御メソッドを呼び出すと、java.util.logging.LoggingPermissionオブジェクトをチェックします。

現在、名前付きのLoggingPermissionは「control」の1つだけです。controlは、Handlerの追加と削除、Filterの追加と削除、ロギング・レベルの変更などによってロギング構成を制御する機能を付与します。

通常、LoggingPermissionオブジェクトは、ユーザーが直接作成するのではなく、セキュリティ・ポリシー・ファイルの読取りに基づいてセキュリティ・ポリシー・コードによって作成されます。

PropertyPermission

java.util.PropertyPermissionは、プロパティ・アクセス権を表します。

名前には、プロパティの名前(java.homeやos.nameなど)を指定します。命名規約は、階層的なプロパティ命名規約に従います。また、ターゲット名のあとにアスタリスクを指定し(「.」のあとに指定するか、単独で指定)、ワイルドカードによる照合を行うこともできます。たとえば、「java.*」や「*」は有効ですが、「*java」や「a*b」は無効です。

許可するアクションは、カンマで区切られた0個以上のキーワードのリストを内容とする文字列としてコンストラクタに引き渡されます。指定できるキーワードは、readとwriteです。それぞれの意味は、次のように定義されます。

キーワード 意味
read 読取り権。System.getPropertyの呼出しを許可します。
write 書込み権。System.setPropertyの呼出しを許可します。

アクション文字列は、処理の前に小文字に変換されます。

特定のシステム・プロパティへのアクセス権をコードに与えるときは注意してください。たとえば、システム・プロパティ「java.home」へのアクセス権を与えると、悪意のあるコードにより、システム環境に関する機密情報(実行環境のディレクトリ位置)が盗まれる可能性があります。また、システム・プロパティuser.nameおよびuser.homeへのアクセス権を与えると、悪意のあるコードにより、ユーザー環境に関する重要な情報(ユーザーのアカウント名とホーム・ディレクトリ)が盗まれる可能性があります。

MBeanPermission

MBeanServer操作のアクセスを制御するアクセス権です。System.setSecurityManager(java.lang.SecurityManager)を使用してセキュリティ・マネージャが設定されている場合、MBeanServerでのほとんどの操作では、呼出し元のアクセス権にその操作に適したMBeanPermissionが含まれている必要があります。詳細については、MBeanServerインタフェースのドキュメントを参照してください。

その他のPermissionオブジェクトの場合と同様に、MBeanPermissionは、ユーザーに付与されているアクセス権またはユーザーが必要とするアクセス権を表します。機密性の高い操作のアクセス権をチェックする場合、必要なアクセス権を表すMBeanPermissionを構築します。ユーザーに付与されているアクセス権に、ユーザーが必要とするアクセス権が含まれている場合に限り、オペレーションは許可されます。

MBeanPermissionには、次の4つの項目の情報が含まれます。

MBeanPermissionを付与されている場合は、この4つの項目すべてが満たされた場合にのみ操作が許可されます。

クラス名、メンバーおよびオブジェクト名はまとめて単一の文字列として書き込むことができ、これはこのアクセス権の名前になります。アクセス権の名前は、getName()で返される文字列です。文字列の形式:

className#member[objectName]

オブジェクト名は、ObjectNameの通常構文によって書き込まれます。オブジェクト名には、]を含む有効な文字を含めることができます。文字列の末尾の文字は]です。

1つ以上のclassNamememberまたはobjectNameは省略できます。memberを省略した場合、#も省略できます(ただしそうする必要はありません)。objectNameを省略した場合、[]も省略できます(ただしそうする必要はありません)。3つすべての項目を省略することは適切でなく、それは空の文字列の名前を持つことになります。

classNamememberobjectNameには、null値を表す文字「-」を指定できます。null値はすべての値(別のnull値を含む)に含まれますが、その他の値を含むことはありません。

次のアクションを選択できます。

カンマで区切られた形式のアクション・リストでは、各アクションの前後にスペースを挿入できます。

MBeanServerPermission

MBeanServer関連のアクションを実行するためのアクセス権。アクセス権の名前はアクセス権によって要求または付与された操作を指定します。付与されたアクセス権の場合、*を指定して、下に示すすべてのMBeanServerを許可できます。そうでない場合、付与または要求されたアクセス権の場合、次のいずれかにする必要があります。
createMBeanServer
MBeanServerFactory.createMBeanServer()メソッドまたはMBeanServerFactory.createMBeanServer(java.lang.String)メソッドを使って、新しいMBeanServerオブジェクトを生成する。
findMBeanServer
MBeanServerFactory.findMBeanServer(java.lang.String)メソッドを使用して、指定された名前のMBeanServerまたはこのJVM内のすべてのMBeanServerを検索する。
newMBeanServer
MBeanServerFactory.newMBeanServer()メソッドまたはMBeanServerFactory.newMBeanServer(java.lang.String)メソッドを使用して、参照を保持せずに、新しいMBeanServerオブジェクトを作成する。
releaseMBeanServer
MBeanServerFactory.releaseMBeanServer(javax.management.MBeanServer)メソッドを使用して、MBeanServerFactoryMBeanServerへの参照を削除する。
アクセス権のnameには、1つ以上のカンマ区切り形式のオペレーションのリストを指定することもできます。nameの前後、カンマの前後には空白文字を挿入できます。

MBeanServerPermission("createMBeanServer")は、MBeanServerPermission("newMBeanServer")を含みます。

MBeanTrustPermission

このアクセス権は、署名者またはコード・ベースの「trust」を表します。

MBeanTrustPermissionには、ターゲット名が含まれますが、アクション・リストは含まれません。単一のターゲット名「register」がこのアクセス権に定義されています。ターゲット「*」も使用でき、「register」と定義される将来のターゲットが許可されます。ポリシー・オブジェクトがポリシー・ファイルに指定されたアクセス権を作成できるように、アクションには、null値または空の文字列のみを使用できます。

署名者またはコードソースにこのアクセス権が付与されている場合、MBeanの信頼できるソースとみなされます。MBeanServerに登録できるのは、信頼できるソースのMBeanのみです。

SubjectDelegationPermission

承認アイデンティティに代わってオペレーションを実行するために、認証アイデンティティにより必要とされるアクセス権です。

SubjectDelegationPermissionには名前(「ターゲット名」とも呼ばれる)が含まれますが、アクション・リストは含まれません。名前付きアクセス権を持つか、持たないかのどちらかになります。

ターゲット名は承認プリンシパル・クラス名、ピリオド、および承認プリンシパル名から成る名前("PrincipalClassName.PrincipalName")です。

アスタリスクは単独で使用できます。ターゲット名の末尾のピリオド(.)の直後に置かれた場合は、ワイルドカード一致を表します。

たとえば、「*」、「javax.management.remote.JMXPrincipal.*」および「javax.management.remote.JMXPrincipal.delegate」は有効なターゲット名です。1つ目は、プリンシパル・クラスの任意のプリンシパル名を示し、2つ目は、具象プリンシパル・クラスjavax.management.remote.JMXPrincipalの任意のプリンシパル名を示し、3つ目は、具象プリンシパル・クラスjavax.management.remote.JMXPrincipalの具象プリンシパル名delegateを示します。

SSLPermission

javax.net.ssl.SSLPermissionクラスは、様々なネットワーク・アクセス権を表します。SSLPermissionには名前(「ターゲット名」とも呼ばれる)が含まれますが、アクション・リストは含まれません。名前付きアクセス権を持つか、持たないかのどちらかになります。

ターゲット名には、ネットワーク・アクセス権(下記を参照)の名前を指定します。命名規約は、階層的なプロパティ命名規約に従います。また、ターゲット名のあとにアスタリスクを指定し(「.」のあとに指定するか、単独で指定)、ワイルドカードによる照合を行うこともできます。たとえば、"「foo.*」や「*」は有効ですが、「*foo」や「a*b」は無効です。

SSLPermissionに指定できるターゲット名と、それで与えられるアクセス権により可能になる操作、およびそのアクセス権をコードに与えることにより生じるリスクを次の表に示します。

アクセス権ターゲット名 アクセス権により許可される操作 このアクセス権を許可した場合のリスク
setHostnameVerifier HttpsURLConnectionによって接続しようとしているホストと、サーバー証明書の共通名フィールドとの間の不一致を許容するかどうかを判断するために、コールバックを設定する。 悪意のあるコードが、HttpsURLConnection要求によって参照されたホスト名をモニターしたり、無効な共通名を使用するサーバー証明書を許可したりするベリファイアを設定する可能性があります。
getSSLSessionContext SSLSessionSSLSessionContextを取得する。 悪意のあるコードが、SSLピアを使用して確立されたセッションをモニターしたり、セッションを無効にしてパフォーマンスを低下させたりする可能性があります。
setDefaultSSLContext デフォルトのSSLコンテキストを設定する。 デフォルトのSSLコンテキストを設定してアプリケーションでデフォルトのSSLContextを使用すると、悪意のあるコードが、保証されていないトラスト・データ、鍵データ、乱数ジェネレータを使用したり、危険なSSLソケット・ファクトリやSSLサーバー・ソケット・ファクトリを使用したりする可能性があります。

AuthPermission

javax.security.auth.AuthPermissionクラスは、認証アクセス権を表します。AuthPermissionには名前(「ターゲット名」とも呼ばれる)は含まれますが、アクション・リストは含まれません。名前付きアクセス権を得るか、得ないかのどちらかになります。

現在、AuthPermissionオブジェクトを使うと、SubjectSubjectDomainCombinerLoginContext、およびConfigurationオブジェクトへのアクセスを保護できます。

AuthPermissionに指定できるターゲット名と、それで与えられるアクセス権により可能になる操作、および、そのアクセス権をコードに与えることにより生じるリスクを次の表に示します。

アクセス権ターゲット名 アクセス権により許可される操作 このアクセス権を許可した場合のリスク
doAs Subject.doAsメソッドの呼出し これにより、アプリケーションはdoAsメソッドに指定されたSubjectの識別情報でコード(Actions)を呼び出すことができるようになります。
doAsPrivileged Subject.doAsPrivilegedメソッドの呼出し これにより、アプリケーションはdoAsPrivilegedメソッドに指定されたSubjectの識別情報でコード(Actions)を呼び出すことができるようになります。また、呼出し側がAccessControlContextとしてnullを渡すと、呼出し側を呼出しスタックから削除し、さらにそのあとのセキュリティ判断からも削除することができます。
getSubject 与えられたAccessControlContextからSubjectを取り出す これにより、アプリケーションは認証されたSubjectへのアクセスを取得します。アプリケーションはSubjectの認証されたPrincipalと公開資格にアクセスできるようになります。
getSubjectFromDomainCombiner SubjectDomainCombinerからSubjectを取り出す これにより、アプリケーションはSubjectDomainCombinerと関連がある、認証されたSubjectへのアクセスを取得します。アプリケーションはSubjectの認証されたPrincipalと公開資格にアクセスできるようになります。
setReadOnly Subjectを読取り専用に設定する これにより、アプリケーションはSubjectのPrincipalセット、公開資格セット、および非公開資格セットを読取り専用に設定できるようになります。これをサービス妨害拒否の型として使用することができます。
modifyPrincipals SubjectのPrincipalセットを変更する アクセス制御はSubjectに関連するPrincipalに基づいて決定されます。このアクセス権により、アプリケーションはSubjectのPrincipalセットを変更し、そのあとのセキュリティ判断に影響を与えることができます。
modifyPublicCredentials Subjectの公開資格セットを変更する このアクセス権により、アプリケーションはSubjectから公開資格を追加または削除することができます。そのSubjectに非公開資格の適切なセットが存在することを前提としているコードは、これによって影響を受けることがあります。
modifyPrivateCredentials Subjectの非公開資格セットを変更する このアクセス権により、アプリケーションはSubjectから非公開資格を追加または削除することができます。そのSubjectに非公開資格の適切なセットが存在することを前提としているコードは、これによって影響を受けることがあります。
refreshCredential Refreshableインタフェースを実装する資格Objectをリフレッシュする このアクセス権により、アプリケーションは期限切れになる資格をリフレッシュすることができます。
destroyCredential Destroyableインタフェースを実装する資格Objectを更新する このアクセス権により、アプリケーションはサービス妨害攻撃として資格を削除することができます。
createLoginContext.{name} 指定したnameLoginContextをインスタンス化する セキュリティ上の問題から、管理者はすべてのLoginModuleに対してアプリケーションが認証されるようにしたくない場合があります。このアクセス権により、アプリケーションは指定したnameで構成されるログイン・モジュールを認証することができます。
getLoginConfiguration システム全体のログインConfigurationを取り出す これにより、システムの全アプリケーションに構成されているログイン・モジュールをすべてアプリケーションで決定することができます。
setLoginConfiguration システム全体のログインConfigurationを設定する これにより、システムの全アプリケーションのログイン・モジュールをアプリケーションで構成することができます。
createLoginConfiguration.{configuration type} Configuration.getInstanceを使用してConfigurationオブジェクトを取得 アプリケーションは構成内で指定されているすべてのLoginModulesを参照できます。
refreshLoginConfiguration システム全体のログインConfigurationをリフレッシュする これにより、アプリケーションはログインConfigurationをリフレッシュできます。

DelegationPermission

javax.security.auth.kerberos.DelegationPermissionクラスは、Kerberos委譲モデルの使用(すなわち転送可能チケットとプロキシ化可能チケット)を制限するために使われます。

このPermissionのターゲット名では、Kerberosサービス・プリンシパルのペアを指定します。最初のプリンシパルには、チケット認可チケット(Ticket Granting Ticket、TGT)の使用を委譲される下位のサービス・プリンシパルを指定します。2番目のサービス・プリンシパルは、KerberosPrincipalを初期化する代わりに、ターゲット・サービスをやり取りする従属サービス・プリンシパルとして示します。後者のサービス・プリンシパルは、プロキシ化可能チケットの使用を制限するために指定します。

たとえば、「host」サービスによる転送可能TGTの使用を指定するには、次のようにターゲットのアクセス権を指定します。

DelegationPermission("\"host/foo.example.com@EXAMPLE.COM\" \"krbtgt/EXAMPLE.COM@EXAMPLE.COM\"");
「backup」サービスにプロキシ化可能なNFSサービス・チケットを付与するには、ターゲットのアクセス権を次のように指定します。
DelegationPermission("\"backup/bar.example.com@EXAMPLE.COM\" \"nfs/home.EXAMPLE.COM@EXAMPLE.COM\"");

ServicePermission

javax.security.auth.kerberos.ServicePermissionクラスは、Kerberosサービスと、それらのサービスにアクセスするために必要な資格を保護するために使われます。サービス主体とサービスにアクセスするために必要な資格は1対1で対応します。そのため、サービス主体にアクセス権を付与すると、そのサービス主体とのセキュリティ・コンテキストを確立するために必要な資格に対するアクセス権を暗黙的に付与することになります。これは、資格が、キャッシュ内にある場合にも、KDCとの交換によって獲得される場合にも当てはまります。資格は、チケットを付与するチケット、あるいはキー表から取得されるサービス・チケットまたは秘密鍵のいずれかになります。

ServicePermissionには、サービス・プリンシパル名と、資格が使用されるコンテキストを指定するアクションのリストが含まれます。

サービス・プリンシパル名は、サービスを提供するKerberosPrincipalの正規名です。つまり、KerberosPrincipalはKerberosサービス・プリンシパルを表します。この名前では、大文字と小文字が区別されます。

このアクセス権を付与すると、呼出し側が、アクションによって指定されたコンテキスト内で、キャッシュされた資格(チケットを付与するチケット、サービス・チケット、秘密鍵)を使用できるようになります。TGTの場合、このアクセス権を付与するということは、認証サービス交換によってTGTを取得できることも意味します。

次の操作を指定できます。

アクション 意味
initiate 呼出し側が、資格を使用して、サービス・プリンシパル内でセキュリティ・コンテキストを開始できる。
accept 呼出し側が、資格を使用して、特定のプリンシパルとしてセキュリティ・コンテキストを受け入れることができる。
たとえば、TGTにアクセスしてセキュリティ・コンテキストを開始するためのアクセス権を指定するには、次のようにアクセス権を作成します。
     ServicePermission("krbtgt/EXAMPLE.COM@EXAMPLE.COM", "initiate");
サービス・チケットを取得し、「host」サービスを使用してコンテキストを開始するには、次のようにアクセス権を作成します。
ServicePermission("host/foo.example.com@EXAMPLE.COM", "initiate");
Kerberos化されたサーバーの場合、アクションは「accept」になります。たとえば、kerberos化された「host」サービス(telnetなど)の秘密鍵にアクセスして使用するために必要なアクセス権は、次のように作成します。
ServicePermission("host/foo.example.com@EXAMPLE.COM", "accept");

PrivateCredentialPermission

javax.security.auth.PrivateCredentialPermissionクラスは、特定のSubjectに属する非公開資格へのアクセスを保護するために使われます。Subjectは、プリンシパルのセットによって表されます。

このPermissionのターゲット名は、Credentialのクラス名およびPrincipalのSetを指定します。このPermissionのアクションとして有効な値は「read」だけです。ターゲット名は、次の構文に従っている必要があります。

CredentialClass {PrincipalClass "PrincipalName"}*
たとえば、次のアクセス権は「duke」という名前のcom.sun.Principalを保持するSubjectが所有するcom.sun.PrivateCredentialへのアクセスを許可します。

注: この例と次のすべての例では、grant文内にCodebaseSignedBy、またはPrincipalの情報が含まれていませんが、実際のポリシーの構成では、必要に応じてこれらの情報を指定します。

grant {
    permission javax.security.auth.PrivateCredentialPermission
             "com.sun.PrivateCredential com.sun.Principal \"duke\"",
             "read";
};
CredentialClassが「*」の場合は、指定したSubjectに属するすべての非公開Credentialへのアクセスが許可されます。「PrincipalName」が「*」の場合は、実際のPrincipalNameに関係なく、指定したPrincipalを保持する任意のSubjectが所有する、指定したCredentialへのアクセスが許可されます。たとえば、a.b.Principalを保持する任意のSubjectが所有するa.b.Credentialへのアクセスを許可するには、次のようにします。
grant {
    permission javax.security.auth.PrivateCredentialPermission
             "a.b.Credential a.b.Principal "*"",
             "read";
};
PrincipalClassと「PrincipalName」の両方が「*」になっている場合は、任意のSubjectが所有する、指定したCredentialへのアクセスが許可されます。また、PrincipalClass/PrincipalNameの対は、繰返し指定できます。
grant {
    permission javax.security.auth.PrivateCredentialPermission
             "a.b.Credential a.b.Principal "duke" c.d.Principal "dukette"",
             "read";
};
上記のコードでは、「duke」という名前の「a.b.Principal」と「dukette」という名前の「c.d.Principal」の少なくとも2つの関連するPrincipalを持つSubjectに属する非公開Credentialである「a.b.Credential」へのアクセスが許可されます。

AudioPermission

javax.sound.sampled.AudioPermissionクラスは、オーディオ・システム・リソースへのアクセス権を表します。AudioPermissionにはターゲット名が含まれますが、アクション・リストは含まれません。名前付きアクセス権を持つか、持たないかのどちらかになります。

ターゲット名はオーディオ・アクセス権の名前です(下記を参照)。命名は階層プロパティの命名規約に従います。また、アスタリスクを使用して、すべてのオーディオ・アクセス権を表すこともできます。

AudioPermissionに指定できるターゲット名を次の表に示します。この表では、名前ごとに、アクセス権で許可される正確な機能とコードにアクセス権を付与したときのリスクについて説明します。

アクセス権ターゲット名 アクセス権により許可される操作 このアクセス権を許可した場合のリスク
play システム上の1つ以上のオーディオ・デバイスを介したオーディオ再生。アプリケーションでは、オーディオ再生(レンダリング)を行うためのラインとミキサーの取得および操作が許可される。 このアクセス権により、1つのラインからのオーディオがシステム上で再生中のほかのオーディオとミックスされる可能性があり、また、ミキサーの操作が、そのミキサーを使用するすべてのラインのオーディオに影響を与えるため、ほかのアプリケーションに影響をおよぼす場合がある。
record システム上の1つ以上のオーディオ・デバイスを介したオーディオ録音。アプリケーションでは、オーディオ録音(取り込み)を行うためのラインとミキサーの取得および操作が許可される。 このアクセス権を使用するときには、ミキサーの操作は、そのミキサーを使用するすべてのラインのオーディオに影響するため、ほかのアプリケーションに影響を及ぼすことがある。このアクセス権によって、アプレットまたはアプリケーションはユーザーの音を聞くことができる。

JAXBPermission

このクラスはJAXBのアクセス権のために用意されています。JAXBPermissionには名前(「ターゲット名」とも呼ばれる)が含まれますが、アクション・リストは含まれません。名前付きアクセス権を持つか、持たないかのどちらかになります。

ターゲット名には、JAXBのアクセス権(下記を参照)の名前を指定します。

JAXBPermissionに指定できるターゲット名と、それで与えられるアクセス権により可能になる操作、および、そのアクセス権をコードに与えることにより生じるリスクを次の表に示します。

javax.xml.bind.JAXBPermissionターゲット名 アクセス権により許可される操作 このアクセス権を許可した場合のリスク
setDatatypeConverter DatatypeConverter上のすべてのメソッドが使用するthe setDatatypeConverter methodを使用して、VM全体のDatatypeConverterInterfaceをコードで設定できるようになります。 VM全体で単独のセマンティックスを持つDatatypeConverterInterfaceが、本物のJAXB実装によって設定される前に、悪意のあるコードによって設定される可能性があります。これにより、悪意のあるコードは、同じJVM内で実行されている別のアプリケーションに属するFrame.getFrames()など、通常であればアクセスできないオブジェクトにアクセスできるようになります。

WebServicePermission

このクラスは、Webサービスのアクセス権を定義します。

Webサービスのアクセス権は名前のみによって識別されます(「ターゲット名」とも呼ばれます)。これらに関連付けられているアクションはありません。

次のアクセス権ターゲット名が定義されています。

publishEndpoint

publishEndpointアクセス権は、javax.xml.ws.Endpointクラスによって定義されたpublishメソッドを使用した、Webサービス端点の公開を許可します。

publishEndpointを生成すると、アプリケーションはネットワーク・サービスとして公開されます。ランタイムのセキュリティと、アプリケーションのセキュリティによっては、リモートから攻撃を受けるセキュリティ・ホールとなることがあります。


メソッドとその呼出しに必要なアクセス権

ここでは、アクセス権が必要なすべてのメソッドを示すとともに、どのSecurityManagerメソッドを必要とするか、およびどのアクセス権がSecurityManagerメソッドのデフォルト実装によってチェックされるかを示します。

: このリストは完全ではなく、JDKの最近のバージョンで導入されたアクセス権を必要とするいくつかの新しいメソッドが含まれていません。SecurityExceptionをスローするメソッドと必要なアクセス権に関する追加の情報については、APIの仕様を参照してください。

したがって、SecurityManagerメソッドのデフォルトの実装により、右側の列の対応するエントリで示されているアクセス権が現在有効なポリシーで与えられている場合だけ、左側の列で示したメソッドを呼び出すことができます。例を次に示します。

メソッド 呼び出されるSecurityManagerメソッド アクセス権
java.awt.Toolkit
    getSystemEventQueue();
checkPermission java.awt.AWTPermission "accessEventQueue";

java.awt.ToolkitクラスのgetSystemEventQueueメソッドへの呼出しは、SecurityManagerメソッドcheckPermissionへの呼出しになることを指定します。これは、呼出しスタック上のコードに次のアクセス権が与えられている場合にのみ成功します。

  java.awt.AWTPermission "accessEventQueue";

次のような形式の場合、

メソッド 呼び出されるSecurityManagerメソッド アクセス権
 some.package.class
   public static void someMethod(String foo);
checkXXX SomePermission "{foo}";

アクセス権名中の文字列{foo}fooの実行時の値で置き換えられるという意味です。

次の例を見てください。

メソッド 呼び出されるSecurityManagerメソッド アクセス権
java.io.FileInputStream
    FileInputStream(String name)
checkRead(String) java.io.FilePermission "{name}", "read";

FileInputStreamメソッド(この場合はコンストラクタ)を、次のように引数nameに「/test/MyTestFile」を指定して呼び出したとします。

FileInputStream("/test/MyTestFile");

この呼出しは、現在のポリシーで次のアクセス権が設定され、「/test/MyTestFile」ファイルへの読取りアクセスが許可されていないと行えません。

java.io.FilePermission "/test/MyTestFile", "read";

より正確には、アクセス権は、このように明示的に設定されているか、次のように、別のアクセス権により暗黙に設定されている必要があります。

java.io.FilePermission "/test/*", "read";

/test」ディレクトリに含まれる任意のファイルへの読取りアクセスが許可されています。

中カッコで囲まれた項目が、特定のメソッド引数と同一ではなく、関係のある値を表す場合もあります。次はその例です。

メソッド 呼び出されるSecurityManagerメソッド アクセス権
java.net.DatagramSocket
  public synchronized void
      receive(DatagramPacket p);
checkAccept({host}, {port}) java.net.SocketPermission "{host}:{port}", "accept";

ここでは、適切なホストおよびポートの値がreceiveメソッドにより計算されて、checkAcceptに渡されます。

ほとんどの場合、呼び出されるSecurityManagerメソッドの名前のみが一覧表示されます。メソッドは、複数ある同名のメソッドのいずれかであり、引数の型も一覧表示されます。たとえば、checkRead(String)checkRead(FileDescriptor)などがあります。引数が関係するその他の場合にも、引数は一覧表示されます。

次の表は、パッケージ名の順に並べられています。つまり、最初にjava.awtパッケージ・クラス内のメソッド、次にjava.ioパッケージ・クラス内のメソッド、という順番です。

メソッドとその呼出しに必要なアクセス権
メソッド 呼び出されるSecurityManagerメソッド アクセス権
java.awt.Graphics2d
  public abstract void
    setComposite(Composite comp)
checkPermission このGraphics2Dコンテキストが表示画面上のComponentに描画中であり、かつCompositeがAlphaCompositeクラスのインスタンスではなく、カスタム・オブジェクトの場合、java.awt.AWTPermission "readDisplayPixels"。注: setCompositeメソッドは、実際には抽象であるため、セキュリティ・チェックを呼び出すことはできない。こうした条件下では、メソッドの実際の実装ごとに、java.awt.AWTPermission("readDisplayPixels")アクセス権でjava.lang.SecurityManager checkPermissionメソッドを呼び出すべきである。
java.awt.Robot
  public Robot()
  public Robot(GraphicsDevice screen)
checkPermission java.awt.AWTPermission "createRobot"
java.awt.Toolkit
  public void addAWTEventListener(
          AWTEventListener listener,
          long eventMask)
  public void removeAWTEventListener(
     AWTEventListener listener)
checkPermission java.awt.AWTPermission "listenToAllAWTEvents"
java.awt.Toolkit
  public abstract PrintJob getPrintJob(
           Frame frame, String jobtitle,
           Properties props)
checkPrintJobAccess

java.lang.RuntimePermission "queuePrintJob"

注: getPrintJobメソッドは、実際には抽象であるため、セキュリティ・チェックを呼び出すことはできない。このメソッドの実際の各実装部分では、java.lang.SecurityManagerのcheckPrintJobAccessメソッドを呼び出すべきであり、これは、アクセス権java.lang.RuntimePermission "queuePrintJob"が現在許可されている場合にのみ成功する。

java.awt.Toolkit
  public abstract Clipboard
                    getSystemClipboard()
checkPermission

java.awt.AWTPermission "accessClipboard"

注: getSystemClipboardメソッドは、実際には抽象であるため、セキュリティ・チェックを呼び出すことはできない。このメソッドの実際の各実装部分では、checkPermissionメソッドを呼び出すべきであり、これは、アクセス権java.awt.AWTPermission "accessClipboard"が現在許可されている場合にのみ成功する。

java.awt.Toolkit
  public final EventQueue
               getSystemEventQueue()
checkPermission java.awt.AWTPermission "accessEventQueue"
java.awt.Window
  Window()
checkPermission java.awt.AWTPermission "showWindowWithoutWarningBanner"が設定されていると、ウィンドウが表示されるときに、そのウィンドウがアプレットによって作成されていることを警告するバナーは表示されない。設定されていない場合は、バナーが表示される。
java.beans.Beans
  public static void setDesignTime(
                 boolean isDesignTime)
  public static void setGuiAvailable(
                 boolean isGuiAvailable)

java.beans.Introspector
  public static synchronized void
    setBeanInfoSearchPath(String path[])

java.beans.PropertyEditorManager
  public static void registerEditor(
                 Class targetType,
                 Class editorClass)
  public static synchronized void
    setEditorSearchPath(String path[])
checkPropertiesAccess java.util.PropertyPermission "*", "read,write"
java.io.File
  public boolean delete()
  public void deleteOnExit()
checkDelete(String) java.io.FilePermission "{name}", "delete"
java.io.FileInputStream
  FileInputStream(FileDescriptor fdObj)
checkRead(FileDescriptor) java.lang.RuntimePermission "readFileDescriptor"
java.io.FileInputStream
  FileInputStream(String name)
  FileInputStream(File file)

java.io.File
  public boolean exists()
  public boolean canRead()
  public boolean isFile()
  public boolean isDirectory()
  public boolean isHidden()
  public long lastModified()
  public long length()
  public String[] list()
  public String[] list(
           FilenameFilter filter)
  public File[] listFiles()
  public File[] listFiles(
           FilenameFilter filter)
  public File[] listFiles(
           FileFilter filter)

java.io.RandomAccessFile
  RandomAccessFile(String name, String mode)
  RandomAccessFile(File file, String mode)
      (where mode is "r" in both of these)
checkRead(String) java.io.FilePermission "{name}", "read"
java.io.FileOutputStream
  FileOutputStream(FileDescriptor fdObj)
checkWrite(FileDescriptor) java.lang.RuntimePermission "writeFileDescriptor"
java.io.FileOutputStream
  FileOutputStream(File file)
  FileOutputStream(String name)
  FileOutputStream(String name,
                   boolean append)

java.io.File
  public boolean canWrite()
  public boolean createNewFile()
  public static File createTempFile(
          String prefix, String suffix)
  public static File createTempFile(
          String prefix,  String suffix,
          File directory)
  public boolean mkdir()
  public boolean mkdirs()
  public boolean renameTo(File dest)
  public boolean setLastModified(long time)
  public boolean setReadOnly()
checkWrite(String) java.io.FilePermission "{name}", "write"
java.io.ObjectInputStream
  protected final boolean
    enableResolveObject(boolean enable);

java.io.ObjectOutputStream
  protected final boolean
    enableReplaceObject(boolean enable)
checkPermission java.io.SerializablePermission "enableSubstitution"
java.io.ObjectInputStream
  protected ObjectInputStream()

java.io.ObjectOutputStream
  protected ObjectOutputStream()
checkPermission java.io.SerializablePermission "enableSubclassImplementation"
java.io.RandomAccessFile
  RandomAccessFile(String name, String mode)
      (where mode is "rw")
checkRead(String) and checkWrite(String) java.io.FilePermission "{name}", "read,write"
java.lang.Class
  public static Class forName(
     String name, boolean initialize,
     ClassLoader loader)
checkPermission loaderがnullで、呼出し側のクラス・ローダーはnullでない場合、java.lang.RuntimePermission("getClassLoader")になる
java.lang.Class
  public ClassLoader getClassLoader()
checkPermission 呼出し側のクラス・ローダーがnullの場合、あるいは呼出し側のクラス・ローダーが、クラス・ローダーが要求されているクラスのクラス・ローダーと同じかその上位クラスの場合は、アクセス権は必要ない。それ以外の場合は、
java.lang.RuntimePermission "getClassLoader"
が必要。
java.lang.Class
  public Class[] getDeclaredClasses()
  public Field[] getDeclaredFields()
  public Method[] getDeclaredMethods()
  public Constructor[]
    getDeclaredConstructors()
  public Field getDeclaredField(
                       String name)
  public Method getDeclaredMethod(...)
  public Constructor
    getDeclaredConstructor(...)
checkMemberAccess(this, Member.DECLARED)、およびこのクラスがパッケージ内にある場合はcheckPackageAccess({pkgName}) 「この」クラスのクラス・ローダーが呼出し側のクラス・ローダーと同一である場合は、デフォルトのcheckMemberAccessはどのようなアクセス権も必要としない。同一でない場合は、java.lang.RuntimePermission "accessDeclaredMembers"が必要。このクラスがパッケージ内にある場合、java.lang.RuntimePermission "accessClassInPackage.{pkgName}"も必要。
java.lang.Class
  public Class[] getClasses()
  public Field[] getFields()
  public Method[] getMethods()
  public Constructor[] getConstructors()
  public Field getField(String name)
  public Method getMethod(...)
  public Constructor getConstructor(...)
checkMemberAccess(this, Member.PUBLIC)、およびこのクラスがパッケージ内にある場合はcheckPackageAccess({pkgName}) アクセス・タイプがMember.PUBLICの場合、デフォルトのcheckMemberAccessはどのようなアクセス権も必要としない。このクラスがパッケージ内にある場合、java.lang.RuntimePermission "accessClassInPackage.{pkgName}"が必要。
java.lang.Class
   public ProtectionDomain
            getProtectionDomain()
checkPermission java.lang.RuntimePermission "getProtectionDomain"
java.lang.ClassLoader
  ClassLoader()
  ClassLoader(ClassLoader parent)
checkCreateClassLoader java.lang.RuntimePermission "createClassLoader"
java.lang.ClassLoader
  public static ClassLoader
           getSystemClassLoader()
  public ClassLoader getParent()
checkPermission 呼出し側のクラス・ローダーがnullの場合、あるいは呼出し側のクラス・ローダーが、クラス・ローダーが要求されているクラスのクラス・ローダーと同じかその上位クラスの場合は、アクセス権は必要ない。それ以外の場合は、
java.lang.RuntimePermission "getClassLoader"
が必要。
java.lang.Runtime
  public Process exec(String command)
  public Process exec(String command,
                      String envp[])
  public Process exec(String cmdarray[])
  public Process exec(String cmdarray[],
                      String envp[])
checkExec java.io.FilePermission "{command}", "execute"
java.lang.Runtime
  public void exit(int status)
  public static void
      runFinalizersOnExit(boolean value)
java.lang.System
  public static void exit(int status)
  public static void
      runFinalizersOnExit(boolean value)
checkExit(status)。このとき、runFinalizersOnExitに対してstatusは0 java.lang.RuntimePermission "exitVM.{status}"
java.lang.Runtime
  public void addShutdownHook(Thread hook)
  public boolean removeShutdownHook(Thread hook)
checkPermission java.lang.RuntimePermission "shutdownHooks"
java.lang.Runtime
  public void load(String lib)
  public void loadLibrary(String lib)
java.lang.System
  public static void load(String filename)
  public static void loadLibrary(
                          String libname)
checkLink({libName})ただし、{libName}はlib、filenameまたはlibname引数 java.lang.RuntimePermission "loadLibrary.{libName}"
java.lang.SecurityManager methods
checkPermission 次の表を参照。
java.lang.System
  public static Properties
      getProperties()
  public static void
      setProperties(Properties props)
checkPropertiesAccess java.util.PropertyPermission "*", "read,write"
java.lang.System
  public static String
      getProperty(String key)
  public static String
      getProperty(String key, String def)
checkPropertyAccess java.util.PropertyPermission "{key}", "read"
java.lang.System
  public static void setIn(InputStream in)
  public static void setOut(PrintStream out)
  public static void setErr(PrintStream err)
checkPermission java.lang.RuntimePermission "setIO"
java.lang.System
  public static String
    setProperty(String key, String value)
checkPermission java.util.PropertyPermission "{key}", "write"
java.lang.System
  public static synchronized void
    setSecurityManager(SecurityManager s)
checkPermission java.lang.RuntimePermission "setSecurityManager"
java.lang.Thread
  public ClassLoader getContextClassLoader()
checkPermission 呼出し側のクラス・ローダーがnullの場合、あるいは呼出し側のクラス・ローダーが、コンテキスト・クラス・ローダーが要求されているスレッドのコンテキスト・クラス・ローダーと同じかその上位クラスの場合は、アクセス権は必要ない。それ以外の場合は、
java.lang.RuntimePermission "getClassLoader"
が必要。
java.lang.Thread
  public void setContextClassLoader
                      (ClassLoader cl)
checkPermission java.lang.RuntimePermission "setContextClassLoader"
java.lang.Thread
  public final void checkAccess()
  public void interrupt()
  public final void suspend()
  public final void resume()
  public final void setPriority
                     (int newPriority)
  public final void setName(String name)
  public final void setDaemon(boolean on)
checkAccess(this) java.lang.RuntimePermission "modifyThread"
java.lang.Thread
  public static int
      enumerate(Thread tarray[])
checkAccess({threadGroup}) java.lang.RuntimePermission "modifyThreadGroup"
java.lang.Thread
  public final void stop()
checkAccess(this)。現在のスレッドが自分以外のスレッドを停止させようとしている場合は、checkPermissionも呼び出される。 java.lang.RuntimePermission "modifyThread"。
現在のスレッドが自分以外のスレッドを停止させようとしている場合、java.lang.RuntimePermission "stopThread"も必要。
java.lang.Thread
  public final synchronized void
                    stop(Throwable obj)
checkAccess(this)。現在のスレッドが自分以外のスレッドを停止させようとしている場合、またはobjがThreadDeathのインスタンスでない場合は、checkPermissionも呼び出される。 java.lang.RuntimePermission "modifyThread"。
現在のスレッドが自分以外のスレッドを停止させようとしている場合、またはobjがThreadDeathのインスタンスではない場合は、java.lang.RuntimePermission "stopThread"も必要。
java.lang.Thread
  Thread()
  Thread(Runnable target)
  Thread(String name)
  Thread(Runnable target, String name)

java.lang.ThreadGroup
  ThreadGroup(String name)
  ThreadGroup(ThreadGroup parent,
              String name)
checkAccess({parentThreadGroup}) java.lang.RuntimePermission "modifyThreadGroup"
java.lang.Thread
  Thread(ThreadGroup group, ...)

java.lang.ThreadGroup
  public final void checkAccess()
  public int enumerate(Thread list[])
  public int enumerate(Thread list[],
      boolean recurse)
  public int enumerate(ThreadGroup list[])
  public int enumerate(ThreadGroup list[],
      boolean recurse)
  public final ThreadGroup getParent()
  public final void
      setDaemon(boolean daemon)
  public final void setMaxPriority(int pri)
  public final void suspend()
  public final void resume()
  public final void destroy()
ThreadGroupメソッドの場合はcheckAccess(this)、Threadメソッドの場合はcheckAccess(group) java.lang.RuntimePermission "modifyThreadGroup"
java.lang.ThreadGroup
  public final void interrupt()
checkAccess(this) java.lang.RuntimePermission "modifyThreadGroup"が必要。
また、スレッド・グループとそのすべてのサブグループのスレッドごとにjava.lang.Thread interrupt()メソッドが呼び出されるため、java.lang.RuntimePermission "modifyThread"も必要。Thread interrupt()メソッドを参照。
java.lang.ThreadGroup
  public final void stop()
checkAccess(this) java.lang.RuntimePermission "modifyThreadGroup"が必要。
また、java.lang.Threadのstop()メソッドは、そのスレッド・グループおよびすべてのサブグループでスレッドごとに呼び出されるので、java.lang.RuntimePermission "modifyThread"および場合によってはjava.lang.RuntimePermission "stopThread"が必要。Threadのstop()メソッドを参照。
java.lang.reflect.AccessibleObject
  public static void setAccessible(...)
  public void setAccessible(...)
checkPermission java.lang.reflect.ReflectPermission "suppressAccessChecks"
java.net.Authenticator
  public static PasswordAuthentication
       requestPasswordAuthentication(
             InetAddress addr,
             int port,
             String protocol,
             String prompt,
             String scheme)
checkPermission java.net.NetPermission "requestPasswordAuthentication"
java.net.Authenticator
  public static void
      setDefault(Authenticator a)
checkPermission java.net.NetPermission "setDefaultAuthenticator"
java.net.MulticastSocket
  public void
      joinGroup(InetAddress mcastaddr)
  public void
      leaveGroup(InetAddress mcastaddr)
checkMulticast(InetAddress) java.net.SocketPermission( mcastaddr.getHostAddress(), "accept,connect")
java.net.DatagramSocket
  public void send(DatagramPacket p)
checkMulticast(p.getAddress())またはcheckConnect(
p.getAddress().getHostAddress(), p.getPort())
if (p.getAddress().isMulticastAddress()) {
java.net.SocketPermission(
(p.getAddress()).getHostAddress(), "accept,connect")
}
else {
port = p.getPort();
host = p.getAddress().getHostAddress();
if (port == -1) java.net.SocketPermission "{host}","resolve";
else java.net.SocketPermission "{host}:{port}","connect"
}
java.net.MulticastSocket
  public synchronized void
      send(DatagramPacket p, byte ttl)
checkMulticast(p.getAddress(), ttl)またはcheckConnect(
p.getAddress().getHostAddress(), p.getPort())
if (p.getAddress().isMulticastAddress()) {
java.net.SocketPermission(
(p.getAddress()).getHostAddress(), "accept,connect")
}
else {
port = p.getPort();
host = p.getAddress().getHostAddress();
if (port == -1) java.net.SocketPermission "{host}","resolve";
else java.net.SocketPermission "{host}:{port}","connect"
}
java.net.InetAddress
  public String getHostName()
  public static InetAddress[]
                  getAllByName(String host)
  public static InetAddress getLocalHost()

java.net.DatagramSocket
  public InetAddress getLocalAddress()
checkConnect({host}, -1) java.net.SocketPermission "{host}", "resolve"
java.net.ServerSocket
  ServerSocket(...)

java.net.DatagramSocket
  DatagramSocket(...)

java.net.MulticastSocket
  MulticastSocket(...)
checkListen({port}) java.net.SocketPermission "localhost:{port}","listen";
java.net.ServerSocket
  public Socket accept()
  protected final void implAccept(Socket s)
checkAccept({host}, {port}) java.net.SocketPermission "{host}:{port}", "accept"
java.net.ServerSocket
  public static synchronized void
      setSocketFactory(...)

java.net.Socket
  public static synchronized void
      setSocketImplFactory(...)

java.net.URL
  public static synchronized void
      setURLStreamHandlerFactory(...)

 java.net.URLConnection
   public static synchronized void
      setContentHandlerFactory(...)
   public static void
      setFileNameMap(FileNameMap map)

java.net.HttpURLConnection
   public static void
       setFollowRedirects(boolean set)

java.rmi.activation.ActivationGroup
  public static synchronized
        ActivationGroup createGroup(...)
  public static synchronized void
      setSystem(ActivationSystem system)

java.rmi.server.RMISocketFactory
   public synchronized static void
      setSocketFactory(...)
checkSetFactory java.lang.RuntimePermission "setFactory"
java.net.Socket
  Socket(...)
checkConnect({host}, {port}) java.net.SocketPermission "{host}:{port}", "connect"
java.net.DatagramSocket
  public synchronized void
      receive(DatagramPacket p)
checkAccept({host}, {port}) java.net.SocketPermission "{host}:{port}", "accept"
java.net.URL
  URL(...)
checkPermission java.net.NetPermission "specifyStreamHandler"
java.net.URLClassLoader
  URLClassLoader(...)
checkCreateClassLoader java.lang.RuntimePermission "createClassLoader"
java.security.AccessControlContext
  public AccessControlContext(AccessControlContext acc,
                                DomainCombiner combiner)
  public DomainCombiner getDomainCombiner()
checkPermission java.security.SecurityPermission "createAccessControlContext"
java.security.Identity
  public void addCertificate(...)
checkSecurityAccess(
"addIdentityCertificate")
java.security.SecurityPermission "addIdentityCertificate"
java.security.Identity
  public void removeCertificate(...)
checkSecurityAccess(
"removeIdentityCertificate")
java.security.SecurityPermission "removeIdentityCertificate"
java.security.Identity
  public void setInfo(String info)
checkSecurityAccess(
"setIdentityInfo")
java.security.SecurityPermission "setIdentityInfo"
java.security.Identity
  public void setPublicKey(PublicKey key)
checkSecurityAccess(
"setIdentityPublicKey")
java.security.SecurityPermission "setIdentityPublicKey"
java.security.Identity
  public String toString(...)
checkSecurityAccess(
"printIdentity")
java.security.SecurityPermission "printIdentity"
java.security.IdentityScope
  protected static void setSystemScope()
checkSecurityAccess(
"setSystemScope")
java.security.SecurityPermission "setSystemScope"
java.security.Permission
  public void checkGuard(Object object)
checkPermission(this) このアクセス権オブジェクトはチェックされたアクセス権である
java.security.Policy
  public static Policy getPolicy()
checkPermission java.security.SecurityPermission "getPolicy"
java.security.Policy
  public static void
      setPolicy(Policy policy)
checkPermission java.security.SecurityPermission "setPolicy"
java.security.Policy
  public static Policy
      getInstance(String type, SpiParameter params)
      getInstance(String type, SpiParameter params, String provider)
      getInstance(String type, SpiParameter params, Provider provider)

checkPermission java.security.SecurityPermission "createPolicy.{type}"
java.security.Provider
  public synchronized void clear()
checkSecurityAccess(
"clearProviderProperties."+{name})
java.security.SecurityPermission "clearProviderProperties.{name}" (nameはプロバイダ名)
java.security.Provider
  public synchronized Object
      put(Object key, Object value)
checkSecurityAccess(
"putProviderProperty."+{name})
java.security.SecurityPermission "putProviderProperty.{name}" (nameはプロバイダ名)
java.security.Provider
  public synchronized Object
      remove(Object key)
checkSecurityAccess(
"removeProviderProperty."+{name})
java.security.SecurityPermission "removeProviderProperty.{name}" (nameはプロバイダ名)
java.security.SecureClassLoader
  SecureClassLoader(...)
checkCreateClassLoader java.lang.RuntimePermission "createClassLoader"
java.security.Security
  public static void getProperty(String key)
checkPermission java.security.SecurityPermission "getProperty.{key}"
java.security.Security
  public static int
      addProvider(Provider provider)
  public static int
      insertProviderAt(Provider provider,
                       int position);
checkSecurityAccess(
"insertProvider."+provider.getName())
java.security.SecurityPermission "insertProvider.{name}"
java.security.Security
  public static void
      removeProvider(String name)
checkSecurityAccess(
"removeProvider."+name)
java.security.SecurityPermission "removeProvider.{name}"
java.security.Security
  public static void
    setProperty(String key, String datum)
checkSecurityAccess(
"setProperty."+key)
java.security.SecurityPermission "setProperty.{key}"
java.security.Signer
  public PrivateKey getPrivateKey()
checkSecurityAccess(
"getSignerPrivateKey")
java.security.SecurityPermission "getSignerPrivateKey"
java.security.Signer
  public final void
      setKeyPair(KeyPair pair)
checkSecurityAccess(
"setSignerKeypair")
java.security.SecurityPermission "setSignerKeypair"
java.sql.DriverManager
  public static synchronized void
      setLogWriter(PrintWriter out)
checkPermission java.sql.SQLPermission "setLog"
java.sql.DriverManager
  public static synchronized void
      setLogStream(PrintWriter out)
checkPermission java.sql.SQLPermission "setLog"
java.util.Locale
  public static synchronized void
            setDefault(Locale newLocale)
checkPermission java.util.PropertyPermission "user.language","write"
java.util.zip.ZipFile
  ZipFile(String name)
checkRead java.io.FilePermission "{name}","read"
javax.security.auth.Subject
    public static Subject getSubject(final AccessControlContext acc)
checkPermission javax.security.auth.AuthPermission "getSubject"
javax.security.auth.Subject
    public void setReadOnly()
checkPermission javax.security.auth.AuthPermission "setReadOnly"
javax.security.auth.Subject
    public static Object doAs(final Subject subject,
                                final PrivilegedAction action)
checkPermission javax.security.auth.AuthPermission "doAs"
javax.security.auth.Subject
    public static Object doAs(final Subject subject,
                                final PrivilegedExceptionAction action)
        throws java.security.PrivilegedActionException
checkPermission javax.security.auth.AuthPermission "doAs"
javax.security.auth.Subject
    public static Object doAsPrivileged(final Subject subject,
                                final PrivilegedAction action,
                                final AccessControlContext acc)
checkPermission javax.security.auth.AuthPermission "doAsPrivileged"
javax.security.auth.Subject
    public static Object doAsPrivileged(final Subject subject,
                                final PrivilegedExceptionAction action,
                                final AccessControlContext acc)
        throws java.security.PrivilegedActionException
checkPermission javax.security.auth.AuthPermission "doAsPrivileged"
javax.security.auth.SubjectDomainCombiner
    public Subject getSubject()
checkPermission javax.security.auth.AuthPermission "getSubjectFromDomainCombiner"
javax.security.auth.SubjectDomainCombiner
    public Subject getSubject()
checkPermission javax.security.auth.AuthPermission "getSubjectFromDomainCombiner"
javax.security.auth.login.LoginContext
    public LoginContext(String name)
        throws LoginException
checkPermission javax.security.auth.AuthPermission "createLoginContext.{name}"
javax.security.auth.login.LoginContext
    public LoginContext(String name,
                        Subject subject)
         throws LoginException
checkPermission javax.security.auth.AuthPermission "createLoginContext.{name}"
javax.security.auth.login.LoginContext
    public LoginContext(String name,
                        CallbackHandler callbackHandler)
         throws LoginException
checkPermission javax.security.auth.AuthPermission "createLoginContext.{name}"
javax.security.auth.login.LoginContext
    public LoginContext(String name,
                        Subject subject,
                        CallbackHandler callbackHandler)
         throws LoginException
checkPermission javax.security.auth.AuthPermission "createLoginContext.{name}"
javax.security.auth.login.Configuration
    public static Configuration getConfiguration()
checkPermission javax.security.auth.AuthPermission "getLoginConfiguration"
javax.security.auth.login.Configuration
    public static void setConfiguration(Configuration configuration)
checkPermission javax.security.auth.AuthPermission "setLoginConfiguration"
javax.security.auth.login.Configuration
    public static void refresh()
checkPermission javax.security.auth.AuthPermission "refreshLoginConfiguration"
javax.security.auth.login.Configuration
  public static Configuration
      getInstance(String type, SpiParameter params)
      getInstance(String type, SpiParameter params, String provider)
      getInstance(String type, SpiParameter params, Provider provider)

checkPermission javax.security.auth.AuthPermission "createLoginConfiguration.{type}"



java.lang.SecurityManagerメソッドのアクセス権チェック

この表では、java.lang.SecurityManagerメソッドのデフォルトの実装によってチェックされるアクセス権を示します。

指定された各checkメソッドはSecurityManager checkPermissionメソッドを指定されたアクセス権で呼び出します(コンテキスト引数を取るcheckConnectおよびcheckReadメソッドを除く)。これらのメソッドは、AccessControlContextコンテキストを想定し、コンテキストのcheckPermissionメソッドを指定されたアクセス権で呼び出します。

メソッド アクセス権
public void checkAccept(String host, int port); java.net.SocketPermission "{host}:{port}", "accept";
public void checkAccess(Thread t); java.lang.RuntimePermission "modifyThread";
public void checkAccess(ThreadGroup g); java.lang.RuntimePermission "modifyThreadGroup";
public void checkAwtEventQueueAccess();
: このメソッドは非推奨です。かわりに次を使用してください。
public void checkPermission(Permission perm);
java.awt.AWTPermission "accessEventQueue";
public void checkConnect(String host, int port); if (port == -1) java.net.SocketPermission "{host}","resolve";
else java.net.SocketPermission "{host}:{port}","connect";
public void checkConnect(String host, int port, Object context); if (port == -1) java.net.SocketPermission "{host}","resolve";
else java.net.SocketPermission "{host}:{port}","connect";
public void checkCreateClassLoader(); java.lang.RuntimePermission "createClassLoader";
public void checkDelete(String file); java.io.FilePermission "{file}", "delete";
public void checkExec(String cmd); if cmd is an absolute path:java.io.FilePermission "{cmd}", "execute";
else java.io.FilePermission "<<ALL_FILES>>", "execute";
public void checkExit(int status); java.lang.RuntimePermission "exitVM.{status}";
public void checkLink(String lib); java.lang.RuntimePermission "loadLibrary.{lib}";
public void checkListen(int port); java.net.SocketPermission "localhost:{port}","listen";
public void checkMemberAccess(Class clazz, int which);
: このメソッドは非推奨です。かわりに次を使用してください。
public void checkPermission(Permission perm);
if (which != Member.PUBLIC) {
  if (currentClassLoader() != clazz.getClassLoader()) {
    checkPermission(
      new java.lang.RuntimePermission("accessDeclaredMembers"));
  }
}
public void checkMulticast(InetAddress maddr); java.net.SocketPermission(maddr.getHostAddress(),"accept,connect");
public void checkMulticast(InetAddress maddr, byte ttl);
: このメソッドは非推奨です。かわりに次を使用してください。
public void checkPermission(Permission perm);
java.net.SocketPermission(maddr.getHostAddress(),"accept,connect");
public void checkPackageAccess(String pkg); java.lang.RuntimePermission "accessClassInPackage.{pkg}";
public void checkPackageDefinition(String pkg); java.lang.RuntimePermission "defineClassInPackage.{pkg}";
public void checkPrintJobAccess(); java.lang.RuntimePermission "queuePrintJob";
public void checkPropertiesAccess(); java.util.PropertyPermission "*", "read,write";
public void checkPropertyAccess(String key); java.util.PropertyPermission "{key}", "read,write";
public void checkRead(FileDescriptor fd); java.lang.RuntimePermission "readFileDescriptor";
public void checkRead(String file); java.io.FilePermission "{file}", "read";
public void checkRead(String file, Object context); java.io.FilePermission "{file}", "read";
public void checkSecurityAccess(String target); java.security.SecurityPermission "{target}";
public void checkSetFactory(); java.lang.RuntimePermission "setFactory";
public void checkSystemClipboardAccess();
: このメソッドは非推奨です。かわりに次を使用してください。
public void checkPermission(Permission perm);
java.awt.AWTPermission "accessClipboard";
public boolean checkTopLevelWindow(Object window);
: このメソッドは非推奨です。かわりに次を使用してください。
public void checkPermission(Permission perm);
java.awt.AWTPermission "showWindowWithoutWarningBanner";
public void checkWrite(FileDescriptor fd); java.lang.RuntimePermission "writeFileDescriptor";
public void checkWrite(String file); java.io.FilePermission "{file}", "write";
public SecurityManager(); java.lang.RuntimePermission "createSecurityManager";

Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.