2017-07-11 14 views
3

信頼できないクラスファイルからロードされたクラスの新しいインスタンスを作成する必要があります。 は、今私は、次の操作を行います。有効なSecurityManagerをJavaで使用してnewInstanceを作成する方法

classLoader.loadClass(UNSTRUSTED_CLASS).newInstance() 

問題は、私はセキュリティマネージャを有効にした場合、それはのnewInstanceを呼び出すために許可していませんが、私はセキュリティマネージャ無効なものを持っている場合は、初期化ブロックに悪意のあるコードを置くことができますし、それが実行されるということです問題はありません。

信頼できないクラスの新しいインスタンスを作成する方法を教えてください。

+0

恐らくhttps://stackoverflow.com/questions/36091323/java-set-security-permission-of-created-instancesの複製 – Akash

+0

@Akash私はその質問を見てきました。メソッド呼び出しを分離することはできますが、インスタンス化を分離することはできないため、十分な違いがあります。残念ながら、その質問に対する回答は役に立ちません。 – krems

+0

信頼できる呼び出し元の型を信頼できない呼び出し先から分離することはできません。前者の 'ProtectionDomain'は' Policy'や 'ClassLoader'を介して)必要なインスタンス化権限を与えられますが、 ) アクセス制御? – Uux

答えて

0

まあ、私が使ったもの。 私が特定の場所から信頼できないコードをロードするカスタムクラスローダーを持っていると、私はリフレクションを使用する許可を与えられた私の信頼できるコードのためのポリシーファイルのコードベースを定義できます。したがって、別のコードベースの信頼できないコードにはこのアクセス権がありません。このポリシーファイルを使用して すなわち

grant codeBase "file:/C:/path/to/trusted/code/classes" { 
    permission java.lang.reflect.ReflectPermission "suppressAccessChecks"; 
}; 

コードベースに指定された以外の場所からロードされたすべてのコードは、すべての権限を持っていません。

0

クラスの静的な初期化子とコンストラクタは、スタック上のそのクラスで常に実行されるため、AccessControlContextの適切なProtectionDomainが実行されます。例えば、実際に親クラスローダーからクラスを取得して、現在のThread/ThreadGroup/AppContext/ThreadLocalにアクセスするなど、他の問題があるとは限りません。

それ以外の3つの引数は、初期化せずにクラスをロードすることができます。しかし、親クラスローダーのコードを使用してクラスをロードするのが一般的です。

関連する問題