2017-05-30 68 views
1

我有一個應用程序,它從Windows窗體文本框中獲取一個字符串,並將其傳遞給使用字符串作爲參數的API。我發現任務完成後仍然可以從進程內存查詢該字符串。我遇到過使用SecureString作爲字符串內存管理功能的建議。但是,如果我理解正確,如果安全字符串是從字符串構建的,或者安全字符串的值最終存儲在字符串中,則字符串的目的會被破壞。如何從進程內存中刪除字符串?

請建議什麼是最好的解決方案。

+0

它是否在電線上加密?如果沒有,爲什麼你甚至在記憶中關注它? –

+0

任何參數傳遞給執行堆棧上的方法。方法完成後,執行堆棧點將恢復到調用方法之前的位置。所以方法使用的任何變量仍然在堆棧上,不可訪問。調用方法必須在返回從堆棧中刪除對象之前銷燬該變量。 – jdweng

+0

如果它來自WinForms'TextBox'控件,那麼已經有一個未知/不可知數量的字符串拷貝到處。你無法修復這個漏洞。要麼重新設計這個以在整個過程中使用'SecureString',要麼接受有足夠權限訪問運行該代碼的計算機的人員*可能*從存儲器中讀取這些數據。但請記住 - 具有該訪問級別的人無論如何都可以輕鬆安裝鍵盤記錄程序。 –

回答

5

SecureString不被視爲安全。如果你需要來做到這一點,你可以使用char[]並覆蓋完成後的數據,或者你可以使用unsafe代碼覆蓋string完成後(只是......希望它沒有被執行或共享引用) ;注意這適用於無處不在調用堆棧中的。請注意,操作系統可能因各種原因複製了頁面,並且如果內存不是,那麼可能會在磁盤(交換文件)中仔細分配

然而,上述時間存儲分析工具在WinForms應用程序的一個因素,它會更容易使用鍵盤記錄,或只採取扳手和密碼的威脅他人:

+0

出於好奇,你能詳細說明它不被視爲安全嗎? – Rob

+1

@Rob它是衆所周知的如何平凡地扭轉它,並已超過十年; 「HawkEye」至少可以在2006年完成:https://corneliutusnea.wordpress.com/2006/10/25/hawkeye-i-can-see-your-securestrings/ - 最終,因爲對象必須揭露回收底層數據的方便方法,任何惡意代碼都可以利用該漏洞 –

+1

@Rob:從[MSDN](https://msdn.microsoft.com/en-us/library/system.security.securestring( v = vs.110).aspx#HowSecure):「總體而言,SecureString比String更安全,因爲它限制了敏感字符串數據的暴​​露。但是,這些字符串仍可能暴露給任何可訪問原始內存的進程或操作,例如在主機上運行的惡意進程,進程轉儲或用戶可查看的交換文件,而不是使用SecureString來保護密碼,推薦的替代方法是對存儲在進程之外的憑證使用不透明的句柄「。 – Brian