是的,在安全性方面,優良作法是在不再需要數據時覆蓋特別敏感的數據,即作為對象析構函數(由語言提供的顯式析構函數或程序採取的操作)的一部分在取消分配對象之前)。甚至最好的做法是覆蓋本身不敏感的數據,例如將不再使用的數據結構中的指針字段清零,並且當指向的對像被釋放時將指針清零,即使您知道您將不再使用該字段。
這樣做的一個原因是,如果數據因外部因素(例如暴露的核心轉儲,被盜的休眠映像,受損害的服務器允許內存)洩漏而洩漏攻擊者提取RAM棒並利用數據保留能力的物理攻擊很少引起關注,除非在便攜式計算機上,也許在移動設備(例如電話)上(由於RAM被焊接,所以閾值較高),甚至在大多數情況下也只針對目標場景。改寫值的剩餘性不是問題:要在RAM芯片內部進行探測以檢測任何可能受改寫值影響的揮之不去的微小電壓差,將需要非常昂貴的硬件。如果您擔心對RAM的物理攻擊,那麼更大的問題就是確保將數據寫在RAM中,而不僅僅是在CPU緩存中。但這又通常是一個很小的問題。
覆蓋陳舊數據的最重要原因是為了防禦導致使用未初始化內存的程序錯誤,例如臭名昭著的 Heartbleed。這超出了敏感數據的範圍,因為風險不僅限於數據洩漏:如果存在某個軟件錯誤導致指針字段在未初始化的情況下被取消引用,則該錯誤不那麼容易被利用,並且如果
請注意,如果好的編譯器檢測到不再使用該值,則該字段將全部清零。
請注意,好的編譯器會優化清零。您可能需要使用一些特定於編譯器的技巧,以使編譯器相信該值仍在使用,從而生成清零代碼。
在許多具有自動管理功能的語言中,對象可以在不移動的情況下移動到內存中注意。這意味著很難控制陳舊數據的洩漏,除非內存管理器本身會擦除未使用的內存(出於性能目的通常不會這樣做)。從好的方面來說,外部洩漏通常是您所要擔心的,因為高級語言往往會阻止使用未初始化的內存(請注意具有可變字符串的語言中的字符串創建函數)。
順便說一句,我在上面寫了“歸零”。您可以使用除全零以外的位模式。全零的優點是在大多數環境中它都是無效的指針。您知道的位模式是無效的指針,但是更具特色的位模式可以幫助調試。
許多安全標準要求擦除敏感數據(例如密鑰)。例如,用於加密模塊的 FIPS 140-2標準甚至在最低保證級別上也要求它,除此之外,它僅要求功能合規且不需要抵抗攻擊。