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

在运行用户提供的Java代码时,我应该防范哪些安全风险?,java,Java,在服务器上运行用户提供的Java代码是否有一个全面的安全问题列表?我已经准备好了 使用10秒的超时 在可用内存有限的单独进程中运行代码 使用SecurityManager防止文件和网络IO 在文件系统权限极其有限的帐户下运行代码 如果有必要的话,我会在FreeBSD服务器上运行此程序。我会问自己的问题是,‘我有多信任这些人,我有多信任他们的代码不会破坏我的系统?’一般来说,我的答案不会太多,也不会太远。但是,在我的脑海里,以下是一些我想要预防的事情 无限循环(超时帮助) 不可靠的I/O操作

在服务器上运行用户提供的Java代码是否有一个全面的安全问题列表?我已经准备好了

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

如果有必要的话,我会在FreeBSD服务器上运行此程序。

我会问自己的问题是,‘我有多信任这些人,我有多信任他们的代码不会破坏我的系统?’一般来说,我的答案不会太多,也不会太远。但是,在我的脑海里,以下是一些我想要预防的事情

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

还有很多事情需要警惕,所以我会小心行事。尽可能地保护每个帐户和<代码> /home <代码>目录(一个简单的<代码> CHMOD 700 $ home \代码>将经常这样做),并且在部署之前,您将考虑代码的不确定性。一旦您对服务器的运行状况感到满意,就允许其他人测试您的服务器,看看它运行得如何。

看起来是一个非常好的开始-安全管理器对于沙箱处理您没有明确提及的所有其他内容至关重要(当然,比如防止用户禁用安全管理器,以及能够调用任意命令、使用本机代码或让操作系统执行文件等)。我假设您从零权限开始,只授予所需的显式权限

Security Manager无法通过过度使用资源来处理拒绝服务,但您的其他控件可能会解决这一问题(防止网络连接、控制磁盘使用、超时以防止占用CPU—如果您所说的超时是指超时的话)

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

仍然偶尔会有JVM漏洞,因此风险取决于服务器上还有什么,以及问题的实际后果(如果必须擦除服务器,后果有多严重?)


另请参见:和

即使有一个全面的列表,它在发布时也可能过时。您是否担心拒绝服务?JVM进程是否从其父进程继承文件描述符?您如何限制类路径?用户提供的Java调用
System.loadLibrary
?最后,当呃,我听说有人从一个不可信的源代码运行Java,我不得不问,“你知道吗?如果不知道,你能不能只运行通过Joe-E验证程序的代码呢?谢谢@MikeSamuel--Joe-E看起来不错,除了Eclipse依赖性。如果有一种方法可以在不使用Eclipse的情况下运行验证程序,我会感兴趣的。”。