如何从进程内存中删除字符串?
Posted
技术标签:
【中文标题】如何从进程内存中删除字符串?【英文标题】:How to remove string from process memory? 【发布时间】:2017-10-30 11:42:35 【问题描述】:我有一个应用程序,它从 Windows 窗体文本框中获取一个字符串并将其传递给一个使用字符串作为参数的 API。我看到任务完成后,仍然可以从进程内存中查询到字符串。我遇到了使用SecureString
进行字符串内存管理功能的建议。但是,如果我理解正确,如果安全字符串是从字符串构建的,或者安全字符串的值最终存储在字符串中,那么字符串的目的就会失败。
请提出最佳解决方案。
【问题讨论】:
是否在线加密?如果没有,你为什么还要在内存中关注它? 任何参数都传递给执行堆栈上的方法。当方法完成时,执行堆栈点恢复到调用方法之前的位置。所以方法使用的任何变量仍然在堆栈上并且不可访问。调用方法必须在返回从堆栈中删除对象之前销毁变量。 如果它来自 WinFormsTextBox
控件,则该字符串的副本数量已经未知/不可知,到处都潜伏着。您无法修复此泄漏。要么重新设计它以在整个过程中使用SecureString
,要么接受对运行此代码的机器有足够访问权限的人可能从进程内存中读取此数据。但请记住 - 具有该级别访问权限的人无论如何都可以轻松安装键盘记录器。
【参考方案1】:
SecureString
不被认为是安全的。如果您需要这样做,您可以使用char[]
并在完成后覆盖数据,或者您可以使用unsafe
代码在完成后覆盖string
(只需...希望它不是实习生或共享参考);请注意,这适用于调用堆栈中的任何地方。请注意,操作系统可能出于各种原因复制了该页面,如果内存没有非常仔细分配,它甚至可能位于磁盘(交换文件)上。
但是,当内存分析工具成为 winforms 应用程序中的一个因素时,使用键盘记录器会更容易,或者只是拿扳手威胁某人输入密码:
【讨论】:
出于好奇,您能否详细说明它不被认为是安全的? @Rob 众所周知,如何简单地扭转它已经有十多年了; “HawkEye”至少早在 2006 年就可以做到这一点:corneliutusnea.wordpress.com/2006/10/25/… - 最终,由于对象必须公开一种取回底层数据的便捷方法,任何恶意代码都可以利用它 @Rob:来自MSDN:“总的来说,SecureString 比 String 更安全,因为它限制了敏感字符串数据的暴露。但是,这些字符串仍然可能暴露给任何进程或操作可以访问原始内存,例如在主机计算机上运行的恶意进程、进程转储或用户可查看的交换文件。建议的替代方法是使用不透明句柄来处理凭据,而不是使用 SecureString 来保护密码存储在进程之外。”以上是关于如何从进程内存中删除字符串?的主要内容,如果未能解决你的问题,请参考以下文章