我目前正在尝试使用java的安全机制,以了解如何在沙箱中最好地执行不受信任的代码。您要防范的一件事是无限循环,这就是为什么理想情况下您希望在自己的线程中运行不受信任的代码。当然,现在,恶意代码可能会做一些繁重的处理,导致挂起的线程。要摆脱这个线程本质上唯一的方法是使用java的弃用的Thread.stop()机制。这是有问题的主要原因是线程持有的所有锁都被释放,这可能导致对象损坏。
问题是:使用Java的SecurityManager和自定义类加载器,我能够跟踪,例如,可以加载哪些类以及可以访问哪些系统资源。有没有办法通知(并可能禁止)代码获取锁(例如,定义在当前线程进入同步块之前通知的回调)。
答案 0 :(得分:4)
如果您已经在使用自定义类加载器,则可以在加载之前检查每个类的字节码,如果包含抓取锁定的指令(monitorenter)则检测它。
您还应该考虑使用stop()释放的锁只有在其他代码可能锁定的共享对象上获取时才会出现问题。如果你可以避免在“邪恶”线程中访问这些对象,那么你就是安全的。