Skip to content
  • Dan Rosenberg's avatar
    [SCSI] pmcraid: reject negative request size · 5f6279da
    Dan Rosenberg authored
    
    
    There's a code path in pmcraid that can be reached via device ioctl that
    causes all sorts of ugliness, including heap corruption or triggering
    the OOM killer due to consecutive allocation of large numbers of pages.
    Not especially relevant from a security perspective, since users must
    have CAP_SYS_ADMIN to open the character device.
    
    First, the user can call pmcraid_chr_ioctl() with a type
    PMCRAID_PASSTHROUGH_IOCTL.  A pmcraid_passthrough_ioctl_buffer
    is copied in, and the request_size variable is set to
    buffer->ioarcb.data_transfer_length, which is an arbitrary 32-bit signed
    value provided by the user.
    
    If a negative value is provided here, bad things can happen.  For
    example, pmcraid_build_passthrough_ioadls() is called with this
    request_size, which immediately calls pmcraid_alloc_sglist() with a
    negative size.  The resulting math on allocating a scatter list can
    result in an overflow in the kzalloc() call (if num_elem is 0, the
    sglist will be smaller than expected), or if num_elem is unexpectedly
    large the subsequent loop will call alloc_pages() repeatedly, a high
    number of pages will be allocated and the OOM killer might be invoked.
    
    Prevent this value from being negative in pmcraid_ioctl_passthrough().
    
    Signed-off-by: default avatarDan Rosenberg <drosenberg@vsecurity.com>
    Cc: stable@kernel.org
    Cc: Anil Ravindranath <anil_ravindranath@pmc-sierra.com>
    Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
    5f6279da