問題タブ [securitymanager]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - セキュリティ: サードパーティ製ソフトウェアによる内部アクセスを制限します
ユーザーエクスペリエンスを向上させるために、ユーザーがサードパーティの「プラグイン」をロードできる Java アプリケーションがあります。これらのプラグインで使用するための API は存在しますが、サードパーティ ソフトウェアは、セキュリティのために内部アプリケーション クラスへのアクセスを制限する必要があります。プラグインに制限されたパッケージは「com.example」で、許可されたパッケージは「com.example.api」です。API クラスは、難読化された内部クラスを呼び出します。
これを調査した後、 SecurityManager のいくつかのメソッド、checkMemberAccess(Class, int)とcheckPackageAccess(String)に出会いました。どちらも私の目標への実行可能なパスのようです。しかし、いくつかのテストとさらなる調査を行った結果、checkMemberAccess はリフレクション呼び出しにのみ適用され、checkPackageAccess はクラス ローダーが loadClass を呼び出したときにのみ呼び出されることがわかりました。
パッケージへのアクセスを制限する合理的な方法は何ですか (com.example.api ではなく com.example)?
java - デフォルトの java.policy ファイルなしで Java Security Manager を実行する
Java ホーム ディレクトリの内容を変更したくありませんが、デフォルトの java.policy ファイルが許容範囲を超えている場合があるのではないかと心配しています。オプションを指定して Java を実行するときに、指定したポリシー ファイルを唯一のポリシー ファイルとして使用する方法はあり-Djava.security.manager
ますか?
オプションを追加する-Djava.security.policy=myPolicy.policy
と、デフォルトのポリシー ファイルに加えて私のポリシー ファイルが使用されます。これは、デフォルトのポリシー ファイルで許可されているすべての権限が引き続き許可されているように見えるため、問題です。
java - デスクトップ アプリをアプレット サンドボックスに移植する
古い Swing デスクトップ アプリケーションをアプレットに変換し、すべてのファイル IO を Web サービス呼び出しに置き換えたいと考えています。アプレットが許可されていることと許可されていないことの包括的なリストを見つけるのに苦労しています。
ローカル ファイル IO が署名付き証明書では許可されていないことを理解しています。また、アプレットプラグインは、アプレットの実行が許可されているかどうかを判断するために、コンパイルされたコードで行われた API 呼び出しを確認していると思います。アプレットサンドボックスで許可されていない正確なクラスとメソッドは?
さらに、この種の変換に対する一般的なアプローチはありますか?
java - java.lang.SecurityManager からパーミッション情報を取得する方法は?
アプリケーション (アプレットではない) でデバッグを行っており、 System.getSecurityManager()への呼び出しを介してシステムのセキュリティ マネージャーを取得しました。このSecurityManagerのセットアップに使用されたすべての構成情報を印刷するにはどうすればよいですか? Java 7 SE APIを見ると、すべてのメソッドは本質的に質問型であり、アクセス許可の構成を取得する方法はないようです。toString()メソッドもObjectから直接継承しているようで、ポインターを出力するだけです。
java - Java Socket-Permissionsを理解する方法は?
次の許可は何を許可しますか?私のアプリケーションは、192.168.1.1:31337(おそらく外部クライアント)からの接続のみを受け入れることを許可されていますか、それとも192.168.1.1:31337(私のアプリケーションは192.168.1.1:31337で実行されています)への接続を受け入れることを許可されていますか? '?)。
java - 適切なファイル権限を付与しているにもかかわらず、JavaAccessControlException
SecurityManagerを使用してJavaRMIアプリケーションを実行しようとすると奇妙なエラーが発生します。サーバーの起動時に、コマンドライン引数として指定されたファイルからテキストを読み取ってほしい。私はEclipseを使用しており、このファイルはJavaプロジェクトのルートと同じディレクトリにあります(したがって、フルパスの代わりにコマンドライン引数でファイル名を指定できます)。RMIのSecurityManagerがデフォルトでファイルI/Oを禁止していることを知っているので、次のようなサーバー用のポリシーファイルを作成しました。
(私のEclipseプロジェクトの名前は「authmatch」であり、これはWindowsで実行されていることに注意してください)。Eclipseの実行構成で、次のVMフラグを使用してこのポリシーファイルを有効にします。
server.policyに構文エラーを導入すると、アプリケーションの実行時にJavaがそれについて文句を言うので(「エラー解析ファイル」)、ポリシーファイルが解析およびロードされていることを知っています。ただし、セキュリティマネージャは、アプリケーションを実行すると次のエラーが発生するため、ポリシーで付与したアクセス許可を何らかの形で無視しているようです。
読み取りを要求しているファイル(smalltest.txt)は「authmatch」プロジェクトディレクトリにあるため、アプリケーションにそのディレクトリを読み取る権限を次の行で明示的に付与しました。
ファイルの読み取り権限がないと主張しているのはなぜですか?Linuxコンピューターで同じプロジェクトを実行していて、同様のポリシーファイルを使用すると、ローカルプロジェクトディレクトリから正常に読み取ることができるため、これはWindowsの問題である可能性があります。
アップデート
でサーバーを実行する-Djava.security.debug=access,failure
と、ポリシーファイルの解析中に大量のデバッグメッセージが生成されました。このペーストビンでログ全体を見ることができますが、2つの重要な部分があるようです。
...そしてずっと後で:
コードベースが署名されていないため、何らかの「ドメイン保護」の失敗があるようですが、grant codeBase
セットアップを使用して署名なしでセキュリティポリシーを指定することは許容できると思いました。さらに不可解なことに、ルートauthmatchディレクトリのFilePermissionを読み取るようには見えず、authmatch/binディレクトリだけを読み取るように見えます。次に、「smalltest.txt」へのアクセスを拒否する必要があると結論付けますが、そのファイルの完全なディレクトリパスを解決することはありません。
同じプロジェクトとポリシーがLinuxで正常に機能することを忘れないでください。
java - Spring Security の AOP を Java Security Manager とマージすることは可能ですか?
Swing ベースの多層 Java アプリケーションがあり、各モジュールにはバックエンドとフロントエンドがあります。
次に、Spring Security を使用してセキュリティを追加します。オーバーヘッドがあるため、AspectJ を使用しないことにしました。
バックエンドのすべてのメソッド呼び出しが Spring Security のアノテーションベースのモデルによってインターセプト (または委譲) されるように、Spring メソッド呼び出しの承認を Java Security Manager に何らかの形で注入することは可能ですか?
ノート:
アプリケーションには膨大な数のパッケージが含まれており、オブジェクトは new 演算子またはリフレクション手法を使用してインスタンス化されています。すべてのインスタンス化を修正し、すべてのオブジェクトを Spring Bean に変更することはできません。Java Security Manager は、オブジェクトの構築方法に関係なく、すべてのメソッド呼び出しをインターセプトします。これが、何らかの形で Spring Security Method 認可を Java Security Manager に注入する必要がある理由です。
java - AccessController がクラスの ProtectionDomain を考慮していない
環境
コードが非常に厳密なサンドボックスで実行される Java システムを作成しています。クエリ (1 つ以上のクラスで構成される) は、その実行中に、1 つのフォルダー (およびフォルダー内に含まれるサブフォルダーとファイル) へのアクセスのみを許可する必要があります。
、およびクエリ実行ごとSecurityManager
に新しいを使用して、サンドボックスを強制します。usingでClassLoader
クラスを定義するときに、付与する必要があるファイル読み取り権限を含むを渡します。ClassLoader
defineClass
ProtectionDomain
コール スタック上のすべてのオブジェクトが必要な特権を持っているわけではないため、クエリの読み取りアクションはAccessController.doPrivileged(...)
-block 内で実行されます。
問題
AccessController.checkPermission(...)
ブロック内から直接呼び出すと、doPrivileged(...)
静かに返されますSystem.getSecurityManager().checkPermission(...)
にリクエストを転送する を呼び出すとAccessController
、AccessController
は例外をスローします。- ?を介して
ProtectionDomain
呼び出すと、 が失われるようです。AccessController
SecurityManager
- 制限されたファイル アクション ( の作成など) は、ではなく
java.io.FileReader
を直接呼び出します。ブロックを呼び出したクラスのを尊重するために、 を介して呼び出されたときに を取得するにはどうすればよいですか?SecurityManager
AccessController
AccessController
SecurityManager
ProtectionDomain
doRestricted(...)
- 自体に
SecurityManager
必要なアクセス許可がない可能性がありますか? これにより、特権コード間の呼び出しスタックに挟まれることで、AccessController
どれも特権結合を生成しませんか?
以下にサンプル セクションを示します。
スタック トレースの一部を含む、プログラムによって生成された出力 (使用される長いパス名を置き換える PATH):
CloakAccessController.checkPermission(...)
実装も興味深いかもしれません。次のようになります。
主に、それを作成したスレッドのセキュリティ制限をバイパスします。
私のjava.policyファイルの内容は、標準の MacOSX システムのものです。非標準的な変更は含まれていないと思います。
java - セキュリティ サンドボックス (アプレットなど) 内からカスタム クラスを生成する
(署名されていない) アプレット内でカスタム クラスを生成およびロードできるようにしたいと考えています。それらを生成することはできますが、それらをロードすることを望まないように見えるアプレット SecurityManager と戦っています。
これが視覚的な概要です。ご覧のとおり、私はフェーズ 2 で立ち往生しています。
私が最初に意図したのは、カスタム クラス ローダーを使用することでした。どうやらこれはアプレットでは許可されていません。ClassLoader コンストラクターは SecurityException をスローします。
次に、別のクラスローダーで ClassLoader.defineClass(String name, byte[] b, int off, int len)を直接呼び出すことを検討しましたが、そのメソッドは保護されています。
リフレクションを介してメソッドにアクセスできるようにしました。私の希望は高くありませんでしたが、試してみましたが、実際にそれも SecurityException をスローしました。
URLClassLoaderは救いを提供するように見えました: セキュリティ例外をスローしない静的ファクトリ作成メソッドがあります。ただし、この手法では、ローダーのサブクラス化や、保護された defineClass メソッドへのアクセスは許可されません。URL オブジェクトの配列のみを受け入れます。
そのため、 URLをサブクラス化して openConnection メソッドをオーバーライドし、クラス バイトをそのように返そうとしましたが、URL クラスは最終的なものです。
次に、オーバーライドされた openConnection メソッドを使用してカスタムURLStreamHandlerを作成し、それを URL のコンストラクターに渡してみました。SecurityManager は、これに別の適合を投げました。
そこで、カスタム ストリーム ハンドラを返すカスタム ファクトリで URL.setStreamHandlerFactory を呼び出してみました。不平を言わなければ、他に何の役に立つのでしょうか。
そこで、javax.management.loading.MLetを作成してみました。それが何のためのものかはわかりませんが、コンストラクターでカスタム URLStreamHandlerFactory を指定できるようにする URLClassLoader のサブクラスであり、セキュリティ例外をスローすることについては言及していませんが、とにかくそうしました。
必死になって、カスタム ProxySelector を使用してProxySelector .setDefault を呼び出してみました。URL を解読して、どうにかしてそれをアプレットに戻すことを望んでいましたが、その権限もありません。
java.system.class.loader
タグを使用してプロパティを設定しようとし<param name="java_arguments" ...>
ましたが、優先されるプロパティの 1 つではないようです。
最後に、これを行うために考えられる唯一の方法は、URLClassLoader.newInstance(URL[]) と組み合わせて使用できる一時 URL を生成するリモート サーバーにクラス バイトを送信することです。それはうまくいくでしょうが、私はその考えが本当に好きではありません。さまざまな ClassLoaders の相互作用により、複雑になる可能性があり、サーバー依存は私がやりたいことに対して実際には実用的ではないようです。 どうやら、SecurityManager は URLClassLoader を作成できるように喜んでいるだけのようですが、それを使用しようとすると自然に動揺します。
エクスペリエンスがシームレスになるように、可能であれば、通常の署名されていないアプレット セキュリティ サンドボックス内からこれを実行したいと考えています。
しかし、ほとんどの場合、私は困惑しています。なぜなら、それが不可能なら意味がないからです。SecurityManager が任意の外部 URL からクラスをロードすることに満足している場合、ローカル変数のバイト配列からクラスをロードすることを気にする必要はありません。 制限はまだ無意味です。コードはまだ内部にあり、サンドボックス化されています。
動的コード生成と、LZMA 圧縮などのカスタム JAR 圧縮の実装の両方に役立ちます。
ヘルプ!
java - 動的にロードされたコードのセキュリティ管理
私は現在、動的にロードされたクラスをサポートするクライアント/サーバーアプリケーションに取り組んでいます。
これらのクラスは、特定のメソッドにアクセスできないプラグインです。
私の最初のアイデアは、スタックトレース内のクラス名をチェックするSecurityManagerでしたが、これにアプローチするための理想的な方法ではないようです。
特定のクラスにそのような制限をどのように採用するでしょうか?
クラスファイルのコンテンツから参照されるすべてのクラスを読み取る(実現可能な)方法はありますか?