mirror of
https://git.openafs.org/openafs.git
synced 2025-01-18 15:00:12 +00:00
OPENAFS-SA-2024-002: acl: Do not parse beyond end of ACL
CVE-2024-10396 The early parsing code in acl_Internalize_pr() tries to advance 'nextc' to go beyond the first two newlines in the given ACL string. But if the given ACL string has no newlines, or only 1 newline, then 'nextc' will point beyond the end of the ACL string, potentially pointing to garbage. Intuitively, it may look like the ACL string must contain at least 2 newlines because we have sscanf()'d the string with "%d\n%\d". However, whitespace characters in sscanf() are not matched exactly like non-whitespace characters are; a sequence of whitespace characters matches any amount of whitespace (including none). So, a string like "1 2" will be parsed by "%d\n%d\n", but will not contain any newline characters. Usually this should result in a parse error from acl_Internalize_pr(), but if the garbage happens to parse successfully, this could result in unrelated memory getting stored to the ACL. To fix this, don't advance 'nextc' if we're already at the end of the ACL string. FIXES 135445 Change-Id: Ie009b59bec9a75afc81fee201c2fca6955f484e4 Reviewed-on: https://gerrit.openafs.org/15910 Reviewed-by: Benjamin Kaduk <kaduk@mit.edu> Tested-by: Benjamin Kaduk <kaduk@mit.edu>
This commit is contained in:
parent
0358648dbe
commit
35d218c1d1
@ -264,10 +264,12 @@ acl_Internalize_pr(int (*func)(namelist *names, idlist *ids), char *elist, struc
|
||||
nextc = elist;
|
||||
while (*nextc && *nextc != '\n')
|
||||
nextc++;
|
||||
nextc++;
|
||||
if (*nextc != '\0')
|
||||
nextc++;
|
||||
while (*nextc && *nextc != '\n')
|
||||
nextc++;
|
||||
nextc++; /* now at the beginning of the entry list */
|
||||
if (*nextc != '\0')
|
||||
nextc++; /* now at the beginning of the entry list */
|
||||
for (i = 0; i < (*acl)->positive; i++) {
|
||||
int k;
|
||||
if (sscanf(nextc, "%63s\t%d\n", lnames.namelist_val[i], &k) != 2) {
|
||||
|
Loading…
Reference in New Issue
Block a user