diff options
author | Jason Gunthorpe <jgunthorpe@obsidianresearch.com> | 2016-04-10 19:13:13 -0600 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2016-04-28 12:03:16 -0400 |
commit | e6bd18f57aad1a2d1ef40e646d03ed0f2515c9e3 (patch) | |
tree | 62a0a5f3cf239387c095c8b99c67d2bcf9448071 /drivers/infiniband/core/ucma.c | |
parent | 7723d8c2445c4dfa91f8df42703b56f8ade59af7 (diff) | |
download | talos-obmc-linux-e6bd18f57aad1a2d1ef40e646d03ed0f2515c9e3.tar.gz talos-obmc-linux-e6bd18f57aad1a2d1ef40e646d03ed0f2515c9e3.zip |
IB/security: Restrict use of the write() interface
The drivers/infiniband stack uses write() as a replacement for
bi-directional ioctl(). This is not safe. There are ways to
trigger write calls that result in the return structure that
is normally written to user space being shunted off to user
specified kernel memory instead.
For the immediate repair, detect and deny suspicious accesses to
the write API.
For long term, update the user space libraries and the kernel API
to something that doesn't present the same security vulnerabilities
(likely a structured ioctl() interface).
The impacted uAPI interfaces are generally only available if
hardware from drivers/infiniband is installed in the system.
Reported-by: Jann Horn <jann@thejh.net>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
[ Expanded check to all known write() entry points ]
Cc: stable@vger.kernel.org
Signed-off-by: Doug Ledford <dledford@redhat.com>
Diffstat (limited to 'drivers/infiniband/core/ucma.c')
-rw-r--r-- | drivers/infiniband/core/ucma.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c index dd3bcceadfde..c0f3826abb30 100644 --- a/drivers/infiniband/core/ucma.c +++ b/drivers/infiniband/core/ucma.c @@ -1574,6 +1574,9 @@ static ssize_t ucma_write(struct file *filp, const char __user *buf, struct rdma_ucm_cmd_hdr hdr; ssize_t ret; + if (WARN_ON_ONCE(!ib_safe_file_access(filp))) + return -EACCES; + if (len < sizeof(hdr)) return -EINVAL; |