aboutsummaryrefslogtreecommitdiff
path: root/elf/dl-tunables.c
diff options
context:
space:
mode:
authorSiddhesh Poyarekar <siddhesh@sourceware.org>2023-09-19 18:39:32 -0400
committerSiddhesh Poyarekar <siddhesh@sourceware.org>2023-10-02 15:35:29 -0400
commit1056e5b4c3f2d90ed2b4a55f96add28da2f4c8fa (patch)
tree7c97228a74e8790ae0a48a64254bfb977922dff6 /elf/dl-tunables.c
parent0d5f9ea97f1b39f2a855756078771673a68497e1 (diff)
downloadglibc-1056e5b4c3f2d90ed2b4a55f96add28da2f4c8fa.zip
glibc-1056e5b4c3f2d90ed2b4a55f96add28da2f4c8fa.tar.gz
glibc-1056e5b4c3f2d90ed2b4a55f96add28da2f4c8fa.tar.bz2
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>
Diffstat (limited to 'elf/dl-tunables.c')
-rw-r--r--elf/dl-tunables.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/elf/dl-tunables.c b/elf/dl-tunables.c
index 62b7332..cae67ef 100644
--- a/elf/dl-tunables.c
+++ b/elf/dl-tunables.c
@@ -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