如果仅将数据视为字节,Rust的memmap是否可以安全使用?

问题描述

Rust的memmap crate具有unsafe方法。

我可以理解返回的地址空间如何不安全地传递给可能验证其内容然后继续使用的构造函数。

我正在编写一个Binary-diff工具,该工具仅将返回的地址空间视为包含(任意值)字节的地址,并且不对地址空间的内容进行验证。

在这种情况下,我可以避免传播unsafe吗?

解决方法

memmap没有记录其安全合同是可耻的。确实在这一点上有an open issue from 2017

我跟随this discussion in the RustSec/advisory-db repo re the crate's apparent abandonmentthis safety documentation in the forked mapr crate,其中指出:

所有文件支持的内存映射构造函数都标记为unsafe,因为如果随后对基础文件进行了修改,进程内或进程外,则使用该映射可能会产生未定义行为(UB) 。应用程序在使用文件支持的映射时必须考虑到风险并采取适当的预防措施。存在诸如文件许可权,锁或进程专用(例如,未链接)文件之类的解决方案,但是这些解决方案是特定于平台的并且受限制。

此安全问题显然也应该与memmap有关。

,

正确使用unsafe的主要原则之一是,您有责任确保所有受影响的代码(包括其周围的 safe 代码)的健全性。

如果要在库箱中公开此功能,则应将其标记为unsafe;您图书馆的用户需要了解UB的来源并就安全性做出自己的决定。

在应用程序条板箱中,您可以控制所有代码,并且您无需将字节解引用。如果这样做,将unsafe代码限制在您直接与包含安全功能的内存映射进行交互的位置是完全可以接受的。实际上,将一切包装在unsafe中会适得其反,因为尚不清楚危险所在。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...