0

我目前正在编写一个内部编码挑战 Web 应用程序,我想知道除了运行时的 java 选项之外,是否还有其他安全预防措施。因此客户端将通过网络浏览器访问网页,提交他们的代码,服务器将编译并运行该代码。

java -Djava.security.manager=default

基本上,挑战将更多地集中在单线程数学和算法上。所以我需要启用基本数据结构对象并禁用任何文件、套接字、线程或任何可能不那么重要的东西。

根据我的快速搜索,如上所述打开安全管理器似乎是一个解决方案,但由于这是与安全相关的,我想在它生效之前确定。

还有什么我可以做的更多吗?

4

1 回答 1

1

首先在 chroot 监狱中运行您的代码 - 我建议使用jailkit(在dom-judge中使用)来自动化监狱构建过程(我假设您处于某种类似 unix 的环境中)。Chroot jail 比完整的 VM 更轻量级,并且更易于设置。有些人尝试使用AppArmor(在edx中使用)达到相同的效果。如果两者都不可用,请使用 VirtualBox 等虚拟机;vagrant对于虚拟机设置可能会派上用场。

无论您做什么,都不要只依赖 JVM 安全性。我见过的所有严肃的编码挑战系统都使用上述机制之一,通常有几个“代码执行器”机器在任务出现在公共队列时接受它们。这个想法是,尽管环境设置和拆卸可能很慢,但通过保持足够的执行机器处于待机状态,任何传入的作业都可以立即处理。

特别是,JVM 权限不包括时间限制、线程或最大堆大小。您将需要使用setrlimit来控制运行时和堆。我不知道如何限制 Java 线程的创建,但稍微研究一下可能会发现更多。

话虽如此,您始终可以提供一个空的安全策略,例如:

grant {
};

这应该禁止任何和所有安全请求操作。

于 2013-11-10T23:42:26.030 回答