2016-09-28 274 views
0

如何檢查javaagent是否被注入JVM或禁用javagents連接? 我試圖阻止我的應用程序在運行時由於安全原因被修改。如何防止附加javaagent?

我知道如何防止javaagent被加載在啓動時,但我無法想出一個辦法來防止的虛API從動態連接。

任何人有想法嗎?

+0

的[java.lang.instrument中](http://docs.oracle.com/javase/8/docs/api/java/lang/instrument/package-summary.html)指定用於能夠相當嚴格的條件動態附加一個javaagent - 請參閱「VM啓動後啓動代理」 在我看來,答案可能是:「通過不履行至少一個這樣的條件 - 更好的所有」。你有什麼經驗? (你怎麼還有javaagents附加?) –

+0

@Adrian Colomitchi閱讀所需的條件,似乎我只能控制一個(類加載器)。我對類加載器並不太自信,所以編寫我自己的類加載器來阻止代理程序罐被添加到類路徑中似乎是一項艱鉅的任務。特別是,我擔心會阻止添加合法的庫。你有什麼建議嗎? – Stoud

+0

爲什麼你需要這樣做呢? 「特別是,我擔心會阻止添加合法圖書館。」當然。那麼,除了客戶之外,誰能夠最好地關心什麼是合法或非合法使用額外的庫?換句話說,爲什麼文檔中關於「如何和什麼」的強調段落不夠?你在寫安全應用程序嗎?如果不是的話,我認爲可以安全地讓用戶承擔這個責任,只需記錄它並讓他們關心。 –

回答

0

在HotSpot上,您可以設置-XX:+DisableAttachMechanism,並且在J9上,您可以通過-Dcom.ibm.tools.attach.enable=no禁用附件,但無法爲任何虛擬機禁用它。你可以做的是用premain(String, Instrumentation方法自己對任何一個類進行測試,以不通過儀器接口的實際實例或null。但我不會推薦它,這會破壞附加API的總體合同。

但是,這些都不會增加安全性。附件要求另一個具有訪問JVM進程權限的進程在同一臺機器上運行。如果是這種情況,並且這個其他進程是攻擊者,則Instrumentation API是您應該擔心的最後一個問題。另外,如果你維護一個庫,你的庫的用戶已經可以完全訪問你的代碼並且可以在運行你的代碼之前修改它。

因此,即使能可以禁用附件,有這樣做,以「保增長」就沒有收穫。

+0

我不確定我是否同意,我可以隨時檢查所有符合條件的哈希值,以防止他們更改圖書館。 – Stoud

+0

如果我可以改變你的圖書館,我可以改變你的哈希值。你可以在這裏做的最好的是安全的默默無聞。如果虛擬機可以運行你的代碼,我可以提取它。 –

+0

除了通過修改哈希值來修改正在運行的程序也可以檢查的存儲程序。只要總是有一個未修改的運行時正在運行的進程,我認爲這很難繞過。 – Stoud