使用具有反射的安全管理器访问 jar 文件



在实现我的平台以能够使用反射动态加载jar文件后,我遇到了一个安全问题。jar 文件可能是"危险的"并且包含可能影响事物的代码,因此我在使用SecurityManager时遇到了 SO 的使用。

我正在像这样加载jar文件(硬编码文件的示例(:

URLClassLoader clsLoader = URLClassLoader
.newInstance(new URL[] { new URL("file:/C://Temp/SettingsApp.jar") });
Class<?> cls = clsLoader.loadClass("iezon.app.SettingsApp");
JPanel settingsApp = (JPanel) cls.newInstance();

我尝试像这样使用SecurityManager

try {
SecurityManager sm = new SecurityManager();
Object context = sm.getSecurityContext();
sm.checkPermission(new AllPermission(), context);
settingsAppPanel = (JPanel) cls.newInstance();
} catch (AccessControlException e) {
e.printStackTrace();
}

带有AllPermission()的测试有效,并给了我这个例外:

java.security.AccessControlException: access deny ("java.security.AllPermission" " "(

但是,我找不到有关如何将jar文件绑定到此安全管理器而不是当前平台的任何信息。我只是不希望jar文件能够打开套接字等。无需先请求用户随后可以接受的权限。

我偶然发现了BasicPermission,但是,这是一个抽象类,不能像AllPermission那样实例化,同样,我找不到任何关于接近它的信息。任何帮助将不胜感激!

正如@Holger注释中提到的,使用安全管理器实现的唯一方法是动态创建策略。因此,当开发人员将新应用上传到应用商店时,系统会为其提供一组策略来声明其应用使用。在应用程序上,这将提供给用户,要求他们确认此策略(如果涉及套接字等,则由他们自担风险(,然后创建一个策略,应用程序可以运行:

if (!app.policyIsAgreedTo()) {
if(readPolicy(app).get(0).equalsIgnoreCase("grant {")) {
app.setPolicy(true);
} else {
throw new Exception("App policy has not been agreed to.");
}
}
if (app.policyIsAgreedTo()) {
System.setProperty("java.security.policy", "file:/C:/Temp/" + app.getName() + ".policy");
System.setSecurityManager(new SecurityManager());
JPanel panel = (JPanel) app.getObject().newInstance();
System.setSecurityManager(null);
return panel;
}
throw new Exception("App policy has not been agreed to.");

策略的创建方式如下:

public static void createPolicy(ArrayList<String> policies, App app) {
try {
FileWriter fileWriter =
new FileWriter("C:/Temp/" + app.getName() + ".policy");
BufferedWriter bufferedWriter =
new BufferedWriter(fileWriter);
bufferedWriter.write("grant {");
bufferedWriter.newLine();
for(String policy : policies) {
bufferedWriter.write("    permission java.lang.RuntimePermission "" + policy + "";");
bufferedWriter.newLine();
}
bufferedWriter.write("};");
bufferedWriter.close();
} catch(IOException ex) {
ex.printStackTrace();
}
}

应用程序对应用商店进行 API 调用,收集应用程序所需的权限,然后使用 ArrayList 中的权限调用一个简单的createPolicy(),即:

new ArrayList<String>() {{ add("setSecurityManager"); }}; // Etc...

最新更新