我正在编写一个可能正在运行恶意代码的服务器。为了防止攻击者将线程抛入无限循环,我想强制执行一秒的执行时间限制。
InterruptedException
可以在无限循环中捕获,从而允许攻击者保留对线程的控制。因此Thread.interrupt()
不是可接受的解决方案。
我当前的实现防止恶意线程获取任何资源(包括锁),使用Thread.stop()
终止执行,并恢复线程所做的任何更改。我的主要抱怨是它使用了弃用的Thread.stop()
方法;我不喜欢使用已弃用的代码。
我想知道是否有更多行业认可的解决方案,而不是启动/杀死一个全新的JVM,这对我的目的来说会有太多的开销。
答案 0 :(得分:5)
杀死线程的唯一方法是使用单独的进程并终止该进程。 Thread.stop()抛出一个可以捕获并忽略的ThreadDeath错误。即catch(Throwable t) {}
有关Thread.stop()实际执行Does Thread.stop() really stop a Thread?
的更多详细信息答案 1 :(得分:2)
您无法保证线程可以停止,因为多个阻塞方法(如套接字)不响应interrupt()。
我建议使用非常严格的安全管理器,这样您就可以绝对确定恶意代码是沙箱。如果您需要确定,那么请考虑一个特殊的类加载器,它确保只进行有效的操作。