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