运行用户提供的Java代码时,我应该防范哪些安全风险?

时间:2012-01-27 23:04:57

标签: java

是否有关于在服务器上运行用户提供的Java代码的安全问题的完整列表?我已经

  • 使用10秒的超时
  • 在具有有限可用内存的单独进程中运行代码
  • 使用SecurityMangager阻止文件和网络IO
  • 在文件系统权限极为有限的帐户下运行代码

如果重要的话,我在FreeBSD服务器上运行它。

2 个答案:

答案 0 :(得分:3)

看起来是一个非常好的开始 - 安全管理器对于沙箱化一大堆你没有明确提及的东西是必不可少的(比如阻止用户禁用安全管理器,当然,并且能够调用任意命令,或使用本机代码,或获取操作系统执行文件等)。我假设您从零权限开始,只是授予所需的显式权限。

安全管理器无法通过过多的资源使用来处理拒绝服务,但是您的其他控件可能会解决此问题(阻止网络连接,控制磁盘使用,超时以防止CPU占用 - 如果超出您的意思)

你说“文件系统权限非常有限” - 希望这还包括磁盘配额?你在运行多个不受信任的进程,它们共享磁盘空间吗?用完文件句柄可能是一个问题(不确定如何为有限的帐户管理这些句柄)。

仍然偶尔存在JVM漏洞,因此风险取决于服务器上的其他内容,以及问题的实际后果(如果必须擦除服务器有多糟糕?)。

另请参阅:Sandbox against malicious code in a Java applicationExecute external Java source code on server - limit security and resources?

答案 1 :(得分:1)

我问自己的问题是,“我相信人民多少,我相信他们的代码不会破坏我的系统多少?”总的来说,我的回答并不多,而且我的投入也不多。但是,在我的头脑中,这里有一些我想要防范的事情。

  • 无限循环(超时帮助)
  • 狡猾的I / O操作(尝试从/向他们无法访问的目录读/写)
  • 权限提升代码(将帐户限制为只能在特定上下文中执行,或者使用特定权限是一个巨大的优势)
  • 创建太多对象/删除内存(限制可用内存和/或资源是一个优势)
  • 从/向套接字读取/写入而不释放资源
  • 期待来自STDIN的输入,如果服务器无头,可能会出现问题

很多更需要警惕,所以我会谨慎行事。尽可能保护每个帐户和/home目录(简单的chmod 700 $HOME通常会这样做),并尝试在公开部署之前考虑狡猾的代码。一旦您对服务器的稳定性感到满意,就让其他人测试您的服务器,看看它的运行情况。