Java™ SE 7 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 版) (Windows 版) を参照してください。Policy Tool を使うと、入力やポリシーファイルの構文規則を記憶する手間を減らすことができます。

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

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

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

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


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

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

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.{provider name} 指定した新しいプロバイダの追加。 悪意のあるプロバイダ (受け取った非公開鍵を暴露するプロバイダなど) を、もっとも高い優先順位を持つプロバイダとして追加できるようになります。これは、インストールされているプロバイダを管理する現在の Security オブジェクトは、プロバイダを追加する前に、その整合性や信頼性のチェックは行わないためです。
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
ターゲット名
アクセス権により許可される操作 このアクセス権を許可した場合のリスク
setSystemScope システムのアイデンティティースコープの設定。 攻撃者は、信頼されるべきでない証明書を使用してシステムのアイデンティティースコープを構成し、そのような証明書を使用して署名されたアプレットやアプリケーションのコードに、システムの元のアイデンティティースコープでは拒否されていた特権を与えることができます。
setIdentityPublicKey Identity の公開鍵の設定。 アイデンティティーが「信頼できるもの」としてマークされている場合、攻撃者は、システムのアイデンティティースコープが信頼していない別の公開鍵 (独自の公開鍵など) を設定し、その公開鍵を使用して署名されたアプレットやアプリケーションのコードに、本来なら否定されていた特権を与えることができます。
setIdentityInfo Identity の概要を表す文字列の設定。 攻撃者は、アイデンティティーの概要を表す文字列を設定できるようになります。これにより攻撃者は、アプリケーションを騙して目的のものとは異なるアイデンティティーを使用させるようにしたり、特定のアイデンティティーを見つけることができないようにしたりできます。
addIdentityCertificate Identity の証明書の追加。 攻撃者は、アイデンティティーの公開鍵に証明書を設定できるようになります。システム全体の信頼関係に影響するため、このアクセス権は危険です。この公開鍵は、本来よりも広い範囲のコードに対して急に信頼性を持つようになります。
removeIdentityCertificate Identity の証明書の削除。 攻撃者は、アイデンティティーの公開鍵のための証明書を削除できるようになります。システム全体の信頼関係に影響するため、このアクセス権は危険です。この公開鍵は、急に本来よりも信頼性が低く見なされるようになります。
printIdentity プリンシパルの名前、オプションでそのプリンシパルが使用されるスコープ、およびそのプリンシパルがスコープ内で「信頼できる」と見なされているかどうかを表示します。 出力されるスコープがファイル名の場合、ローカルシステムの情報が伝達されてしまうことがあります。たとえば、「carol」という名前のアイデンティティーのサンプル出力を示します。「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 はこの新規オブジェクトに置き換えられ、削除されます。

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 です。それぞれの意味は、次のように定義されます。

キーワード 意味
read 読み取り権。
write 書き込み権 (作成権も含む)。
execute 実行権。Runtime.exec の呼び出しを許可します。SecurityManager.checkExec に対応します。
delete 削除権。File.delete の呼び出しを許可します。SecurityManager.checkDelete に対応します。

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

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

注: コードは同一ディレクトリ (またはそのディレクトリのサブディレクトリ) 内のファイルを常に読み取ることができるので、読み取り時のアクセス権を明示する必要はありません。

SerializablePermission

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

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

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

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

ReflectPermission

java.lang.reflect.ReflectPermission リフレクション操作に対するアクセス権を表します。ReflectPermission は名前付きアクセス権であり、アクションはとりません。現時点で定義されている名前は suppressAccessChecks だけです。この名前を指定すると、リフレクトされたオブジェクトによってその使用時点で実行される、標準の言語アクセスチェック (public、デフォルト (パッケージ) アクセス、protected、および private なメンバーが対象) が抑止されます。

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

java.lang.reflect.ReflectPermission
のターゲット名
アクセス権により許可される操作 このアクセス権を許可した場合のリスク
suppressAccessChecks 警告: このアクセス権をコードに与えるときは、十分な注意を払ってください。このアクセス権により、特定のクラスのフィールドへのアクセスと、メソッドの呼び出しが可能になります。public のほか、protected、private などのフィールドおよびメソッドも含まれます。 通常はアクセスできない機密情報やメソッドが、悪意のあるコードによってアクセスされる恐れがある

RuntimePermission

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

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

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

