2013-06-06 83 views
5

我目前嘗試了很多與Java的安全機制,以瞭解如何最好地在沙箱中運行不受信任的代碼。你想要防止的事情之一是無限循環,這就是爲什麼你想在自己的線程中運行不可信代碼的原因。當然,現在,惡意代碼可能會進行一些繁重的處理,導致掛起的線程。爲了擺脫這個線程,唯一的方法是使用java的不推薦使用的Thread.stop()機制。這是有問題的主要原因是線程持有的所有鎖都被釋放,這可能導致對象損壞。的Java:監控採集鎖

的問題是:Java的安全管理器和定製類裝入器,我能夠跟蹤,例如,哪些類可以加載和哪些系統資源可以被訪問。是否有辦法通知(並可能禁止)獲取鎖的代碼(例如,定義在當前線程進入同步塊之前通知的回調)。

回答

4

如果您已經使用了定製的ClassLoader,你可以檢查每個類的字節碼加載它之前,如果包含抓起鎖(monitorenter)的指令檢測到它。

你也應該考慮到,如果他們是在共享對象的其他代碼可能會鎖定收購()與停車鎖釋放只是一個問題。如果您可以避免在「邪惡」線程中訪問此類對象,則您很安全。

+0

如此,雖然理想,我不想放棄類,只是因爲他們可能獲取鎖。我當然可以在加載和插入回調時更改字節碼,但這不適用於java。*中的任何類。 monitorenter是唯一一個告訴vm抓住鎖的字節碼指令嗎? –

+0

但是,只有編譯同步塊時纔會發出monitorenter,而在調用同步方法時,鎖獲取是隱式的。所以你也必須阻止線程獲得對同步方法的共享對象的訪問。如果代碼是在java中。*,不過,你應該假設它不是邪惡的:) –

+0

在Java代碼。*是不是邪惡的。但是,如果來自java。*的對象被共享,例如來自java.concurrent的隊列,那麼即使從外部使用該對象,也會從java。*內獲取該鎖。 –