lkml.org 
[lkml]   [2011]   [Feb]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] [124/139] sound: Prevent buffer overflow in OSS load_mixer_volumes
    Date
    2.6.35-longterm review patch.  If anyone has any objections, please let me know.

    ------------------
    From: Dan Rosenberg <drosenberg@vsecurity.com>

    commit d81a12bc29ae4038770e05dce4ab7f26fd5880fb upstream.

    The load_mixer_volumes() function, which can be triggered by
    unprivileged users via the SOUND_MIXER_SETLEVELS ioctl, is vulnerable to
    a buffer overflow. Because the provided "name" argument isn't
    guaranteed to be NULL terminated at the expected 32 bytes, it's possible
    to overflow past the end of the last element in the mixer_vols array.
    Further exploitation can result in an arbitrary kernel write (via
    subsequent calls to load_mixer_volumes()) leading to privilege
    escalation, or arbitrary kernel reads via get_mixer_levels(). In
    addition, the strcmp() may leak bytes beyond the mixer_vols array.

    Signed-off-by: Dan Rosenberg <drosenberg@vsecurity.com>
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
    Signed-off-by: Andi Kleen <ak@linux.intel.com>

    ---
    sound/oss/soundcard.c | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    Index: linux-2.6.35.y/sound/oss/soundcard.c
    ===================================================================
    --- linux-2.6.35.y.orig/sound/oss/soundcard.c
    +++ linux-2.6.35.y/sound/oss/soundcard.c
    @@ -86,7 +86,7 @@ int *load_mixer_volumes(char *name, int
    int i, n;

    for (i = 0; i < num_mixer_volumes; i++) {
    - if (strcmp(name, mixer_vols[i].name) == 0) {
    + if (strncmp(name, mixer_vols[i].name, 32) == 0) {
    if (present)
    mixer_vols[i].num = i;
    return mixer_vols[i].levels;
    @@ -98,7 +98,7 @@ int *load_mixer_volumes(char *name, int
    }
    n = num_mixer_volumes++;

    - strcpy(mixer_vols[n].name, name);
    + strncpy(mixer_vols[n].name, name, 32);

    if (present)
    mixer_vols[n].num = n;

    \
     
     \ /
      Last update: 2011-02-02 02:15    [W:2.120 / U:0.340 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site