【发布时间】: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