System.exit()
如果遇到异常,我正在使用第三方库.我正在使用jar中的API.无论如何,我可以阻止System.exit()
调用,因为它导致我的应用程序关闭?System.exit()
由于许多其他许可问题,我无法在删除之后反编译并重新编译jar .我曾经在stackoverflow中遇到过[我不记得的其他问题]的答案,我们可以使用SecurityManager
Java来做这样的事情.
编辑:更新以回应Ani B.
编辑2:添加了更新的PluginSecurityManager.
我的应用程序有一个插件机制,第三方可以提供包含实现特定接口的类的JAR.使用URLClassLoader,我能够加载该类并实例化它,没问题.因为代码可能不受信任,我需要防止它行为不端.例如,我在一个单独的线程中运行插件代码,这样如果它进入无限循环或者只是花费太长时间我就可以杀死它.但是尝试为他们设置一个安全沙箱,以便他们无法做出像网络连接或访问硬盘驱动器上的文件这样的事情让我感到非常沮丧.我的努力总是导致对插件没有影响(它具有与应用程序相同的权限)或者也限制了应用程序.我希望主应用程序代码能够完成它想要的任何东西,
关于这一主题的文献和在线资源是复杂,混乱和矛盾的.我已经阅读过各种各样的地方(例如这个问题),我需要提供一个自定义的SecurityManager,但是当我尝试它时,我遇到了问题,因为JVM延迟加载JAR中的类.所以我可以很好地实例化它,但是如果我在加载的对象上调用一个方法来实例化来自同一个JAR的另一个类,那么它就会爆炸,因为它被拒绝了从JAR读取的权利.
从理论上讲,我可以在SecurityManager中检查FilePermission,看看它是否正在尝试加载自己的JAR.这没关系,但URLClassLoader文档说:"默认情况下,加载的类只被授予访问创建URLClassLoader时指定的URL的权限." 那为什么我甚至需要一个自定义的SecurityManager?URLClassLoader不应该只处理这个吗?为什么不呢?
这是一个重现问题的简化示例:
package test.app;
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import test.api.Plugin;
public class PluginTest {
public static void pluginTest(String pathToJar) {
try {
File file = new File(pathToJar);
URL url = file.toURI().toURL();
URLClassLoader cl = new URLClassLoader(new java.net.URL[] { url });
Class<?> clazz = cl.loadClass("test.plugin.MyPlugin");
final Plugin plugin = (Plugin) clazz.newInstance();
PluginThread thread = new PluginThread(new Runnable() {
@Override
public void run() {
plugin.go();
}
}); …
Run Code Online (Sandbox Code Playgroud) 嗨,我有RMI应用程序,现在我尝试从我的客户端调用服务器上的一些方法.我有以下代码:
public static void main(final String[] args) {
try {
//Setting the security manager
System.setSecurityManager(new RMISecurityManager());
IndicatorsService server = (IndicatorsService) Naming
.lookup("rmi://localhost/" + IndicatorsService.SERVICE_NAME);
DataProvider provider = new OHLCProvider(server);
server.registerOHLCProvider(provider);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
服务器已正确加载,但当我尝试调用时,server.registerOHLCProvider(provider);
我收到以下错误:
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: sk.xorty.client.providers.OHLCProvider (no security manager: RMI class loader disabled)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:336) …
Run Code Online (Sandbox Code Playgroud) 问题:
在我的Java应用程序(不是applet)中,我希望将某些文件操作限制为除了不应限制的类的列表/组/包之外的所有类.
具体来说,我想限制......
...这样它们只能在当前工作目录中为除了不受限制的类之外的所有类完成.
SecurityManager尝试:
我试图实现实现此行为的SecurityManager类的子类,但是当检查时,提供的文件信息似乎不仅仅提供文件名(除非我遗漏了什么?).
另外,我不太明白在这种情况下我怎么能找到调用的类,允许我确定是允许操作还是抛出异常.有什么办法可以获得这种方法所需的所有信息吗?
基于策略的尝试:
我也知道Java策略旨在限制类的操作,包括文件操作等操作.但是,我真的很难找到一个很好的资源来学习如何使用.policy文件来解决我的问题.
问题总结:
1)是否有任何替代方法可能比我提到的方法更好?
2)这可以使用SecurityManager吗?我错过了我应该如何实际采用这种方法吗?
3)这可以使用策略文件吗?我在这方面错过了什么好的资源吗?
我真的不喜欢我需要投入的任何努力来实现这一点 - 我只是不确定我应该如何正确地处理它.我也非常缺乏足够的资源来教我足够的关于我提到的两种可能的方法,允许我自己实现它.最重要的是,我并不害怕需要的重要阅读!
感谢您提前给予的任何帮助.
我需要调用一些半可靠的Java代码,并希望禁用在代码执行期间使用反射的功能.
try{
// disable reflection somehow
someObject.method();
}
finally{
// enable reflection again
}
Run Code Online (Sandbox Code Playgroud)
可以使用SecurityManager来完成,如果是这样,怎么做?
澄清/上下文:这是关于限制可以从JavaScript/Rhino调用的包的另一个问题的后续行动.接受的答案引用了关于如何做到这一点的博客条目,它需要两个步骤,第一个使用Rhino API(ClassShutter),第二个使用关闭反射和Class.forName().我想我可以使用SecurityManager更干净地完成第二步(了解SecurityManager,正如已经指出的那样,沿途是一个复杂的野兽).
总而言之,我希望(从代码,而不是设置文件)关闭Class.forName()以及对整个反射包的任何访问.
我正在使用Tomcat 6.0.24,为Ubuntu Karmic打包.Ubuntu的Tomcat软件包的默认安全策略非常严格,但看起来很简单.在/var/lib/tomcat6/conf/policy.d
,有各种文件建立默认策略.
值得一提的是:
server.xml
更改等.将.war文件放在webapps
目录中是唯一的部署操作.-Djava.security.debug="access,stack,failure"
系统属性而报告给日志).我想要做的是在policy.d
目录中添加特定于应用程序的安全策略文件,这似乎是推荐的做法.我添加了这个policy.d/100myapp.policy
(作为一个起点 - 我希望最终将授予的权限减少到应用程序实际需要的内容):
grant codeBase "file:${catalina.base}/webapps/ROOT.war" {
permission java.security.AllPermission;
};
grant codeBase "file:${catalina.base}/webapps/ROOT/-" {
permission java.security.AllPermission;
};
grant codeBase "file:${catalina.base}/webapps/ROOT/WEB-INF/-" {
permission java.security.AllPermission;
};
grant codeBase "file:${catalina.base}/webapps/ROOT/WEB-INF/lib/-" {
permission java.security.AllPermission;
};
grant codeBase "file:${catalina.base}/webapps/ROOT/WEB-INF/classes/-" {
permission java.security.AllPermission;
};
Run Code Online (Sandbox Code Playgroud)
请注意试图找到正确codeBase
声明的颠簸.我认为这可能是我的根本问题.
无论如何,上面(实际上只有前两个赠款似乎有任何影响)几乎可行:成千上万的访问拒绝都消失了,而我只留下了一个.相关堆栈跟踪:
java.security.AccessControlException: access denied (java.io.FilePermission /var/lib/tomcat6/webapps/ROOT/WEB-INF/classes/com/foo/some-file-here.txt read)
java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
java.security.AccessController.checkPermission(AccessController.java:546)
java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
java.lang.SecurityManager.checkRead(SecurityManager.java:871)
java.io.File.exists(File.java:731)
org.apache.naming.resources.FileDirContext.file(FileDirContext.java:785)
org.apache.naming.resources.FileDirContext.lookup(FileDirContext.java:206)
org.apache.naming.resources.ProxyDirContext.lookup(ProxyDirContext.java:299)
org.apache.catalina.loader.WebappClassLoader.findResourceInternal(WebappClassLoader.java:1937) …
Run Code Online (Sandbox Code Playgroud) 在默认的安全管理器下,如果我创建一个ExecutorService(在这种情况下是ThreadPoolExecutor),我无法关闭它,shutdown()
只是调用checkPermission("modifyThread")
并因此立即死掉:
import java.util.concurrent.*;
class A {
public static void main( String[] args) {
Thread ct = Thread.currentThread();
System.out.println("current thread: " + ct);
ct.checkAccess(); // we have access to our own thread...
ThreadPoolExecutor tpe = new ThreadPoolExecutor(
1, // one core thread
1, // doesn't matter because queue is unbounded
0, TimeUnit.SECONDS, // doesn't matter in this case
new LinkedBlockingQueue<Runnable>(), /* unbound queue for
* our single thread */
new ThreadFactory() {
public …
Run Code Online (Sandbox Code Playgroud) 在为客户提供的软件中,我们必须阅读给定的URL来解析其内容.此外,客户需要激活Tomcat-Security-Manager以让Java-Policies控制程序的功能.
现在,通过读取URL,发生异常"javax.net.ssl.SSLKeyException:RSA premaster secret error",但仅在某些条件下:
安全违规发生在Java代码中的某个地方,限制在我们的代码库中的AllPermission不会阻止错误.
那么,有人有一个想法,即为Java 6设置哪个权限,以便它可以处理HTTPS?
其他信息:它在一个tomcat中运行,在一个带有OpenJDK的Debian-Linux上运行.
编辑:我在变量JAVA_OPTS中向Tomcats/etc/default/tomcat6添加了Java-Param"-Djava.security.debug = access,failure".但在日志中我没有其他消息.在触发它们之前,代码可能会询问权限吗?
EDIT2:我找到了正确的位置并获得了完整的堆栈跟踪(删除了特定的客户部分):
javax.net.ssl.SSLKeyException: RSA premaster secret error
at [...]
at javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
at java.lang.Thread.run(Thread.java:701)
Caused by: java.security.NoSuchAlgorithmException: SunTlsRsaPremasterSecret KeyGenerator not available
at javax.crypto.KeyGenerator.<init>(KeyGenerator.java:141)
at javax.crypto.KeyGenerator.getInstance(KeyGenerator.java:191)
... 14 more
Run Code Online (Sandbox Code Playgroud)
EDIT3:到目前为止,我假设Java类URL用于访问资源的内容.但这是不真实的.它使用Grails-Code将Groovy-URL-object与getText()方法一起使用:
new URL(params.url).text
Run Code Online (Sandbox Code Playgroud)
错误发生在这一行.这是Grails-version 2.2.4.
我正在研究一个安全性很大的项目.要求是密封我们的罐子.
由于我们密封了罐子,我们的很多junit测试失败了,出现以下错误:
java.lang.SecurityException: sealing violation: package [a.dependency.package] is sealed
at java.net.URLClassLoader.defineClass(URLClassLoader.java:234)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
at java.lang.Class.getDeclaredMethods(Class.java:1791)
at org.mockito.cglib.core.ReflectUtils.addAllMethods(ReflectUtils.java:349)
at org.mockito.cglib.proxy.Enhancer.getMethods(Enhancer.java:422)
at org.mockito.cglib.proxy.Enhancer.generateClass(Enhancer.java:457)
at org.mockito.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:217)
at org.mockito.cglib.proxy.Enhancer.createHelper(Enhancer.java:378)
at org.mockito.cglib.proxy.Enhancer.createClass(Enhancer.java:318)
at org.mockito.internal.creation.jmock.ClassImposterizer.createProxyClass(ClassImposterizer.java:93)
at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:50)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:54)
at org.mockito.internal.MockitoCore.mock(MockitoCore.java:45)
at org.mockito.Mockito.spy(Mockito.java:991)
at [...]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) …
Run Code Online (Sandbox Code Playgroud) 我试图让自己熟悉,SecurityManager
但即使这个简单的场景也失败了.当我从IDE或命令行中运行以下内容时,我得到以下异常 ;
access denied ("java.util.PropertyPermission" "java.home" "read")
Run Code Online (Sandbox Code Playgroud)
我以为我用这段代码允许了所有内容:
Run Code Online (Sandbox Code Playgroud)Policy.setPolicy(new Policy() { @Override public PermissionCollection getPermissions(CodeSource codesource) { Permissions perm = new Permissions(); perm.add(new AllPermission()); return perm; } }); System.setSecurityManager(new SecurityManager()); System.out.println(System.getProperty("java.home"));
这与JVM的派生策略有关吗?我怎么干净利落setPolicy()
?
以下代码似乎也出现了同样的误解:
System.setSecurityManager(new SecurityManager());
final Permissions allPermission = new Permissions();
allPermission.add(new AllPermission());
AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
System.out.println(System.getProperty("java.home"));
return null;
}, new AccessControlContext(new ProtectionDomain[]{new ProtectionDomain(null, allPermission)}));
Run Code Online (Sandbox Code Playgroud)
更新:第二种情况是可以理解的,因为提供的权限只是一个进一步的限制:(javadoc)操作是通过调用者保护域拥有的权限与指定的域所拥有的权限的交集来执行的.AccessControlContext
java ×10
securitymanager ×10
classloader ×2
security ×2
io ×1
javapolicy ×1
jsr166 ×1
mockito ×1
networking ×1
policy ×1
reflection ×1
remoting ×1
rmi ×1
sandbox ×1
sealed ×1
tomcat ×1
tomcat6 ×1
ubuntu ×1