Privacy Violation: Heap Inspection 隱私泄露(堆檢查)
Abstract
將敏感數據存儲在 String 對象中使系統無法從內存中可靠地清除數據。
Explanation
如果在使用敏感數據(例如密碼、社會保障號碼、信用卡號等)后不清除內存,則存儲在內存中的這些數據可能會泄漏。 通常而言, String 是所用的存儲敏感數據,然而,由於 String 對象不可改變,因此用戶只能使用 JVM 垃圾收集器來從內存中清除 String 的值。 除非 JVM 內存不足,否則系統不要求運行垃圾收集器, 因此垃圾收集器何時運行並無保證。 如果發生應用程序崩潰,則應用程序的內存轉儲操作可能會導致敏感數據泄漏。
例 1: 下列代碼可將密碼從字符數組轉換為 String。
private JPasswordField pf;
...
final char[] password = pf.getPassword();
...
String passwordAsString = new String(password);
此種類來源於 Cigital Java Rulepack。 http://www.cigital.com/securitypack/
Recommendation
請始終確保不再需要使用敏感數據時將其清除。 可使用能夠通過程序清除的字節數組或字符數組來存儲敏感數據,而不是將其存儲在類似 String 的不可改變的對象中。 例 2: 下列代碼可在使用密碼后清除內存。
private JPasswordField pf;
...
final char[] password = pf.getPassword();
// use the password
...
// erase when finished
Arrays.fill(password, ' ');