アクセス権は、システムリソースへのアクセスを表します。アプレット (またはセキュリティーマネージャーとともに実行するアプリケーション) が、リソースへのアクセスを許可されるためには、アクセスを試みるコードに対し、該当するアクセス権を明示的に与える必要があります。
一般に、アクセス権は名前 (しばしば「ターゲット名」と呼ばれる) を持っています。場合によっては、名前のほかに、コンマで区切られた 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.AllPermission
java.security.SecurityPermission
java.security.UnresolvedPermission
java.awt.AWTPermission
java.io.FilePermission
java.io.SerializablePermission
java.lang.reflect.ReflectPermission
java.lang.RuntimePermission
java.net.NetPermission
java.net.SocketPermission
java.sql.SQLPermission
java.util.PropertyPermission
java.util.logging.LoggingPermission
javax.net.ssl.SSLPermission
javax.security.auth.AuthPermission
javax.security.auth.PrivateCredentialPermission
javax.security.auth.kerberos.DelegationPermission
javax.security.auth.kerberos.ServicePermission
javax.sound.sampled.AudioPermission
アクセス権や、スーパークラス java.security.Permission
および java.security.BasicPermission
についての詳細と、アクセス権オブジェクトの作成およびアクセス権の付与の例については、セキュリティーアーキテクチャーの仕様を参照してください。
ここでは、JDK に組み込みのアクセス権型の一覧表を示すとともに、それぞれのアクセス権を与えた場合のリスクについて説明します。
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.{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 の 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 に依存するレジストリ内にあります。 |
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
がチェックするアクセス権です。
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
に指定できるターゲット名を次の表に示します。表には、アクセス権により許可される操作、およびそのアクセス権をコードに与えた場合のリスクが示されます。
アクセス権ターゲット名 | アクセス権により許可される機能 | このアクセス権を許可した場合のリスク |
---|---|---|
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 |
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 をリフレッシュできます。 |
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
」へのアクセスが許可されます。
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 |
呼び出し側が、資格を使用して、特定のプリンシパルとしてセキュリティーコンテキストを受け入れることができる。 |
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
メソッドのデフォルトの実装によってチェックされるアクセス権を示します。
指定された各 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"; |