On Tue, Mar 18, 2025 at 03:00:15PM -0500, Eric W. Biederman wrote: > There are also a lot of places where inifinband uses raw read/write on > file descriptors. I think last time I looked infiniband wasn't even using > ioctl. Yeah, that's all deprecated now, and it had some major security issue with the 'setuid cat' attack. IIRC it was mitigated by disallowing read/write from a process with different credentials than the process that opened the FD. This caused regressions which were resolved by moving to ioctl. Today you can compile the read/write interface out of the kernel - for the last uh 6 years or so the userspace has exclusively used ioctl. > > You would not say that if process B creates a CAP_NET_RAW socket FD > > and passes it to process A without CAP_NET_RAW then A should not be > > able to use the FD. > > But that is exactly what the infiniband security check were are talking > about appears to be doing. It is using the credentials of process A > and failing after it was passed by process B. I'm not sure what you are refering too? The model should be that the process invoking the system call is the one that provides the capability set. It is entirely possible that the code is wrong, but the above was the intention. > Taking from your example above. If process B with CAP_NET_RAW creates a > FD for opening queue pairs and passes it to process A without > CAP_NET_RAW then A is not able to create queue pairs. Yes that's right, because the FD itself has no security properties at all, it is just a conduit for calling into the kernel. Process A cannot create raw queue pairs in the same way that Process A cannot create raw sockets, it doesn't matter what where the FD came from. > That is what the code in > drivers/infiniband/core/ubvers_cmd.c:create_qp() currenty says. I'm not sure what you are referring to here? That function is called on the system call path, and at least the intention was that this: case IB_QPT_RAW_PACKET: if (!capable(CAP_NET_RAW)) return -EPERM; break; Would check the current task invoking the system call to see if that task has the required capability. Jason