提交 d81a12bc 编写于 作者: D Dan Rosenberg 提交者: Takashi Iwai

sound: Prevent buffer overflow in OSS load_mixer_volumes

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: NDan Rosenberg <drosenberg@vsecurity.com>
Cc: stable <stable@kernel.org>
Signed-off-by: NTakashi Iwai <tiwai@suse.de>
上级 76934575
...@@ -87,7 +87,7 @@ int *load_mixer_volumes(char *name, int *levels, int present) ...@@ -87,7 +87,7 @@ int *load_mixer_volumes(char *name, int *levels, int present)
int i, n; int i, n;
for (i = 0; i < num_mixer_volumes; i++) { 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) if (present)
mixer_vols[i].num = i; mixer_vols[i].num = i;
return mixer_vols[i].levels; return mixer_vols[i].levels;
...@@ -99,7 +99,7 @@ int *load_mixer_volumes(char *name, int *levels, int present) ...@@ -99,7 +99,7 @@ int *load_mixer_volumes(char *name, int *levels, int present)
} }
n = num_mixer_volumes++; n = num_mixer_volumes++;
strcpy(mixer_vols[n].name, name); strncpy(mixer_vols[n].name, name, 32);
if (present) if (present)
mixer_vols[n].num = n; mixer_vols[n].num = n;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册