如何从进程内存中删除字符串?
我有一个应用程序,它从Windows窗体文本框中获取一个字符串,并将其传递给使用字符串作为参数的API。我发现任务完成后仍然可以从进程内存查询该字符串。我遇到过使用SecureString
作为字符串内存管理功能的建议。但是,如果我理解正确,如果安全字符串是从字符串构建的,或者安全字符串的值最终存储在字符串中,则字符串的目的会被破坏。如何从进程内存中删除字符串?
请建议什么是最好的解决方案。
SecureString
不被视为安全。如果你需要来做到这一点,你可以使用char[]
并覆盖完成后的数据,或者你可以使用unsafe
代码覆盖string
完成后(只是......希望它没有被执行或共享引用) ;注意这适用于无处不在调用堆栈中的。请注意,操作系统可能因各种原因复制了页面,并且如果内存不是,那么可能会在磁盘(交换文件)中仔细分配。
然而,上述时间存储分析工具在WinForms应用程序的一个因素,它会更容易使用键盘记录,或只采取扳手和密码的威胁他人:
出于好奇,你能详细说明它不被视为安全吗? – Rob
@Rob它是众所周知的如何平凡地扭转它,并已超过十年; “HawkEye”至少可以在2006年完成:https://corneliutusnea.wordpress.com/2006/10/25/hawkeye-i-can-see-your-securestrings/ - 最终,因为对象必须揭露回收底层数据的方便方法,任何恶意代码都可以利用该漏洞 –
@Rob:从[MSDN](https://msdn.microsoft.com/en-us/library/system.security.securestring( v = vs.110).aspx#HowSecure):“总体而言,SecureString比String更安全,因为它限制了敏感字符串数据的暴露。但是,这些字符串仍可能暴露给任何可访问原始内存的进程或操作,例如在主机上运行的恶意进程,进程转储或用户可查看的交换文件,而不是使用SecureString来保护密码,推荐的替代方法是对存储在进程之外的凭证使用不透明的句柄“。 – Brian
它是否在电线上加密?如果没有,为什么你甚至在记忆中关注它? –
任何参数传递给执行堆栈上的方法。方法完成后,执行堆栈点将恢复到调用方法之前的位置。所以方法使用的任何变量仍然在堆栈上,不可访问。调用方法必须在返回从堆栈中删除对象之前销毁该变量。 – jdweng
如果它来自WinForms'TextBox'控件,那么已经有一个未知/不可知数量的字符串拷贝到处。你无法修复这个漏洞。要么重新设计这个以在整个过程中使用'SecureString',要么接受有足够权限访问运行该代码的计算机的人员*可能*从存储器中读取这些数据。但请记住 - 具有该访问级别的人无论如何都可以轻松安装键盘记录程序。 –