【问题标题】:Stopping Hostile Threads in JVM停止 JVM 中的恶意线程
【发布时间】:2011-07-17 16:53:20
【问题描述】:

我正在编写一个服务器,它可能正在运行恶意代码。为了防止攻击者将线程抛入无限循环,我想强制执行一秒的执行时间限制。

InterruptedException 可以被捕获在无限循环中,从而允许攻击者保留对线程的控制。因此Thread.interrupt() 不是一个可接受的解决方案。

我当前的实现阻止恶意线程获取任何资源(包括锁),使用Thread.stop() 终止执行,并恢复线程所做的任何更改。我的主要抱怨是它使用了已弃用的Thread.stop() 方法;我不喜欢使用已弃用的代码。

我想知道是否有一个更被行业接受的解决方案,除了启动/杀死一个全新的 JVM,这对于我的目的来说开销太大。

【问题讨论】:

  • 以支持廉价沙箱的语言运行不受信任的代码。 Lua 对此很好,但我不知道是否有针对 JVM 的实现。顺便说一句,您如何防止它获取资源或使用危险的 API?
  • 我不认为将敌对线程限制为 1 秒有什么好处。 1 秒是几十亿条指令。
  • 我结合了极其严格的访问控制器和一些字节码操作。对于我正在考虑的呼叫类型,1 秒是一个慷慨但合理的限制。我只是想避免有人恶意启动一堆永远不会完成的线程。
  • @Jim,如果你要运行完全未知的代码,你需要一个单独的进程。没有其他办法,-XX:+TieredCompilation 可以缓解这个问题,您可能希望将 JVM 保留在 ram-disk 或至少 SSD 上以加快启动速度。也可以随意使用 Thread.stop(),如果你可以做 Thread.suspend() 遍历堆栈并确定可以到 stop()。然而,即使使用最严格的 SecurityManager,也有很多方法(恶意)导致 DoS。所以一个解决方案是将不安全的代码运行到一个单独的进程(或多个)中,如果它没有响应就强行杀死。

标签: java multithreading security jvm


【解决方案1】:

杀死线程的唯一方法是使用单独的进程并杀死该进程。 Thread.stop() 抛出一个可以被捕获和忽略的 ThreadDeath 错误。即catch(Throwable t) {}

有关 Thread.stop() 实际作用的更多详细信息Does Thread.stop() really stop a Thread?

【讨论】:

  • 我在检测加载的字节码以捕获 ThreadDead 并重新抛出它方面取得了一些成功。
  • 好吧,我不知道 ThreadDeath,而且 java.lang.Error 已经在我的白名单上,所以我最初的解决方案开始觉得太不安全了。感谢所有的反馈!我在想我应该创建一些工作进程,我可以将任务委托给它们,并在必要时终止。 JVM 开销和额外的序列化将是非常不幸的,但我没有看到安全的替代方案。
【解决方案2】:

您不能保证线程可以停止,因为多个阻塞方法(如套接字)不响应 interrupt()。

我建议您使用非常严格的安全管理器,这样您就可以绝对确定恶意代码已被沙盒化。如果您需要确定,请考虑使用特殊的类加载器,以确保仅执行有效操作。

【讨论】:

  • I would suggest a very strict security manager so you can be **absolutely certain**,除非检测到字节码,否则在 java 中是不可能的。
  • 但这并不能阻止 DoS,例如不会停止的线程。
  • 是的,我正在使用一个非常严格的访问控制器,并且正在执行字节码操作以防止许多其他操作。正如 bestsss 所观察到的那样,这里的目标是防止 DoS 之类的不停止线程。
猜你喜欢
  • 2016-11-18
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
相关资源
最近更新 更多