【发布时间】:2018-07-20 21:28:33
【问题描述】:
我想为内存映射文件 io 编写一个包装器,它要么无法映射文件,要么返回一个在未映射之前有效的映射。例如,使用普通 mmap,如果底层文件在映射时被截断或删除,则会出现问题。根据 mmap 的 linux 手册页,如果在截断后访问超出文件新结尾的内存,则会收到 SIGBUS。无法捕获此信号并以这种方式处理错误。
我的想法是创建文件的副本并映射副本。在具有牛功能的文件系统上,这将产生很少的开销。
但问题是:如何保护副本不被另一个进程操纵?临时文件不是真正的选择,因为理论上恶意进程仍然可以对其进行变异。我知道 Linux 上有文件锁,但据我了解,它们要么是可选的,要么不会阻止其他人删除文件。
我要求两种答案:一种以坚如磐石的方式映射文件的方法,或者一种完全保护临时文件免受其他进程影响的机制。但也许我解决问题的整个方法都是错误的,所以请随意提出激进的解决方案;)
【问题讨论】:
-
不要试图保护自己免受
root或其他具有大于或等于您的权限的用户/进程的侵害。它永远不会起作用。 -
我明白你的意思,root等是无敌的。我想保护自己免受与我的进程具有相同权限的其他进程的影响。我知道从内核方面来看,没有技术上的理由说明这不可能。问题是它是否已实现并可供用户空间使用。
-
Linux 太灵活了。例如,您可以取消链接文件,以便不再通过 fs 访问它,但如果获得特权,进程可以检查您打开的 FD,克隆一个,并开始处理无法访问的文件。您可以将整个文件读入内存,因此您不再依赖它,但是一个进程可以附加并开始弄乱您的内存空间。如果我可以提出一个激进的解决方案,那就是遵循 Unix 的哲学,即如果用户真的、真的想要的话,就可以让他们自己踢自己的脚。如果
chmod 000没有阻止他们,他们就会同意。