使用沙箱JVM保护服务器免受不可信来源的攻击。

8
如何在接受和执行上传的不可信代码时保护我的服务器免受恶意活动?
用户应该能够实现我的接口并使用给定的数据进行一些计算,并返回数据。不需要进行任何I/O操作,当然也不需要进行线程/进程操作或其他骗局。
通过使用java.policy文件,可以拒绝所有访问(通过不授予任何权限)。
$ cat test.policy 
grant {
};

使用这个策略文件,未被授权的操作会引发安全异常。
$ cat Print.java
public class Print {
    public static void main(String a[]) throws Exception {
        System.out.println(System.getProperty("os.name"));
    }
}

$ javac Print.java
$ java -Djava.security.manager -Djava.security.policy==test.policy Print
Exception in thread "main" java.security.AccessControlException: 
  access denied (java.util.PropertyPermission os.name read)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
    at java.security.AccessController.checkPermission(AccessController.java:546)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
    at java.lang.SecurityManager.checkPropertyAccess(SecurityManager.java:1285)
    at java.lang.System.getProperty(System.java:650)
    at Print.main(Print.java:3)

这是否万无一失?我需要采取更多措施来保护我的服务器环境免受不可信来源的攻击吗?

1个回答

10

如果我是您,我不会只依赖SecurityManager。是的,您的配置看起来正确,如果Java沙盒没有缺陷,那就足够了。但是请看看每个Java安全版本发布时有多少Java漏洞正在被修复。例如,最新的Oracle Java CPU。许多这些Java漏洞是从沙箱中逃脱的。这在客户端非常糟糕(一些人主张关闭浏览器中的Java),但在服务器端将更加严重,因为攻击者不必引诱您到他们的网站,他们可以直接攻击您的服务器。

例如,目前我个人有几个此类漏洞,正在等待Oracle解决,或正在与Oracle沟通。而且我不是唯一一个拥有它们的研究人员。坏人也一定有。所以即使您及时更新Java,也无法保证安全。

我认为至少应该在操作系统级别上进行一些控制,如权限等,以控制服务器进程。很抱歉,我没有很好的建议,但我只是说您绝不能仅仅依赖JVM沙箱保障服务端的安全。


听起来不错。如果我在Linux虚拟机中以非特权用户身份执行呢? - Synesso
1
对我来说看起来不错,但我不能够以专业的口吻谈论这个问题。我只知道当 JVM 安全性面对整个世界时,它本身就很脆弱。 - Sami Koivu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接