lkml.org 
[lkml]   [2018]   [May]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 225/496] fbdev: Fixing arbitrary kernel leak in case FBIOGETCMAP_SPARC in sbusfb_ioctl_helper().
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Peter Malone <peter.malone@gmail.com>

    [ Upstream commit 250c6c49e3b68756b14983c076183568636e2bde ]

    Fixing arbitrary kernel leak in case FBIOGETCMAP_SPARC in
    sbusfb_ioctl_helper().

    'index' is defined as an int in sbusfb_ioctl_helper().
    We retrieve this from the user:
    if (get_user(index, &c->index) ||
    __get_user(count, &c->count) ||
    __get_user(ured, &c->red) ||
    __get_user(ugreen, &c->green) ||
    __get_user(ublue, &c->blue))
    return -EFAULT;

    and then we use 'index' in the following way:
    red = cmap->red[index + i] >> 8;
    green = cmap->green[index + i] >> 8;
    blue = cmap->blue[index + i] >> 8;

    This is a classic information leak vulnerability. 'index' should be
    an unsigned int, given its usage above.

    This patch is straight-forward; it changes 'index' to unsigned int
    in two switch-cases: FBIOGETCMAP_SPARC && FBIOPUTCMAP_SPARC.

    This patch fixes CVE-2018-6412.

    Signed-off-by: Peter Malone <peter.malone@gmail.com>
    Acked-by: Mathieu Malaterre <malat@debian.org>
    Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/video/fbdev/sbuslib.c | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    --- a/drivers/video/fbdev/sbuslib.c
    +++ b/drivers/video/fbdev/sbuslib.c
    @@ -122,7 +122,7 @@ int sbusfb_ioctl_helper(unsigned long cm
    unsigned char __user *ured;
    unsigned char __user *ugreen;
    unsigned char __user *ublue;
    - int index, count, i;
    + unsigned int index, count, i;

    if (get_user(index, &c->index) ||
    __get_user(count, &c->count) ||
    @@ -161,7 +161,7 @@ int sbusfb_ioctl_helper(unsigned long cm
    unsigned char __user *ugreen;
    unsigned char __user *ublue;
    struct fb_cmap *cmap = &info->cmap;
    - int index, count, i;
    + unsigned int index, count, i;
    u8 red, green, blue;

    if (get_user(index, &c->index) ||

    \
     
     \ /
      Last update: 2018-05-28 15:12    [W:4.218 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site