我有两个通过共享内存进行通信的进程。一个是特权和信任,另一个是LXC流程,不受信任。
受信任进程在LXC进程可以访问的目录中创建文件。它使用ftrucnate将其设置为固定大小。
现在它与不受信任的进程共享该文件,它们都将其映射为read + write。
我希望不受信任的进程能够读取和写入映射,这是安全的,因为受信任的进程不会对已编写的内容做出任何假设并仔细验证它。
但是,使用写访问权限时,不受信任的进程可以将文件设置为零(由于安装限制,它不能增加它的大小),这会导致特权进程中的SIGBUS(我确认了这一点。)
由于有许多不受信任的进程与受信任的进程通信,这基本上是对整个系统的拒绝服务攻击,并且Linux允许它。有什么方法可以阻止这种情况吗?
我可以拒绝访问ftruncate,但可能还有其他系统调用来执行相同的操作。当然有一种方法可以允许进程写入文件但不调整大小或重命名或进行任何其他元数据更改?
我能想到的最好的是回溯到古老的System V共享内存,因为在Linux上根本无法调整大小(甚至不是通过原始进程。)
答案 0 :(得分:1)
从Linux 3.17版开始,您可以使用文件封条来实现此目的。它们仅在tmpfs上受支持,因此可以使用POSIX共享内存和使用memfd_create()
创建的共享文件。在将文件描述符传递给不受信任的进程调用fcntl(fd, F_ADD_SEALS, F_SEAL_SHRINK)
之前,您的受信任进程对SIGBUS是安全的。
有关详细信息,请参阅memfd_create()
和fcntl()
的手册页。