问题标签 [java-security-manager]
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 安全管理器:对通过 ServiceLoader 加载的外部 jar 代码的限制
我想达到什么目的? 我正在开发一个可以通过通过 ServiceLoader 集成的其他 jar 扩展的 java 应用程序。这些加载的扩展应该在 SecurityManager 的一些限制下运行,当然只是为了提高安全性。例如,每个扩展都应获得一个可以存储任何内容的特定目录,但应限制对任何其他文件/文件夹的访问。主应用程序是受信任的代码,因此可以不受任何限制地运行。此外,主应用程序为每个扩展提供了一些 api 实现,这些扩展也应该不受限制地运行。这意味着扩展不能访问其目录之外的文件,但是当扩展调用试图访问任何其他文件的 api 方法时,应该授予访问权限。
问题 如何实现上述行为,即仅来自扩展类的“直接”调用受到限制,而主应用程序中的任何代码均不受限制?无论如何,在不同的线程/线程组中运行扩展可能是一个很好的解决方案,但由于对 api 的调用可能在同一个线程(组)下运行,因此可能无助于识别是否应该仅基于线程来限制访问。
示例 我创建了一个简化的测试环境。一方面有这两个接口:
为了测试,我创建了一个包含这个扩展的 jar:
在主应用程序中,我想做这样的事情:
因此,当我调用extension.doSomethingRestricted();
它时,它应该会导致 SecurityException,但调用extension.doSameViaApi(api);
应该可以正常工作。所以这两种方法都尝试做同样的事情,但一种方法确实尝试通过 api 调用来做。我能想到的唯一方法是遍历调用历史并检查类加载器以分析访问请求是基于可信代码还是基于扩展代码。但我觉得这可能是一个令人讨厌的容易出错的解决方案,所以也许我错过了一些更好的方法?
java - 将不受信任的 java 代码限制为单个线程
我正在寻找一种方法来执行不受信任的 java 代码,以便代码不能使用多线程。是否可以使用 java 安全管理器来限制不受信任的代码以创建多个线程。任何资源或提示都会有所帮助。
java - java SecurityManager 拒绝在某些系统上明确允许的权限
我正在应用程序服务器Drools
中运行应用WildFly 10.1.0-Final
程序。由于执行的代码Drools
不受信任,我决定构建一个自定义沙箱以允许安全执行。
由于不能将外部模块添加到应用程序服务器,我决定,为了有效地使用这个沙箱,我必须创建一个合适的环境。
因此,在standalone.xml
服务器中,我为所有战争定义了 amaximum-set
和 aminimum-set
的权限,我将其设置为java.permission.AllPermission
,从而通常允许执行所有代码。
然后我将-secmgr
标志添加到服务器,以激活 SecurityManager。我能够按预期使用该应用程序,并且多次调用AccessController.doPrivileged()
确实检查了权限并允许执行所需的操作。
然后我创建了一个服务类,它将创建一个沙盒上下文来检查访问。
它显式地创建了一个AccessControlContext
带有 a CodeBase
of null
(意思是所有代码)和 aProtectionDomain
带有三个必要的 Drools 权限-Runtime.getClassLoader
和. 然后,我使用所需的调用 ( ) 和沙盒上下文进行调用。Runtime.accessDeclaredMembers
Reflect.suppressAccessChecks
AccessController.doPrivileged
StatefulKnowledgeSession.fireAllRules
在我的开发系统上,当一个 drools 规则尝试做任何不允许的事情(例如,创建一个文件)时,aConsequenceException
会抛出一个AccessControlException
原因,因为 do denied Access to File.write
.
在我们的生产系统上,使用了相同的配置和部署,但所有调用都由于不允许的AccessControlException
状态而失败。Runtime.getClassLoader
我调试了实时系统,调用sandboxContext.checkPermission(new RuntimePermission("getClassLoader"))
时没有抛出异常,这告诉我上下文本身允许它。
尽管如此,我们的生产机器拒绝许可
系统中唯一的区别是操作系统版本,因为我使用的是一台Ubuntu
机器,而生产服务器是一CentOS
台机器。
更新
调试服务器发现,还有另一个ProtectionDomain
未签名且没有代码库,并且缺少Runtime.getClassLoader
权限。但是,ProtectionDomain
我的开发机器上不存在该特定内容,并且我无法找到该特定内容的来源。
更新 2
更多信息:当抛出异常时,AccessControlStack 包含一个特权上下文(我实例化和预期的那个)和 5 个额外ProtectionDomain
的 s。如前所述,其中一个(有问题的)有 a CodeSource
of (null <no signer certificates>)
,没有 Principals,有 anull
PermissionCollection
并且使用org.drools.util.CompositeClassLoader
.
此域授予的权限(取自domain.toString()
):
Runtime.getClassLoader
但是,根据我阅读的文档,这显然没有,因为我通过 授予该权限doPrivileged
,这根本不重要。
我看到 ApplicationServer 使用 Wildfly-Elytron 1.0.2.Final 作为其 SecurityManager - Elytron 是否有可能不实现此行为?
更新 3:
第三台开发机器被用来检查,那台机器也失败了。由于这台机器也使用 Ubuntu,我们可以肯定地说这不是CentOS
原因。
更新 4:
如您所见,授予的权限与默认java.policy
权限大致相同,根据 Wildfly Docs 的说法,甚至不应再使用默认权限。
我们发现org.jboss.security.jacc.DelegatingPolicy
似乎委托给了中定义的权限,java.policy
而不是standalone.xml
.
java - 安装安全管理器后 Spring fat jar 启动抛出类未找到异常
在我安装了自己的安全管理器之后,我尝试使用“java -jar”命令来启动 spring 打包的 fat jar。它只是将所有功能委托给其父类。然后我无法在命令行中启动我的应用程序,它给了我以下异常:
我的安全策略文件只是简单地授予代码的所有权限,例如grant {
permission java.security.AllPermission;
};
在我的 pom 文件中,我还包含了 spring web 组件(嵌入式 tomcat),我认为它也可能与此相关的一些问题?
我一直很难解决这个问题,但仍然无法解决。因此,如果有任何问题或您需要更详细的信息,请帮助并纠正我。
java - 在 java 安全策略中阻止某些权限并授予其他权限
我想通过以下方式实现安全策略文件:-
- 限制对除 3 个目录中的文件之外的所有文件的访问,即如果代码访问这 3 个目录中的文件,则应该允许,但对任何其他目录的文件访问都受到限制。
- 授予代码库的所有其他权限。
我该如何继续为此要求创建策略文件。
java - 为什么 java.security.AccessControlContext 中有一个冗余变量 debugInit?
我正在通过java.security.AccessControlContext,并遇到以下代码:
问题:为什么我们需要一个额外的变量,当我们可以简单地debugInit
检查如下:if (debug == null)
getInstance()
我是否遗漏了某些东西,或者是否有任何特定理由使用附加变量debugInit
(其他任何地方都没有引用)?
java - 如何将安全策略文件添加到 rmi 应用程序的 gradle 构建?
谁能告诉我如何将 java 命令添加"-Djava.security.policy=mysecurity.policy"
到应用程序的gradle
构建中java rmi
。谢谢。
这是我运行 gradle run 时遇到的错误
毕业运行
任务:在线程“主”java.security.AccessControlException 中运行异常:在 java.security.AccessControlContext.checkPermission(AccessControlContext.java :472) 在 java.security.AccessController.checkPermission(AccessController.java:884) 在 java.lang.SecurityManager.checkPermission(SecurityManager.java:549) 在 java.lang.SecurityManager.checkConnect(SecurityManager.java:1051) 在 java .net.Socket.connect(Socket.java:584) 在 java.net.Socket.connect(Socket.java:538) 在 java.net.Socket.(Socket.java:434) 在 java.net.Socket.( Socket.java:211) 在 sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40) 在 sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613) 在 sun.rmi.transport.tcp.TCPChannel 的 sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:148) .createConnection(TCPChannel.java:216) 在 sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) 在 sun.rmi.server.UnicastRef.newCall(UnicastRef.java:338) 在 sun.rmi。 registry.RegistryImpl_Stub.rebind(RegistryImpl_Stub.java:147) 在 identityserver.server.IdServer.setupServer(IdServer.java:73) 在 identityserver.server.IdServer.main(IdServer.java:32) <<<===== ====----> 75% 执行 [13s]java:613) 在 sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) 在 sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) 在 sun.rmi.server.UnicastRef .newCall(UnicastRef.java:338) 在 sun.rmi.registry.RegistryImpl_Stub.rebind(RegistryImpl_Stub.java:147) 在 identityserver.server.IdServer.setupServer(IdServer.java:73) 在 identityserver.server.IdServer.main( IdServer.java:32) <<<=========----> 75% 执行 [13s]java:613) 在 sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) 在 sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) 在 sun.rmi.server.UnicastRef .newCall(UnicastRef.java:338) 在 sun.rmi.registry.RegistryImpl_Stub.rebind(RegistryImpl_Stub.java:147) 在 identityserver.server.IdServer.setupServer(IdServer.java:73) 在 identityserver.server.IdServer.main( IdServer.java:32) <<<=========----> 75% 执行 [13s]147) 在identityserver.server.IdServer.setupServer(IdServer.java:73) 在identityserver.server.IdServer.main(IdServer.java:32) <<<=========----> 75 % 执行 [13 秒]147) 在identityserver.server.IdServer.setupServer(IdServer.java:73) 在identityserver.server.IdServer.main(IdServer.java:32) <<<=========----> 75 % 执行 [13 秒]
:跑
//Gradle构建文件
//Java rmi 服务器类,带有安全管理器集
java - 为什么 java tcp 服务器接受关闭的套接字?
我有一个接受 TCP 连接并将这个新套接字发送到线程 B 的类 A,在那里接收和发送来自该套接字的数据。
这在过去工作得相当好,但最近我经常收到以下错误。
我不明白为什么在多年工作正常之后现在会发生这种情况。这是由于网络问题还是线程相关的东西?
更新:这可能是与服务器相关的问题吗?因为相同的应用程序正在其他服务器上运行,但他们没有这个问题。
java - 我可以使用 java.security 强制可见性吗?
这是关于 Groovy(Java 的超集/现代化)的这个问题的后续内容,其中看似基本上没有信息隐藏,也没有任何封装。
但是在 Java 中当然也有反射,这意味着private
和protected
package-private 本质上是没有意义的,或者更糟的是:创造一种虚假的安全感。
在 Java 中,有没有办法强制执行某种可见性,不一定是在特定意义上强制执行上述可见性修饰符和包私有,使用SecurityManager
? 我才刚刚开始研究后者,我看不到任何非常明显的方式来完成类似的事情。但似乎一些开发人员必须在某些类和方法不完全公开可见性的情况下发布代码......那么它是如何完成的呢?
PS 在我有点熟悉的 Lucene 包中,我注意到很多类都变成了final
(这有时让我有些头疼......)但我很确定,虽然不是当然,该反射可用于压缩该修饰符
java - 运行与安全管理器相关的 EvoSuite 测试时出现异常
我正在尝试使用本教程运行 EvoSuite 测试。
我能够生成测试类并使用 java 8 编译它们。但是,当尝试使用以下命令运行它时,会引发异常。
抛出异常:
有人可以帮助/指导我解决这个问题吗?提前致谢。
附加信息:
测试类是一个单例,它使用 JDBC API 连接到数据库以检索某些值。