java.lang.RuntimePermission のターゲット名 アクセス権により許可される操作 このアクセス権を許可した場合のリスク
createClassLoader クラスローダーの作成 このアクセス権を与えるのはきわめて危険です。悪意のあるアプリケーションが独自のクラスローダーのインスタンスを生成し、破壊行為を行うクラスをシステムにロードする可能性があります。この新たにロードされたクラスが同じクラスローダーによって保護ドメインに置かれ、ロードされたクラスに、そのドメインのアクセス権が自動的に与えられる可能性があります。
getClassLoader クラスローダー (クラスを呼び出すためのクラスローダーなど) の取得 これにより、特定のクラスのクラスローダーを取得するためのアクセス権を、攻撃者に与えることになります。あるクラスのクラスローダーにアクセスできると、攻撃者は、そのクラスローダーから使用できるほかのクラスをロードできるようになるため、このアクセス権は危険です。本来は、そのようなクラスにはアクセスすることはできません。
setContextClassLoader スレッドが使うコンテキストクラスローダーの設定 コンテキストクラスローダーは、システムクラスローダーに存在しない可能性のあるリソースを探す必要があるときに、システムコードおよびエクステンションによって使用されます。setContextClassLoader アクセス権を与えると、コードは、システムスレッドを含め、特定のスレッドで使用するコンテキストクラスローダーを変更できるようになります。
enableContextClassLoaderOverride スレッドのコンテキストクラスローダーメソッドのサブクラス実装 コンテキストクラスローダーは、システムクラスローダーに存在しない可能性のあるリソースを探す必要があるときに、システムコードおよびエクステンションによって使用されます。enableContextClassLoaderOverride アクセス権の許可によって、スレッドのサブクラスは、特定のスレッドのコンテキストクラスローダーの取得または設定に使用されるメソッドをオーバーライドできます。
setSecurityManager セキュリティーマネージャーの設定 (既存の設定を置き換える可能性あり) セキュリティーマネージャーとは、アプリケーションがセキュリティーポリシーを実装できるクラスです。setSecurityManager アクセス権を与えると、コードは、別のセキュリティーマネージャー (より制限の少ないセキュリティーマネージャーなど) をロードし、使用するセキュリティーマネージャーを変更できるようになります。この結果、元のセキュリティーマネージャーによって課されていたチェックを回避できるようになります。
createSecurityManager 新しいセキュリティーマネージャーの作成 ほかのクラスまたは実行スタックの情報を公開する可能性がある、保護された、機密性の高いメソッドへのアクセスをコードに与えます。
getenv.{variable name} 指定された環境変数の値の読み取り。 コードを使って特定の環境変数の値の読み取りや存在の判定を行うことができる。変数が機密データを格納している場合、これは危険です。
exitVM.{exit status} 指定された終了ステータスでの Java 仮想マシンの停止。 仮想マシンを自動的に停止させることで、攻撃者はサービス妨害攻撃を展開することができます。注:アプリケーションクラスパスからロードされたすべてのコードにアクセス権「exitVM.*」が付与されるため、アプリケーションは自らを終了させることができます。また、アクセス権「exitVM」は「exitVM.*」と同等です。
shutdownHooks Java 仮想マシンのシャットダウンフックの登録および解除。 悪意のあるシャットダウンフックを登録することで、攻撃者は仮想マシンの正常なシャットダウンの妨害攻撃を展開できます。
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 に依存するレジストリ内にあります。

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 までの任意のポートへの接続の受け付け、そのポートへの接続、およびそのポートでの待機を許可するアクセス権を表します。

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

SQLPermission

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

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

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

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

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

アプレットを実行するユーザーは、許可するアクセス権を決定し、Policy Tool を実行して、ポリシーファイルに SQLPermission のインスタンスを作成します。プログラマは、コンストラクタを直接使用するのではなく、ツールを使って SQLPermission のインスタンスを作成します。

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 へのアクセス権を与えると、悪意のあるコードにより、ユーザー環境に関する重要な情報 (ユーザーのアカウント名とホームディレクトリ) が盗まれる可能性があります。

LoggingPermission

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

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

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

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 をリフレッシュできます。

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」へのアクセスが許可されます。

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 との交換によって獲得される場合にも当てはまります。資格は、TGT、あるいは鍵テーブルから取得されるサービスチケットまたは秘密鍵のいずれかになります。

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

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

このアクセス権を付与すると、呼び出し側が、アクションによって指定されたコンテキスト内で、キャッシュされた資格 (チケット認可チケット (TGT)、サービスチケット、秘密鍵) を使用できるようになります。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");

AudioPermission

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

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

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

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

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

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

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

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

この場合、java.awt.Toolkit クラスの getSystemEventQueue メソッドへの呼び出しは、SecurityManager メソッド checkAwtEventQueueAccess への呼び出しになります。このメソッドは、呼び出しスタック上のコードに次のアクセス権が与えられている場合にだけ呼び出せます。

  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 java.awt.AWTPermission "readDisplayPixels"。この Graphics2D コンテキストが画面上の Component に描画中であり、かつ Composite が AlphaComposite クラスのインスタンスではなく、カスタムオブジェクトの場合。注:setComposite メソッドは、実際には abstract メソッドであるため、セキュリティーチェックを呼び出すことはできない。こうした条件下では、メソッドの実装ごとに java.lang.SecurityManager checkPermission メソッドを java.awt.AWTPermission("readDisplayPixels") アクセス権で呼び出す必要がある。
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 メソッドは実際には abstract メソッドなので、セキュリティーチェックを起動することはできない。このメソッドの実際の各実装部分では、java.lang.SecurityManager の checkPrintJobAccess メソッドを呼び出すべき。checkPrintJobAccess メソッドは、アクセス権 java.lang.RuntimePermission "queuePrintJob" が現在許可されている場合だけ呼び出すことができる。

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

java.awt.AWTPermission "accessClipboard"

注:getSystemClipboard メソッドは実際には abstract メソッドなので、セキュリティーチェックを起動することはできない。このメソッドの実際の各実装部分では、java.lang.SecurityManager の checkSystemClipboardAccess メソッドを呼び出すべき。checkSystemClipboardAccess メソッドは、アクセス権 java.awt.AWTPermission "accessClipboard" が現在許可されている場合だけ呼び出すことができる。

java.awt.Toolkit
  public final EventQueue
               getSystemEventQueue()
checkAwtEventQueueAccess java.awt.AWTPermission "accessEventQueue"
java.awt.Window
  Window()
checkTopLevelWindow 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}) if (port == 0) java.net.SocketPermission "localhost:1024-","listen";
else 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(); 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); if (port == 0) java.net.SocketPermission "localhost:1024-","listen";
else java.net.SocketPermission "localhost:{port}","listen";
public void checkMemberAccess(Class clazz, int which);
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); 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 action); java.security.SecurityPermission "{action}";
public void checkSetFactory(); java.lang.RuntimePermission "setFactory";
public void checkSystemClipboardAccess(); java.awt.AWTPermission "accessClipboard";
public boolean checkTopLevelWindow(Object window); 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, 2013, Oracle and/or its affiliates. All rights reserved.