冷门的 Java 应用程序安全沙箱机制了解一下

文章探讨了Java语言中对磁盘路径、网络连接和环境变量访问的严格安全检查,解释了这些检查背后的原因,以及它们如何在不同平台和应用类型(如Applet和J2ME)中发挥作用。安全策略文件详细列出了默认权限规则,并指出如何添加额外权限以满足特定需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这明显是一个安全检查代码,检查的是你是否有访问磁盘路径的权限,为什么 Java 语言需要这样的安全检查代码呢?我们再看看客户端套接字的 connect 函数源码,它需要检查用户是否有connect 某个网络地址的权限

class Socket {

public void connect(SocketAddress endpoint, int timeout) {

SecurityManager security = System.getSecurityManager();

if (security != null) {

if (epoint.isUnresolved())

security.checkConnect(epoint.getHostName(), port);

else

security.checkConnect(addr.getHostAddress(), port);

}

}

}

}

再看服务端套接字的源码,它会检查端口的监听权限

class ServerSocket {

public void bind(SocketAddress endpoint, int backlog) {

SecurityManager security = System.getSecurityManager();

if (security != null)

security.checkListen(epoint.getPort());

}

}

似乎所有和 IO 操作有关的方法调用都需要进行安全检查。跟 IO 操作相关的权限检查似乎还可以理解,不是所有的 IO 资源用户进程都是可以随意访问的。但是连环境变量都不让随意读,而且限制的还不是所有环境变量,而是某个具体的环境变量,这安全检查是不是有点过了?

class System {

public static String getenv(String name) {

SecurityManager sm = getSecurityManager();

if (sm != null) {

sm.checkPermission(new RuntimePermission(“getenv.”+name));

}

return ProcessEnvironment.getenv(name);

}

}

这是因为 Java 的安全检查管理器和操作系统的权限检查不是一个概念,Java 编写的不只是服务端应用程序,它还可以作为客户端跑在浏览器上(Applet),它还可以以 app 的形式跑在手机上(J2ME),针对不同的平台 JVM 会使用不同的安全策略。对于 Applet 而言,受限尤其严苛,通常都不允许 Applet 来操作本地文件。待 Java 的安全检查通过后执行具体的 IO 操作时,操作系统还会继续进行权限检查。

我们平时在本地运行 java 程序时通常都不会默认打开安全检查器,需要执行 jvm 参数才会打开

$ java -Djava.security.manager xxx

$ java -Djava.security.manager -DDjava.security.policy=“${policypath}”

因为安全限制条件可以定制,所以还需要提供具体的安全策略文件路径,默认的策略文件路径是 JAVA_HOME/jre/lib/security/java.policy,下面让我们来看看这个文件里都写了些什么

// 内置扩展库授权规则

// 表示 JAVA_HOME/jre/lib/ext/ 目录下的类库可以全权访问任意资源

// 包含 javax.swing., javax.xml., javax.crypto.* 等等

grant codeBase “file:${{java.ext.dirs}}/*” {

permission java.security.AllPermission;

};

// 其它类库授权规则

grant {

// 允许线程调用自己的 stop 方法自杀

permission java.lang.RuntimePermission “stopThread”;

// 允许程序监听 localhost 的随机可用端口,不允许随意订制端口

permission java.net.SocketPermission “localhost:0”, “listen”;

// 限制获取系统属性,下面一系列的配置都是只允许读部分内置属性

permission java.util.PropertyPermission “java.version”, “read”;

permission java.util.PropertyPermission “java.vendor”, “read”;

permission java.util.PropertyPermission “java.vendor.url”, “read”;

permission java.util.PropertyPermission “java.class.version”, “read”;

permission java.util.PropertyPermission “os.name”, “read”;

permission java.util.PropertyPermission “os.version”, “read”;

permission java.util.PropertyPermission “os.arch”, “read”;

permission java.util.PropertyPermission “file.separator”, “read”;

permission java.util.PropertyPermission “path.separator”, “read”;

permission java.util.PropertyPermission “line.separator”, “read”;

permission java.util.PropertyPermission “java.specification.version”, “read”;

permission java.util.PropertyPermission “java.specification.vendor”, “read”;

permission java.util.PropertyPermission “java.specification.name”, “read”;

permission java.util.PropertyPermission “java.vm.specification.version”, “read”;

permission java.util.PropertyPermission “java.vm.specification.vendor”, “read”;

permission java.util.PropertyPermission “java.vm.specification.name”, “read”;

permission java.util.PropertyPermission “java.vm.version”, “read”;

permission java.util.PropertyPermission “java.vm.vendor”, “read”;

permission java.util.PropertyPermission “java.vm.name”, “read”;

};

grant 如果提供了 codeBase 参数就是针对具体的类库来配置权限规则,如果没有指定 codeBase 就是针对所有其它类库配置的规则。

安全检查没有通过,那就会抛出 java.security.AccessControlException 异常。即使安全检查通过了,操作系统的权限检查仍然可能通不过,这时候又会抛出其它类型的异常。

授权规则采用白名单,依据上面的配置意味着启用默认安全策略的 JVM 将无法访问本地文件。如果需要访问本地文件,可以增加下面的规则

permission java.io.FilePermission “/etc/passwd”, “read”;

permission java.io.FilePermission “/etc/shadow”, “read,write”;

permission java.io.FilePermission “/xyz”, “read,write,delete”;

// 允许读所有文件

permission java.io.FilePermission “*”, “read”;

Permission 的配置参数正好对应了它的构造器参数

public FilePermission(String path, String actions) {

super(path);

给大家的福利

零基础入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

在这里插入图片描述

因篇幅有限,仅展示部分资料

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值