Currently, the capability check is done on the current process which may have the CAP_NET_RAW capability, but such process may not have opened the file. A file may could have been opened by a lesser privilege process that does not possess the CAP_NET_RAW capability. To avoid such situations, perform the capability checks against the file's credentials. This approach ensures that the capabilities of the process that opened the file are enforced. Fixes: c938a616aadb ("IB/core: Add raw packet QP type") Signed-off-by: Parav Pandit <parav@xxxxxxxxxx> Suggested-by: Eric W. Biederman <ebiederm@xxxxxxxxxxxx> --- Eric, Shouldn't we check the capabilities of the process that opened the file and also the current process that is issuing the create_flow() ioctl? This way, the minimum capabilities of both processes are considered. --- drivers/infiniband/core/uverbs_cmd.c | 2 +- drivers/infiniband/core/uverbs_main.c | 2 +- include/rdma/uverbs_types.h | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c index 96d639e1ffa0..e028454bcd7e 100644 --- a/drivers/infiniband/core/uverbs_cmd.c +++ b/drivers/infiniband/core/uverbs_cmd.c @@ -3217,7 +3217,7 @@ static int ib_uverbs_ex_create_flow(struct uverbs_attr_bundle *attrs) if (cmd.comp_mask) return -EINVAL; - if (!capable(CAP_NET_RAW)) + if (!file_ns_capable(attrs->ufile->filp, &init_user_ns, CAP_NET_RAW)) return -EPERM; if (cmd.flow_attr.flags >= IB_FLOW_ATTR_FLAGS_RESERVED) diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c index 973fe2c7ef53..8e5ee702e9f8 100644 --- a/drivers/infiniband/core/uverbs_main.c +++ b/drivers/infiniband/core/uverbs_main.c @@ -993,7 +993,7 @@ static int ib_uverbs_open(struct inode *inode, struct file *filp) srcu_read_unlock(&dev->disassociate_srcu, srcu_key); setup_ufile_idr_uobject(file); - + file->filp = filp; return stream_open(inode, filp); err_module: diff --git a/include/rdma/uverbs_types.h b/include/rdma/uverbs_types.h index 26ba919ac245..06f57d28d349 100644 --- a/include/rdma/uverbs_types.h +++ b/include/rdma/uverbs_types.h @@ -181,6 +181,7 @@ struct ib_uverbs_file { struct xarray idr; struct mutex disassociation_lock; + struct file *filp; }; extern const struct uverbs_obj_type_class uverbs_idr_class; -- 2.26.2