内存泄漏的安全性

问题描述 投票:0回答:1

我最近了解到,如果您执行

Box::leak(Box::new(value))
并收到
&'static
,那么在线程之间传输值就会变得更加容易。我有一个必须可以从不同线程访问的特定值,但是问题是我必须泄漏用户登录凭据,据我所知,如果我这样做,这些凭据将不会从内存中清除应用程序,退出。这让我想知道我是否不应该使用这种方法,或者现代操作系统是否有办法阻止恶意应用程序收集该数据?

security rust
1个回答
3
投票

据我所知,如果我这样做,这些凭据将不会从应用程序的内存中清除,退出

当进程终止时,操作系统将释放该进程分配的所有内存。 这包括所有泄漏的内存。

即使情况并非如此,您所描述的也不是内存安全问题。 “内存安全”意味着非常具体的东西,它本身并不包括防止访问密码等敏感信息。 内存安全意味着以下事情是不可能的:

  • 越界读取或写入。
  • 双免。
  • 释放后使用。

我能想到的对内存安全最简洁的描述是“对值的引用始终指向有效值”(尽管这可能有点过于简单化)。

首先要解决内存泄漏的原因:如果您想做的只是在多个线程之间共享某些内容,请考虑使用

Arc
来代替。 这实现了一个线程安全的引用计数智能指针,当最后一个句柄被删除时,它将释放所持有的分配。 除非你正在做一些非常奇怪的事情或者原子操作的开销导致性能问题,否则你几乎总是可以使用
Arc
而不是泄漏。


顺便说一句,如果您担心密码会保留在磁盘上或程序终止后的某个位置,那么您需要一个“安全字符串”。 安全字符串的实现通常会做两件非常重要的事情:

  1. 锁定支持字符串的内存,使其无法换出到磁盘。这可以防止将密码泄漏到系统的交换空间(尽管如果系统处于休眠状态,这种情况仍然可能发生)。
  2. 在释放字符串之前将其后面的内存清零。 这比在释放字符串之前仅在字符串上写入零字节要复杂得多。 优化器非常积极,并且会执行诸如删除在释放内存之前发生的内存写入之类的操作。 优化器关注的是通过进行程序无法观察到的更改来使程序更快/更小。 由于您的程序永远无法真正观察到内存未归零,因此优化器有权执行此操作。 有关如何正确完成此操作的示例,请参阅 zeroize 箱。
© www.soinside.com 2019 - 2024. All rights reserved.