问题标签 [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 安全管理器会降低性能吗?
实施 Java 安全管理器会导致性能下降吗?
java - 在 SecurityManager 下创建对象时出现 NoClassDefFoundError
我试图通过在非常严格的 SecurityManager 下运行处理用户提供的内容的代码来保护我的应用程序。它是 AccessController.doPrivileged() 的转折点——通常这用于提供具有额外权限的代码块,但我使用它将代码块限制在一个非常小的沙箱中。
一切都很好,直到我需要调用构造函数。然后我需要对世界的读取权限。(或者至少对我的类路径上的所有 .jar、.class 和 .property 文件。)我不能只授予对 <> 的读取访问权限,因为这是我试图避免的。(例如,试图读取 /etc/passwd 的 XEE 攻击。)我认为这还不够。
我可以将一些构造函数移出 SecurityManager 块,但有些是不可避免的,因为它是一个 SAX 解析器,需要在遍历树时创建对象。
想法?
java - Java 安全性:通过 URLClassLoader 加载的沙盒插件
问题摘要:如何修改下面的代码,以便不受信任的、动态加载的代码在安全沙箱中运行,而应用程序的其余部分保持不受限制?为什么 URLClassLoader 不像它所说的那样处理它?
编辑:更新以回应 Ani B.
编辑 2:添加了更新的 PluginSecurityManager。
我的应用程序有一个插件机制,第三方可以提供一个包含实现特定接口的类的 JAR。使用 URLClassLoader,我可以加载该类并实例化它,没问题。因为代码可能不受信任,所以我需要防止它行为不端。例如,我在一个单独的线程中运行插件代码,以便在它进入无限循环或时间过长时将其终止。但是试图为他们设置一个安全沙箱,这样他们就不能做诸如建立网络连接或访问硬盘上的文件之类的事情,这让我非常生气。我的努力总是导致要么对插件没有影响(它与应用程序具有相同的权限),要么还限制了应用程序。我希望主应用程序代码能够做任何它想做的事情,
关于该主题的文档和在线资源是复杂的、令人困惑的和矛盾的。我已经在不同的地方(例如这个问题)读到我需要提供一个自定义的 SecurityManager,但是当我尝试它时我遇到了问题,因为 JVM 延迟加载 JAR 中的类。所以我可以很好地实例化它,但是如果我在加载的对象上调用从同一个 JAR 实例化另一个类的方法,它就会爆炸,因为它被拒绝从 JAR 读取的权利。
从理论上讲,我可以在我的 SecurityManager 中检查 FilePermission 以查看它是否试图从自己的 JAR 中加载。这很好,但是URLClassLoader 文档说:“默认情况下,加载的类仅被授予访问 URLClassLoader 创建时指定的 URL 的权限。” 那么为什么我什至需要一个自定义的 SecurityManager 呢?URLClassLoader 不应该只处理这个吗?为什么不呢?
这是一个重现问题的简化示例:
主应用程序(受信任)
插件测试.java
插件.java
PluginSecurityManager.java
插件线程.java
插件 JAR(不受信任)
我的插件.java
更新: 我对其进行了更改,以便在插件代码即将运行之前通知 PluginSecurityManager 以便它知道它正在使用哪个类源。然后它将只允许对该类源路径下的文件进行文件访问。这也有一个很好的优势,我可以在我的应用程序开始时设置一次安全管理器,并在我输入和离开插件代码时更新它。
这几乎解决了这个问题,但没有回答我的另一个问题:为什么 URLClassLoader 不像它所说的那样为我处理这个问题?我将把这个问题留待一段时间,看看是否有人对这个问题有答案。如果是这样,该人将获得接受的答案。否则,我会将它授予 Ani B.,前提是 URLClassLoader 文档存在缺陷,并且他关于制作自定义 SecurityManager 的建议是正确的。
PluginThread 必须在 PluginSecurityManager 上设置 classSource 属性,这是类文件的路径。PluginSecurityManager 现在看起来像这样:
java - 有没有办法在 Java 中使用多个 SecurityManager(s)?
我想知道是否有办法在 java 中使用多个安全管理器,如果有,如何为它们指定一个特定的 .policy 文件?
我一直在查看有关安全性的java se 6 文档,但在那里找不到任何答案...
感谢大家的帮助!
java - Java SocketPermission 政策问题
我有一个尝试相互通信的客户端和服务器程序。在我的服务器策略文件中,我指定了以下内容:
在我客户的策略文件中,我有:
我启动我的服务器,它侦听端口 2225。然后我启动我的客户端,它尝试连接到正在侦听端口 2225 的服务器。不幸的是,我在服务器上收到此错误:
端口号不断变化;我假设它是客户端的端口号(服务器连接回客户端的位置?)。那是对的吗?对于此分配,对端口号指定了限制:
您的客户端和服务器应该使用 Java 安全管理器,并且您的项目必须为每个定义了运行所需权限的策略文件。允许您的服务器和客户端使用2220-2230范围内的端口在 localhost 上相互联系。
我怎样才能遵守这个限制?还是这仅适用于服务器侦听的端口?我想如果我给予大于 2231 的端口的权限,我可以让它工作。但我不知道这是否违反了accept
限制。resolve
java - 带有安全管理器的 Swing 应用程序导致奇怪的 GUI 刷新问题
我有一个作为客户端的 Swing 应用程序(驻留在可执行的签名 jar 中)。该应用程序还连接到服务器。当满足某些条件时,我会刷新 GUI(更具体地说,删除 a 的所有节点,JTree
然后重新填充它)。当我按原样运行此客户端时(即,没有安全管理器,也没有驻留在可执行的签名 JAR 中),树刷新和更新没有任何问题。
但是,当我将客户端打包为已签名的 JAR(使用适当的策略文件)时,我会遇到刷新问题。当应用程序启动时,我JTree
的没有展开。当我单击它一次时,它看起来已经展开,但子节点不显示。之后我必须单击它两次才能显示节点。此外,当我执行刷新(删除所有节点然后重新填充)时,UI 不会正确刷新。我(再次)必须单击根节点两次以刷新 GUI。
我尝试将 AWT 权限添加到策略文件,但这没有帮助(我一开始没有看到任何权限违规,但我想我会尝试)。我什至尝试为 JAR 授予所有权限。这似乎也没有帮助。这可能是什么原因造成的?
执行刷新的代码如下:
填充树的代码(仅显示相关代码段):
就任务而言,这可能不会破坏交易,但这确实让我感到困扰;我想弄清楚是什么原因造成的。
java - Java沙箱。使用 SecurityManager 重定向 I/O 访问
目前我正在尝试编写沙箱来运行不受信任的 Java 代码。这个想法是将 Java 应用程序与访问文件系统或网络套接字隔离开来。我目前的解决方案是重写 SecurityManager,它禁止对 IO 或网络的任何访问。
现在我不想禁止,而是将调用重定向到文件系统,即如果应用程序想要写入“/home/user/application.txt”,则文件的路径应该替换为“/temp/trusted_folder/”应用程序.txt”。所以基本上我想允许应用程序只访问某个特定文件夹中的文件系统,并将所有其他调用重定向到这个文件夹。
所以这是类FileOutputStream的方法,其中询问 SM,是否有写入给定路径的权限。
显然,SM 无法访问 FileOutputStream 并且不能更改方法中的内部变量(如name或file)或以某种方式影响执行顺序,除非抛出 SecurityException。我明白,访问内部字段违反了面向对象的原则,我明白,局部变量是可见的,并且只存在于声明它们的方法内部。
所以我的问题是:有什么方法可以让安全管理器替换对文件系统的调用?如果没有,我可以使用其他方法来做到这一点吗?
我希望我足够清楚。
securitymanager - 带有 SpringSecurity 的 Java SecurityManager
我尝试加入 Java Security Manager 以使用 SpringSecurity (SS) 进行项目。我的目标是:我的项目与 SS 一起使用,并将 dataSource(db2 数据库)作为身份验证管理器。我将 ScriptManager(ScriptEngine) 添加到项目中。现在我尝试设置项目的安全性,拒绝不受信任的代码。我使用 NetBeans 并在 Tomcat (6.0.20) 的属性中设置“使用安全管理器”。接下来,我编辑了 {catalina.base}/conf/catalina.police。我添加了下一个“赠款”:
而现在的问题。当我在调试器下运行我的代码时,我得到下一个错误:
和tomcat出来:
此外,当我插入此赠款时:
一切都好。
操作系统:openSUSE 11.1 OpenJDK 1.6.0.0-b11
对于本教程使用的设置:http: //www.mikeski.net/site/node/18
谢谢大家...
java - Java SecurityManager:策略文件的好介绍
您能否推荐一个关于标准 Java SecurityManager 的重要策略文件的良好介绍?
是否有超出 Java 网站提供的示例?或者也许有人描述了如何保护运行大量不同 Web 应用程序的 Tomcat?
[编辑] 我的用例是一个可以运行由三种类型的用户编写的脚本的应用程序:1. 应用程序开发人员,2. 应用程序管理员和 3. 最终用户。
第 1 组的用户需要能够访问几乎任何资源(= 不需要特殊的 SM)。
第 2 组可以信任,但我们希望保护他们免受愚蠢的错误(例如 call System.exit
)。
第 3 组不可信任。他们通常只写小脚本。
当我运行一个脚本时,我知道它来自哪里。策略文件会帮助我的用例还是我需要编写自己的 SecurityManager?
java - Java Policy file - Deny permissions to a codebase
In the Java policy file, the grant codeBase
syntax specifies which codebase should be granted which permissions. for example,
grant codeBase "file:/C:/abc.jar" { permission java.security.AllPermission; };
grants AllPermission
to code inside abc.jar
In a similar way, Is there a way to deny
permissions to a specific syntax? Like this:
deny codeBase "file:/C:/def.jar" { permission java.io.FilePermission; };
so that the code inside def.jar
gets every other permissions except the FilePermission?
Is this even possible?
I know this can be easily done using the SecurityManager
class, but I just want to know if this is possible by using the policy file only.