我有两个通过共享内存进行通信的进程。一个是特权和受信任的,另一个是LXC进程和不受信任的。
可信进程在LXC进程可以访问的目录中创建一个文件。它使用ftrucnate将其设置为固定大小。
现在,它通过将该文件映射为read+write,与不受信任的进程共享该文件。
我希望不受信任的进程能够读取和写入映射,这是安全的,因为受信任的进程不会对已写入的内容进行任何假设,并会仔细地对其进行验证。
但是,使用写访问,不受信任的进程可以将文件截断为零(由于挂载限制,它不能增加文件的大小),这会在特权进程中导致SIGBUS (我确认了这一点)。
由于有许多不受信任的进程与受信任的进程通信,这基本上是对整个系统的拒绝服务攻击,Linux允许这种攻击。有什么方法可以防止这种情况发生吗?
我可以拒绝对ftruncate的访问,但可能还有其他系统调用来做同样的事情。当然有一种方法可以允许进程写入文件,但不能调整它的大小或重命名它或进行任何其他元数据更改?
我能想到的最好的办法就是退回到古老的System V共享内存,因为它在Linux上根本不能调整大小(甚至不能由专用进程调整)。
发布于 2015-11-29 04:33:52
从Linux版本3.17开始,您可以使用文件密封来实现此目的。它们只在tmpfs上受支持,因此将用于POSIX共享内存和使用memfd_create()
创建的共享文件。在将文件描述符传递给不受信任的进程之前,调用fcntl(fd, F_ADD_SEALS, F_SEAL_SHRINK)
,您的受信任进程就不会受到SIGBUS的威胁。
有关详细信息,请参阅memfd_create()
和fcntl()
手册页。
https://stackoverflow.com/questions/21513886
复制相似问题