mirror of
https://sourceware.org/git/glibc.git
synced 2025-12-24 17:51:17 +03:00
tunables: Terminate if end of input is reached (CVE-2023-4911)
The string parsing routine may end up writing beyond bounds of tunestr if the input tunable string is malformed, of the form name=name=val. This gets processed twice, first as name=name=val and next as name=val, resulting in tunestr being name=name=val:name=val, thus overflowing tunestr. Terminate the parsing loop at the first instance itself so that tunestr does not overflow. This also fixes up tst-env-setuid-tunables to actually handle failures correct and add new tests to validate the fix for this CVE. Signed-off-by: Siddhesh Poyarekar <siddhesh@sourceware.org> Reviewed-by: Carlos O'Donell <carlos@redhat.com>
This commit is contained in:
@@ -180,11 +180,7 @@ parse_tunables (char *tunestr, char *valstring)
|
||||
/* If we reach the end of the string before getting a valid name-value
|
||||
pair, bail out. */
|
||||
if (p[len] == '\0')
|
||||
{
|
||||
if (__libc_enable_secure)
|
||||
tunestr[off] = '\0';
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
||||
/* We did not find a valid name-value pair before encountering the
|
||||
colon. */
|
||||
@@ -244,9 +240,16 @@ parse_tunables (char *tunestr, char *valstring)
|
||||
}
|
||||
}
|
||||
|
||||
if (p[len] != '\0')
|
||||
p += len + 1;
|
||||
/* We reached the end while processing the tunable string. */
|
||||
if (p[len] == '\0')
|
||||
break;
|
||||
|
||||
p += len + 1;
|
||||
}
|
||||
|
||||
/* Terminate tunestr before we leave. */
|
||||
if (__libc_enable_secure)
|
||||
tunestr[off] = '\0';
|
||||
}
|
||||
|
||||
/* Enable the glibc.malloc.check tunable in SETUID/SETGID programs only when
|
||||
|
||||
Reference in New Issue
Block a user