Patchwork [CVE-2010-4527,Dapper] sound: Prevent buffer overflow in OSS load_mixer_volumes, CVE-2010-4527

login
register
mail settings
Submitter Leann Ogasawara
Date March 17, 2011, 9:59 p.m.
Message ID <1300399147.1813.19.camel@emiko>
Download mbox | patch
Permalink /patch/87439/
State New
Headers show

Pull-request

git://kernel.ubuntu.com/ogasawara/ubuntu-dapper.git CVE-2010-4527

Comments

Leann Ogasawara - March 17, 2011, 9:59 p.m.
The following changes since commit 2ce9a046a401ab70b7719085dd1b51e2f4a56a42:
  Brad Figg (1):
        UBUNTU: Ubuntu-2.6.15-57.95

are available in the git repository at:

  git://kernel.ubuntu.com/ogasawara/ubuntu-dapper.git CVE-2010-4527

Dan Rosenberg (1):
      sound: Prevent buffer overflow in OSS load_mixer_volumes, CVE-2010-4527

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

From 9a0b6c4bd252c7888731071956e5ec904a6fa82c Mon Sep 17 00:00:00 2001
From: Dan Rosenberg <drosenberg@vsecurity.com>
Date: Sat, 25 Dec 2010 16:23:40 -0500
Subject: [PATCH] sound: Prevent buffer overflow in OSS load_mixer_volumes, CVE-2010-4527

CVE-2010-4527

BugLink: http://bugs.launchpad.net/bugs/737073

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>
Cc: stable <stable@kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
(cherry picked from commit d81a12bc29ae4038770e05dce4ab7f26fd5880fb)

Signed-off-by: Leann Ogasawara <leann.ogasawara@canonical.com>
---
 sound/oss/soundcard.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
Tim Gardner - March 18, 2011, 1:31 a.m.
On 03/17/2011 03:59 PM, Leann Ogasawara wrote:
> The following changes since commit 2ce9a046a401ab70b7719085dd1b51e2f4a56a42:
>    Brad Figg (1):
>          UBUNTU: Ubuntu-2.6.15-57.95
>
> are available in the git repository at:
>
>    git://kernel.ubuntu.com/ogasawara/ubuntu-dapper.git CVE-2010-4527
>
> Dan Rosenberg (1):
>        sound: Prevent buffer overflow in OSS load_mixer_volumes, CVE-2010-4527
>
>   sound/oss/soundcard.c |    4 ++--
>   1 files changed, 2 insertions(+), 2 deletions(-)
>
>  From 9a0b6c4bd252c7888731071956e5ec904a6fa82c Mon Sep 17 00:00:00 2001
> From: Dan Rosenberg<drosenberg@vsecurity.com>
> Date: Sat, 25 Dec 2010 16:23:40 -0500
> Subject: [PATCH] sound: Prevent buffer overflow in OSS load_mixer_volumes, CVE-2010-4527
>
> CVE-2010-4527
>
> BugLink: http://bugs.launchpad.net/bugs/737073
>
> 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>
> Cc: stable<stable@kernel.org>
> Signed-off-by: Takashi Iwai<tiwai@suse.de>
> (cherry picked from commit d81a12bc29ae4038770e05dce4ab7f26fd5880fb)
>
> Signed-off-by: Leann Ogasawara<leann.ogasawara@canonical.com>
> ---
>   sound/oss/soundcard.c |    4 ++--
>   1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/sound/oss/soundcard.c b/sound/oss/soundcard.c
> index d33bb46..4f12363 100644
> --- a/sound/oss/soundcard.c
> +++ b/sound/oss/soundcard.c
> @@ -86,7 +86,7 @@ int *load_mixer_volumes(char *name, int *levels, int present)
>   	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 *levels, int present)
>   	}
>   	n = num_mixer_volumes++;
>
> -	strcpy(mixer_vols[n].name, name);
> +	strncpy(mixer_vols[n].name, name, 32);
>
>   	if (present)
>   		mixer_vols[n].num = n;

Acked-by: Tim Gardner <tim.gardner@canonical.com>
Brad Figg - April 25, 2011, 4:24 p.m.
On 03/17/2011 02:59 PM, Leann Ogasawara wrote:
> The following changes since commit 2ce9a046a401ab70b7719085dd1b51e2f4a56a42:
>    Brad Figg (1):
>          UBUNTU: Ubuntu-2.6.15-57.95
>
> are available in the git repository at:
>
>    git://kernel.ubuntu.com/ogasawara/ubuntu-dapper.git CVE-2010-4527
>
> Dan Rosenberg (1):
>        sound: Prevent buffer overflow in OSS load_mixer_volumes, CVE-2010-4527
>
>   sound/oss/soundcard.c |    4 ++--
>   1 files changed, 2 insertions(+), 2 deletions(-)
>
>  From 9a0b6c4bd252c7888731071956e5ec904a6fa82c Mon Sep 17 00:00:00 2001
> From: Dan Rosenberg<drosenberg@vsecurity.com>
> Date: Sat, 25 Dec 2010 16:23:40 -0500
> Subject: [PATCH] sound: Prevent buffer overflow in OSS load_mixer_volumes, CVE-2010-4527
>
> CVE-2010-4527
>
> BugLink: http://bugs.launchpad.net/bugs/737073
>
> 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>
> Cc: stable<stable@kernel.org>
> Signed-off-by: Takashi Iwai<tiwai@suse.de>
> (cherry picked from commit d81a12bc29ae4038770e05dce4ab7f26fd5880fb)
>
> Signed-off-by: Leann Ogasawara<leann.ogasawara@canonical.com>
> ---
>   sound/oss/soundcard.c |    4 ++--
>   1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/sound/oss/soundcard.c b/sound/oss/soundcard.c
> index d33bb46..4f12363 100644
> --- a/sound/oss/soundcard.c
> +++ b/sound/oss/soundcard.c
> @@ -86,7 +86,7 @@ int *load_mixer_volumes(char *name, int *levels, int present)
>   	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 *levels, int present)
>   	}
>   	n = num_mixer_volumes++;
>
> -	strcpy(mixer_vols[n].name, name);
> +	strncpy(mixer_vols[n].name, name, 32);
>
>   	if (present)
>   		mixer_vols[n].num = n;

Acked-by: Brad Figg <brad.figg@canonical.com>

Patch

diff --git a/sound/oss/soundcard.c b/sound/oss/soundcard.c
index d33bb46..4f12363 100644
--- a/sound/oss/soundcard.c
+++ b/sound/oss/soundcard.c
@@ -86,7 +86,7 @@  int *load_mixer_volumes(char *name, int *levels, int present)
 	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 *levels, int present)
 	}
 	n = num_mixer_volumes++;
 
-	strcpy(mixer_vols[n].name, name);
+	strncpy(mixer_vols[n].name, name, 32);
 
 	if (present)
 		mixer_vols[n].num = n;