【问题标题】:Linux: How to prevent a file backed memory mapping from causing access errors (SIGBUS etc.)?Linux:如何防止文件支持的内存映射导致访问错误(SIGBUS 等)?
【发布时间】:2018-07-20 21:28:33
【问题描述】:

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

我的想法是创建文件的副本并映射副本。在具有牛功能的文件系统上,这将产生很少的开销。

但问题是:如何保护副本不被另一个进程操纵?临时文件不是真正的选择,因为理论上恶意进程仍然可以对其进行变异。我知道 Linux 上有文件锁,但据我了解,它们要么是可选的,要么不会阻止其他人删除文件。

我要求两种答案:一种以坚如磐石的方式映射文件的方法,或者一种完全保护临时文件免受其他进程影响的机制。但也许我解决问题的整个方法都是错误的,所以请随意提出激进的解决方案;)

【问题讨论】:

  • 不要试图保护自己免受root 或其他具有大于或等于您的权限的用户/进程的侵害。它永远不会起作用。
  • 我明白你的意思,root等是无敌的。我想保护自己免受与我的进程具有相同权限的其他进程的影响。我知道从内核方面来看,没有技术上的理由说明这不可能。问题是它是否已实现并可供用户空间使用。
  • Linux 太灵活了。例如,您可以取消链接文件,以便不再通过 fs 访问它,但如果获得特权,进程可以检查您打开的 FD,克隆一个,并开始处理无法访问的文件。您可以将整个文件读入内存,因此您不再依赖它,但是一个进程可以附加并开始弄乱您的内存空间。如果我可以提出一个激进的解决方案,那就是遵循 Unix 的哲学,即如果用户真的、真的想要的话,就可以让他们自己踢自己的脚。如果chmod 000 没有阻止他们,他们就会同意。

标签: linux mmap


【解决方案1】:

您无法阻止熟练且坚定的用户故意朝自己的脚开枪。只需采取合理的预防措施,以免意外发生。

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

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

【讨论】:

    猜你喜欢
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    相关资源
    最近更新 更多