Message ID | 20230818144838.1758-1-shiraz.saleem@intel.com (mailing list archive) |
---|---|
State | Accepted |
Commit | bb6d73d9add68ad270888db327514384dfa44958 |
Headers | show |
Series | [for-rc] RDMA/irdma: Prevent zero-length STAG registration | expand |
On Fri, Aug 18, 2023 at 09:48:38AM -0500, Shiraz Saleem wrote: > From: Christopher Bednarz <christopher.n.bednarz@intel.com> > > Currently irdma allows zero-length STAGs to be programmed in HW during > the kernel mode fast register flow. Zero-length MR or STAG registration > disable HW memory length checks. > > Improve gaps in bounds checking in irdma by preventing zero-length STAG or > MR registrations except if the IB_PD_UNSAFE_GLOBAL_RKEY is set. > > This addresses the disclosure CVE-2023-25775. > > Fixes: b48c24c2d710 ("RDMA/irdma: Implement device supported verb APIs") > Signed-off-by: Christopher Bednarz <christopher.n.bednarz@intel.com> > Signed-off-by: Shiraz Saleem <shiraz.saleem@intel.com> > --- > drivers/infiniband/hw/irdma/ctrl.c | 6 ++++++ > drivers/infiniband/hw/irdma/type.h | 2 ++ > drivers/infiniband/hw/irdma/verbs.c | 10 ++++++++-- > 3 files changed, 16 insertions(+), 2 deletions(-) I applied it to rdma-next because we are in -rc6 now and anyway this patch will land Linus very soon. Thanks
On Fri, 18 Aug 2023 09:48:38 -0500, Shiraz Saleem wrote: > Currently irdma allows zero-length STAGs to be programmed in HW during > the kernel mode fast register flow. Zero-length MR or STAG registration > disable HW memory length checks. > > Improve gaps in bounds checking in irdma by preventing zero-length STAG or > MR registrations except if the IB_PD_UNSAFE_GLOBAL_RKEY is set. > > [...] Applied, thanks! [1/1] RDMA/irdma: Prevent zero-length STAG registration https://git.kernel.org/rdma/rdma/c/bb6d73d9add68a Best regards,
On 2023/8/18 22:48, Shiraz Saleem wrote: > From: Christopher Bednarz <christopher.n.bednarz@intel.com> > > Currently irdma allows zero-length STAGs to be programmed in HW during > the kernel mode fast register flow. Zero-length MR or STAG registration > disable HW memory length checks. > > Improve gaps in bounds checking in irdma by preventing zero-length STAG or > MR registrations except if the IB_PD_UNSAFE_GLOBAL_RKEY is set. > > This addresses the disclosure CVE-2023-25775. > > Fixes: b48c24c2d710 ("RDMA/irdma: Implement device supported verb APIs") Hello,I would like to consult the CVE. The driver corresponding to the kernel of an earlier version (< 5.14) is i40iw and has similar code logic. Is this CVE also involved? > Signed-off-by: Christopher Bednarz <christopher.n.bednarz@intel.com> > Signed-off-by: Shiraz Saleem <shiraz.saleem@intel.com> > --- > drivers/infiniband/hw/irdma/ctrl.c | 6 ++++++ > drivers/infiniband/hw/irdma/type.h | 2 ++ > drivers/infiniband/hw/irdma/verbs.c | 10 ++++++++-- > 3 files changed, 16 insertions(+), 2 deletions(-) > [...]
> Subject: Re: [PATCH for-rc] RDMA/irdma: Prevent zero-length STAG registration > > > > On 2023/8/18 22:48, Shiraz Saleem wrote: > > From: Christopher Bednarz <christopher.n.bednarz@intel.com> > > > > Currently irdma allows zero-length STAGs to be programmed in HW during > > the kernel mode fast register flow. Zero-length MR or STAG > > registration disable HW memory length checks. > > > > Improve gaps in bounds checking in irdma by preventing zero-length > > STAG or MR registrations except if the IB_PD_UNSAFE_GLOBAL_RKEY is > set. > > > > This addresses the disclosure CVE-2023-25775. > > > > Fixes: b48c24c2d710 ("RDMA/irdma: Implement device supported verb > > APIs") > > Hello,I would like to consult the CVE. The driver corresponding to the kernel of > an earlier version (< 5.14) is i40iw and has similar code logic. Is this CVE also > involved? > Yes. It’s a problem in i40iw too. Shiraz
diff --git a/drivers/infiniband/hw/irdma/ctrl.c b/drivers/infiniband/hw/irdma/ctrl.c index d88c9184007e..2bc340deb6bb 100644 --- a/drivers/infiniband/hw/irdma/ctrl.c +++ b/drivers/infiniband/hw/irdma/ctrl.c @@ -1061,6 +1061,9 @@ static int irdma_sc_alloc_stag(struct irdma_sc_dev *dev, u64 hdr; enum irdma_page_size page_size; + if (!info->total_len && !info->all_memory) + return -EINVAL; + if (info->page_size == 0x40000000) page_size = IRDMA_PAGE_SIZE_1G; else if (info->page_size == 0x200000) @@ -1126,6 +1129,9 @@ static int irdma_sc_mr_reg_non_shared(struct irdma_sc_dev *dev, u8 addr_type; enum irdma_page_size page_size; + if (!info->total_len && !info->all_memory) + return -EINVAL; + if (info->page_size == 0x40000000) page_size = IRDMA_PAGE_SIZE_1G; else if (info->page_size == 0x200000) diff --git a/drivers/infiniband/hw/irdma/type.h b/drivers/infiniband/hw/irdma/type.h index 5ee68604e59f..16ada4c2ced0 100644 --- a/drivers/infiniband/hw/irdma/type.h +++ b/drivers/infiniband/hw/irdma/type.h @@ -969,6 +969,7 @@ struct irdma_allocate_stag_info { bool remote_access:1; bool use_hmc_fcn_index:1; bool use_pf_rid:1; + bool all_memory:1; u8 hmc_fcn_index; }; @@ -996,6 +997,7 @@ struct irdma_reg_ns_stag_info { bool use_hmc_fcn_index:1; u8 hmc_fcn_index; bool use_pf_rid:1; + bool all_memory:1; }; struct irdma_fast_reg_stag_info { diff --git a/drivers/infiniband/hw/irdma/verbs.c b/drivers/infiniband/hw/irdma/verbs.c index a7b82aea4d08..4110cc159bd9 100644 --- a/drivers/infiniband/hw/irdma/verbs.c +++ b/drivers/infiniband/hw/irdma/verbs.c @@ -2576,7 +2576,8 @@ static int irdma_hw_alloc_stag(struct irdma_device *iwdev, struct irdma_mr *iwmr) { struct irdma_allocate_stag_info *info; - struct irdma_pd *iwpd = to_iwpd(iwmr->ibmr.pd); + struct ib_pd *pd = iwmr->ibmr.pd; + struct irdma_pd *iwpd = to_iwpd(pd); int status; struct irdma_cqp_request *cqp_request; struct cqp_cmds_info *cqp_info; @@ -2592,6 +2593,7 @@ static int irdma_hw_alloc_stag(struct irdma_device *iwdev, info->stag_idx = iwmr->stag >> IRDMA_CQPSQ_STAG_IDX_S; info->pd_id = iwpd->sc_pd.pd_id; info->total_len = iwmr->len; + info->all_memory = pd->flags & IB_PD_UNSAFE_GLOBAL_RKEY; info->remote_access = true; cqp_info->cqp_cmd = IRDMA_OP_ALLOC_STAG; cqp_info->post_sq = 1; @@ -2639,6 +2641,8 @@ static struct ib_mr *irdma_alloc_mr(struct ib_pd *pd, enum ib_mr_type mr_type, iwmr->type = IRDMA_MEMREG_TYPE_MEM; palloc = &iwpbl->pble_alloc; iwmr->page_cnt = max_num_sg; + /* Use system PAGE_SIZE as the sg page sizes are unknown at this point */ + iwmr->len = max_num_sg * PAGE_SIZE; err_code = irdma_get_pble(iwdev->rf->pble_rsrc, palloc, iwmr->page_cnt, false); if (err_code) @@ -2718,7 +2722,8 @@ static int irdma_hwreg_mr(struct irdma_device *iwdev, struct irdma_mr *iwmr, { struct irdma_pbl *iwpbl = &iwmr->iwpbl; struct irdma_reg_ns_stag_info *stag_info; - struct irdma_pd *iwpd = to_iwpd(iwmr->ibmr.pd); + struct ib_pd *pd = iwmr->ibmr.pd; + struct irdma_pd *iwpd = to_iwpd(pd); struct irdma_pble_alloc *palloc = &iwpbl->pble_alloc; struct irdma_cqp_request *cqp_request; struct cqp_cmds_info *cqp_info; @@ -2737,6 +2742,7 @@ static int irdma_hwreg_mr(struct irdma_device *iwdev, struct irdma_mr *iwmr, stag_info->total_len = iwmr->len; stag_info->access_rights = irdma_get_mr_access(access); stag_info->pd_id = iwpd->sc_pd.pd_id; + stag_info->all_memory = pd->flags & IB_PD_UNSAFE_GLOBAL_RKEY; if (stag_info->access_rights & IRDMA_ACCESS_FLAGS_ZERO_BASED) stag_info->addr_type = IRDMA_ADDR_TYPE_ZERO_BASED; else