Linux:如何防止文件支持的内存映射导致访问错误(SIGBUS等)?

时间:2018-07-20 21:28:34

标签: linux mmap

我想为内存映射文件io写一个包装器,该包装器要么无法映射文件,要么返回有效的映射,直到未映射它为止。例如,使用普通mmap时,如果基础文件在映射时被截断或删除,则会出现问题。根据mmap的linux手册页,如果在截断后访问了文件新端之后的内存,则会收到SIGBUS。捕获该信号并以这种方式处理错误是没有选择的。

我的想法是创建文件的副本并映射该副本。在具备牛功能的文件系统上,这几乎不会增加开销。

但是问题是:如何保护副本免受其他进程的操纵?临时文件不是真正的选择,因为从理论上讲,恶意进程仍可能对其进行突变。我知道Linux上有文件锁,但据我了解,它们是可选的,或者不会阻止其他人删除文件。

我正在寻求两种答案:一种以坚如磐石的方式映射文件的方法,或者是一种保护tempfile不受其他进程完全破坏的机制。但是也许我解决问题的整个方法是错误的,所以请随时提出根本性的解决方案;)

1 个答案:

答案 0 :(得分:1)

您不能阻止熟练且有决心的用户故意用脚射击自己。请采取合理的预防措施,以免发生意外。

  • 大多数程序都假定输入文件不会更改,这通常没问题
  • 想要处理与合作程序共享的文件的程序使用文件锁定
  • 想要私有文件的程序将创建一个临时文件,快照或其他文件-如果它们取消链接以进行自动清理,则也无法通过fs对其进行访问
  • 想要保护其数据不受所有常规用户操作影响的程序将作为专用系统帐户运行,在这种情况下,chmod足够保护。

有权访问同一帐户(或root)的任何人都可以通过简单的kill -BUS,chmod / truncate或任何更高级的步枪(例如复制和修补二进制文件,克隆其FD)来干扰程序。 ,或附加调试器。如果那是他们想要的,那不是您阻止他们的地方。