有没有办法让Java中的SecurityManager根据调用setAccessible()的详细信息有选择地授予ReflectPermission("suppressAccessChecks")?我认为没有办法做到这一点.
对于某些沙盒代码,它将非常有用(例如运行各种动态JVM语言)以允许调用setAccessible()反射API,但仅当在发起的类的方法/字段上调用setAccessible()时在沙盒代码中.
除非选择性授予ReflectPermission("suppressAccessChecks"),否则是否有任何其他建议?在所有情况下,如果SecurityManager.checkMemberAccess()具有足够的限制性,那么授予它是否安全?
我对Java(6+)如何分发其安全框架感到困惑.一方面,您有以下包(及其各自的子包和类型):
java.security.*javax.security.*而另一方面,您可以java.lang.SecurityManager使用其他非安全包(例如java.lang)中的其他安全相关类型.
那么,有几个问题:
java.security和之间有什么区别javax.security?何时使用每种类型?java.lang,还有其他任何以安全为中心的类型出现的软件包,如果有的话,它们是什么?提前致谢!
是否足以使用运行应用程序服务器进程的用户的权限来保护Java Web应用程序,或者将SecurityManager与合适的策略文件一起使用是否合理?
我曾经做过前者,而不是后者,但有些客户希望我们也使用SecurityManager,它会明确地为每个第三方组件提供权限,以确保没有任何恶意代码潜伏在那里.
我已经看到一些Servlet容器,比如Resin,建议不要使用SecurityManager来减慢速度.有什么想法吗?
请不要回答说"你不应该这样做".我不打算在生产代码中使用它,但仅限于一些黑客的乐趣.
在回答这个问题时,我想运行一些任意不安全的Java代码以获得乐趣.有问题的代码涉及只查找Java 的叶节点TreeMap.
运行以下代码会导致
Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.util
Run Code Online (Sandbox Code Playgroud)
根据这个问题,我可以System.setSecurityManager(null)用来解决大多数这些限制.但是我不能这样做,因为在我的类被加载时弹出错误.
我已经知道在禁用安全管理器后我可以做我想要使用反射的所有内容.但这会使代码变得更加丑陋.核心Java开发人员如何编写单元测试,例如,如果他们无法打包内容java.util?
我也尝试了-Djava.security.manager=...但是当我将它设置为时会导致JVM初始化错误null,我不知道还能将其设置为什么.有任何想法吗?
package java.util;
import java.util.TreeMap.Entry;
public class TreeMapHax {
static <K,V> List<Entry<K, V>> getLeafEntries(TreeMap<K, V> map) {
Entry<K, V> root = map.getFirstEntry();
while( root.parent != null ) root = root.parent;
List<Entry<K,V>> l = new LinkedList<Entry<K,V>>();
visitInOrderLeaves(root, l);
return l;
}
static <K,V> void visitInOrderLeaves(Entry<K, V> node, List<Entry<K, V>> …Run Code Online (Sandbox Code Playgroud) 我正在尝试重现用于执行Java的API(如ideone.com),但到目前为止,我在运行Java沙箱时遇到了很多困难(SELinux沙箱不起作用).
我听说过SecurityManager,但是我想弄清楚在沙盒中运行Java代码的最简单方法(有点像在浏览器中运行的Java applet),而不是使用SecurityManager编写自己的jail服务器.
我希望有人能帮我解决以下问题:
我对Java堆栈内省的理解(这里可能有点过分简化)是一个进程生成一个堆栈帧然后被添加到堆栈中.现在,当进程需要进行系统调用时,堆栈内省算法会检查是否允许主体(即尝试访问资源的进程)使用特定资源,然后相应地注释框架(授予或禁止访问) ).
我的问题是:
permission java.net.SocketPermission "192.168.1.1:31337", "connect, accept, resolve";
Run Code Online (Sandbox Code Playgroud)
以下权限允许什么?我的应用程序是否允许仅接受来自192.168.1.1:31337的连接(可能是外部客户端)或接受连接到192.168.1.1:31337(我的应用程序运行在192.168.1.1:31337,这与'listen不同"?).
我正在编写一个Java系统,其中代码在非常严格的沙箱中执行.一个查询(由一个或多个类组成)应该只允许在执行期间访问一个文件夹(以及文件夹中包含的子文件夹和文件).
我通过使用a SecurityManager和新的ClassLoader每个查询执行来强制执行沙盒.当在定义类的ClassLoader使用defineClass,我沿着传递ProtectionDomain包含应授予该文件的读取权限.
由于并非调用堆栈上的所有对象都具有所需的权限,因此查询中的读取操作在AccessController.doPrivileged(...)-block 中运行.
AccessController.checkPermission(...)从doPrivileged(...)块内直接调用时,它会以静默方式返回System.getSecurityManager().checkPermission(...),将请求转发给AccessController,然后AccessController抛出异常.ProtectionDomain似乎打电话时迷路AccessController通过SecurityManager?java.io.FileReader),直接调用SecurityManager而不是AccessController.我如何获得的AccessController,通过调用时SecurityManager,要尊重ProtectionDomain调用该类别的doRestricted(...)-块?SecurityManager本身没有所需的权限吗?因此,通过夹在特权代码之间的调用堆栈中,并AccessController生成一个没有的特权联合?下面是一个示例部分:
AccessController.doPrivileged(new PrivilegedAction<QueryResult>() {
public QueryResult run() {
String location = folderName + "/hello";
FilePermission p = new FilePermission(location, "read");
try { …Run Code Online (Sandbox Code Playgroud) 我正在构建一个SWING应用程序,还需要编写一个自定义的SecurityManager.如果我写一个像这样扩展SecurityManager的空类
public class Sandbox extends SecurityManager {}
Run Code Online (Sandbox Code Playgroud)
它运行正常,这意味着GUI被正确呈现,并且所有特权(如I/O)都被撤销.但是我需要自定义checkPermission方法,每当我覆盖它时,任何东西都不再有效......为什么即使是这样的东西也不行?
public class Sandbox extends SecurityManager {
@Overide
public void checkPermission(Permission perm) {
super.checkPermission(perm);
}
}
Run Code Online (Sandbox Code Playgroud)
更新:显示问题的一个非常基本的例子就是这个
public static void main(String[] args) {
System.setSecurityManager(new SecurityManager() {
@Override
public void checkPermission(Permission p) {
if (some_condition_here) {
// Do something here
} else {
// Resort to default implementation
super.checkPermission(p);
}
}
});
new JFrame().setVisible(true);
}
Run Code Online (Sandbox Code Playgroud)
删除"checkPermission"方法应用程序正常工作,但我真的无法理解这一点.
我正在创建一个允许用户执行上传的Java文件的应用程序.我试图限制他们可以用安全管理器做什么.空白的策略文件是否会限制最多,不允许它们尽可能多地执行操作?这会限制他们做一些基本的事情,我不应该限制他们吗?
java ×10
securitymanager ×10
security ×5
sandbox ×2
java-ee ×1
jce ×1
jvm ×1
permissions ×1
reflection ×1
sockets ×1
swing ×1
treemap ×1