アクセス権は、システム・リソースへのアクセスを表します。アプレット(またはセキュリティ・マネージャとともに実行するアプリケーション)が、リソースへのアクセスを許可されるためには、アクセスを試みるコードに対し、該当するアクセス権を明示的に与える必要があります。
一般に、アクセス権には名前(「ターゲット名」とも呼ばれる)があり、場合によっては、カンマで区切られた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.awt.AWTPermission
java.io.FilePermission
java.io.SerializablePermission
java.lang.management.ManagementPermission
java.lang.reflect.ReflectPermission
java.lang.RuntimePermission
java.net.NetPermission
java.net.SocketPermission
java.net.URLPermission
java.nio.file.LinkPermission
java.security.AllPermission
java.security.SecurityPermission
java.security.UnresolvedPermission
java.sql.SQLPermission
java.util.logging.LoggingPermission
java.util.PropertyPermission
javax.management.MBeanPermission
javax.management.MBeanServerPermission
javax.management.MBeanTrustPermission
javax.management.remote.SubjectDelegationPermission
javax.net.ssl.SSLPermission
javax.security.auth.AuthPermission
javax.security.auth.kerberos.DelegationPermission
javax.security.auth.kerberos.ServicePermission
javax.security.auth.PrivateCredentialPermission
javax.sound.sampled.AudioPermission
javax.xml.bind.JAXBPermission
javax.xml.ws.WebServicePermission
アクセス権や、スーパー・クラス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のinterrupt 、stop 、suspend 、resume 、setDaemon 、setPriority 、setName 、およびsetUncaughtExceptionHandler メソッドの呼び出しなどによるスレッドの変更 |
攻撃者がシステム内の任意のスレッドの動作を変更できるようになります。 |
stopThread |
Threadのstop メソッドの呼出しによるスレッドの停止 |
スレッドへのアクセス権をすでに取得している場合、コードから、システム内のどのスレッドでも停止できるようになります。実行中のスレッドが終了させられ、システムが破壊される可能性があります。 |
modifyThreadGroup |
ThreadGroupのdestroy 、getParent 、resume 、setDaemon 、setMaxPriority 、stop 、およびsuspend メソッドの呼び出しなどによるスレッド・グループの変更 |
攻撃者は、スレッド・グループを作成してその実行優先順位を設定できます。 |
getProtectionDomain |
クラスのProtectionDomain の取得 |
コードから、特定のコード・ソースのポリシー情報を取得できるようになります。ポリシー情報が盗まれてもシステムのセキュリティが脅かされるわけではないが、攻撃の狙いをより正確に定めるためのローカル・ファイル名などの追加情報を攻撃者に与えてしまうことになります。 |
getFileSystemAttributes |
ファイル・システム属性の取得 | 呼出し側に使用可能なディスク使用量やディスク容量などのファイル・システム情報を、コードで取得できるようにします。これは、システムのハードウェア構成に関する情報と呼出し側のファイルの書込み特権に関する一部の情報を開示するため、危険を伴う可能性があります。 |
readFileDescriptor |
ファイル記述子の読取り | コードから、読み出したファイル記述子に関連付けられているファイルを読み出すことができるようになります。ファイルに機密データが含まれている場合、このアクセス権は危険です。 |
writeFileDescriptor |
ファイル記述子への書込み | コードから、そのファイル記述子に関連付けられているファイルに書き込めるようになります。悪意のあるコードにより、ウィルスが仕掛けられたり、ディスクをいっぱいにされたりする可能性があるため、このアクセス権は危険です。 |
loadLibrary.{library name} |
特定のライブラリへの動的リンク | Javaのセキュリティ・アーキテクチャが、ネイティブ・コードのレベルで悪意のある動作を防止するようには設計されていないため、ネイティブ・コード・ライブラリをロードするアクセス権をアプレットに与えるのは危険です。 |
accessClassInPackage. |
クラス・ローダーがセキュリティ・マネージャのcheckPackageAcesss メソッドを呼び出すときに、クラス・ローダーのloadClass メソッドを介して、指定されたパッケージにアクセスする |
通常はアクセスできないパッケージ内のクラスに、コードからアクセスできるようになります。このため、悪意のあるコードが、このようなクラスを利用してシステムのセキュリティを脅かす可能性があります。 |
defineClassInPackage. |
クラス・ローダーがセキュリティ・マネージャのcheckPackageDefinition メソッドを呼び出すときに、そのクラス・ローダーのdefineClass メソッドを使用して、指定したパッケージ内にクラスを定義する。 |
これにより、特定のパッケージ内にクラスを定義するためのアクセス権をコードに与えることになります。このアクセス権が与えられた悪意のあるコードは、java.security やjava.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アクセス権を参照してください。 |
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文字列は次のような構造が期待されます。
scheme : // authority [ / path ]schemeは一般にhttpまたはhttpsになりますが、このクラスによって制限されません。authorityは次のように指定されます。
authority = [ userinfo @ ] hostrange [ : portrange ] portrange = portnumber | -portnumber | portnumber-[portnumber] | * hostrange = ([*.] dnsname) | IPv4address | IPv6addressdnsnameは標準DNSホスト名またはドメイン名で、つまり「.」によって区切られた1つ以上のラベルです。IPv4addressは標準のリテラルIPv4アドレスで、IPv6addressはRFC 2732で定義されているとおりです。ただし、リテラルIPv6アドレスは「[]」文字で囲む必要があります。dnsnameの指定は、「*.」を先頭に付けることができ、これは名前が、右端のドメイン・ラベルがこの名前と同じすべてのホスト名に一致することを意味します。たとえば、「*.oracle.com」は「foo.bar.oracle.com」に一致します。
portrangeは、このアクセス権が適用されているポート番号、またはバインドされているかバインドされていないポートの範囲を指定するために使用します。ポート範囲が存在しないか、無効の場合、schemeがhttp
(デフォルトは80)またはhttps
(デフォルトは443)であれば、デフォルトのポート番号が想定されます。他のschemeの場合デフォルトは想定されません。すべてのポートを意味するワイルドカードを指定できます。
userinfoはオプションです。userinfoコンポーネントは存在する場合に、URLPermissionの作成時に無視され、このクラスによって定義されている他のすべてのメソッドに影響しません。
pathコンポーネントは「/」文字によって区切られたパス・セグメントのシーケンスから構成されます。pathは空にすることもできます。パスはFilePermission
のパスと同じように指定します。次の例に示すように、3つの異なる方法があります。
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
オブジェクトを使うと、Policy
、Security
、Provider
、Signer
、およびIdentity
オブジェクトへのアクセスを保護できます。
SecurityPermission
に指定できるターゲット名と、それで与えられるアクセス権により可能になる操作、および、そのアクセス権をコードに与えることにより生じるリスクを次の表に示します。
java.security.SecurityPermission ターゲット名 |
アクセス権により許可される操作 | このアクセス権を許可した場合のリスク |
---|---|---|
createAccessControlContext |
AccessControlContext の作成 |
これにより、DomainCombiner を使用してAccessControlContext をインスタンス化できます。このアクセス権を付与するときは、十分な注意を払う必要があります。悪意のあるコードは、コードに与えるアクセス権のセットを拡張したり、コードAllPermission さえも付与したりするDomainCombiner を作成する可能性があります。 |
getDomainCombiner |
AccessControlContext のDomainCombiner の取得 |
特定の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を利用しているプログラムのほかの部分の動作が変更されたり、その実行が無効になったりする可能性があります。 |
アクセス権Identity
、IdentityScope
、Signer
は、非推奨のクラスに関連付けられています。それらの使用は非推奨です。詳細については、該当するクラスを参照してください。
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
がチェックするアクセス権です。
java.sql.DriverManager.setLogWriter
java.sql.DriverManager.setLogStream
(非推奨)javax.sql.rowset.spi.SyncFactory.setJNDIContext
javax.sql.rowset.spi.SyncFactory.setLogger
java.sql.Connection.setNetworktimeout
java.sql.Connection.abort
SQLPermission
オブジェクトがない場合、これらのメソッドは実行時例外としてjava.lang.SecurityException
をスローします。
SQLPermission
オブジェクトには名前(「ターゲット名」とも呼ばれる)は含まれますが、アクション・リストは含まれません。したがって、名前付きアクセス権が存在するか、存在しないかのどちらかになります。ターゲット名はアクセス権の名前です(可能なすべてのSQLPermission
名を示す次の表を参照してください)。命名規約は、階層的なプロパティ命名規約に従います。また、アスタリスク(*
)を名前の最後に、ドット(.
)の後、または単独で指定して、ワイルドカードによる照合を示すこともできます。たとえば、loadLibrary.*
や*
は有効ですが、*loadLibrary
やa*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つの項目の情報が含まれます。
アクション。ユーザーが必要とするアクセス権の場合、下記のリストのいずれかのアクション。ユーザーに付与されているアクセス権の場合、カンマで区切られた形式のアクション・リストまたは*
(すべてのアクション)。
アクションはgetActions()
によって返される。
クラス名。
ユーザーが必要とするアクセス権の場合、これはユーザーがアクセスしているMBean
のクラス名で、MBeanServer.getMBeanInfo(name)
.getClassName()
によって返される。特定の操作ではクラス名を参照せず、その場合クラス名はnull。
ユーザーに付与されているアクセス権の場合、空またはクラス名パターン。クラス名パターンは、ドット区切り形式のクラス名のJava規約に従った文字列。末尾に「.*
」を指定することにより、「.*
」の前の文字列で始まるすべてのクラスへのアクセスが付与される。たとえば、「javax.management.*
」の場合、ほかのクラスの間でjavax.management.MBeanServerDelegate
およびjavax.management.timer.Timer
へのアクセスが付与される。
クラス名パターンとして、空文字列または「*
」を指定することもできる。どちらの場合も、すべてのクラスへのアクセスが付与される。
メンバー。
ユーザーが必要とするアクセス権の場合、ユーザーがアクセスしようとしている属性またはオペレーションの名前。属性やオペレーションを参照しないオペレーションの場合、メンバーはnull。
ユーザーに付与されているアクセス権の場合、ユーザーがアクセスできる属性またはオペレーションの名前。空文字列または「*
」が指定された場合、すべてのメンバーへのアクセスが付与される。
オブジェクト名。
ユーザーが必要とするアクセス権の場合、これはユーザーがアクセスしているMBean
のObjectName
。単一のMBean
を参照しない操作の場合、null。オブジェクト名パターンには当てはまらない。
ユーザーに付与されているアクセス権の場合、ユーザーがアクセスできるMBean
または複数のMBean
のObjectName
。オブジェクト名パターンを指定した場合、パターンに一致する名前を持つすべてのMBean
にアクセスが付与される。空文字列を指定した場合、名前には関係なくすべてのMBeanにアクセスが付与される。
MBeanPermission
を付与されている場合は、この4つの項目すべてが満たされた場合にのみ操作が許可されます。
クラス名、メンバーおよびオブジェクト名はまとめて単一の文字列として書き込むことができ、これはこのアクセス権の名前になります。アクセス権の名前は、getName()
で返される文字列です。文字列の形式:
className#member[objectName]
オブジェクト名は、ObjectName
の通常構文によって書き込まれます。オブジェクト名には、]
を含む有効な文字を含めることができます。文字列の末尾の文字は]
です。
1つ以上のclassName
、member
またはobjectName
は省略できます。member
を省略した場合、#
も省略できます(ただしそうする必要はありません)。objectName
を省略した場合、[]
も省略できます(ただしそうする必要はありません)。3つすべての項目を省略することは適切でなく、それは空の文字列の名前を持つことになります。
className
、member
、objectName
には、null値を表す文字「-
」を指定できます。null値はすべての値(別のnull値を含む)に含まれますが、その他の値を含むことはありません。
addNotificationListener
getAttribute
getClassLoader
getClassLoaderFor
getClassLoaderRepository
getDomains
getMBeanInfo
getObjectInstance
instantiate
invoke
isInstanceOf
queryMBeans
queryNames
registerMBean
removeNotificationListener
setAttribute
unregisterMBean
カンマで区切られた形式のアクション・リストでは、各アクションの前後にスペースを挿入できます。
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)
メソッドを使用して、MBeanServerFactory
のMBeanServer
への参照を削除する。
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 |
SSLSession のSSLSessionContext を取得する。 |
悪意のあるコードが、SSLピアを使用して確立されたセッションをモニターしたり、セッションを無効にしてパフォーマンスを低下させたりする可能性があります。 |
setDefaultSSLContext |
デフォルトのSSLコンテキストを設定する。 | デフォルトのSSLコンテキストを設定してアプリケーションでデフォルトのSSLContextを使用すると、悪意のあるコードが、保証されていないトラスト・データ、鍵データ、乱数ジェネレータを使用したり、危険なSSLソケット・ファクトリやSSLサーバー・ソケット・ファクトリを使用したりする可能性があります。 |
AuthPermission
javax.security.auth.AuthPermission
クラスは、認証アクセス権を表します。AuthPermission
には名前(「ターゲット名」とも呼ばれる)は含まれますが、アクション・リストは含まれません。名前付きアクセス権を得るか、得ないかのどちらかになります。
現在、AuthPermission
オブジェクトを使うと、Subject
、SubjectDomainCombiner
、LoginContext
、および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} |
指定したnameでLoginContext をインスタンス化する |
セキュリティ上の問題から、管理者はすべての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 |
呼出し側が、資格を使用して、特定のプリンシパルとしてセキュリティ・コンテキストを受け入れることができる。 |
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文内にCodebase
、SignedBy
、または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
JAXBPermission
には名前(「ターゲット名」とも呼ばれる)が含まれますが、アクション・リストは含まれません。名前付きアクセス権を持つか、持たないかのどちらかになります。
ターゲット名には、JAXBのアクセス権(下記を参照)の名前を指定します。
JAXBPermission
に指定できるターゲット名と、それで与えられるアクセス権により可能になる操作、および、そのアクセス権をコードに与えることにより生じるリスクを次の表に示します。
javax.xml.bind.JAXBPermissionターゲット名 | アクセス権により許可される操作 | このアクセス権を許可した場合のリスク |
---|---|---|
setDatatypeConverter |
DatatypeConverter 上のすべてのメソッドが使用するthe setDatatypeConverter method を使用して、VM全体のDatatypeConverterInterface をコードで設定できるようになります。
|
VM全体で単独のセマンティックスを持つDatatypeConverterInterface が、本物のJAXB実装によって設定される前に、悪意のあるコードによって設定される可能性があります。これにより、悪意のあるコードは、同じJVM内で実行されている別のアプリケーションに属するFrame.getFrames() など、通常であればアクセスできないオブジェクトにアクセスできるようになります。
|
WebServicePermission
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
メソッドのデフォルトの実装によってチェックされるアクセス権を示します。
指定された各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"; |