NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

kern/60750: compat_linux: stack garbage mistakes



>Number:         60750
>Category:       kern
>Synopsis:       compat_linux: stack garbage mistakes
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sun Sep 20 11:05:00 +0000 2026
>Originator:     Taylor R Campbell
>Release:        current, 11, 10, ...
>Organization:
Stack Array Garbage Collectors LLC
>Environment:
>Description:

	1. linux_sys_setgroups16 tries to copy in an array of gid_t,
	   but doesn't scale it by sizeof(gid_t) = 2, so it copies on
	   only half the array and leaves the rest as stack garbage for
	   kauth_cred_setgroups:

    276 	linux_gid16_t lset[COMPAT_NGROUPS16];
    277 	kauth_cred_t ncred;
    278 	int error;
    279 	gid_t grbuf[COMPAT_NGROUPS16];
    280 	unsigned int i, ngroups = SCARG(uap, gidsetsize);
    281 
    282 	if (ngroups > COMPAT_NGROUPS16)
    283 		return EINVAL;
    284 	error = copyin(SCARG(uap, gidset), lset, ngroups);
    285 	if (error != 0)
    286 		return error;
    287 
    288 	for (i = 0; i < ngroups; i++)
    289 		grbuf[i] = lset[i];
    290 
    291 	ncred = kauth_cred_alloc();
    292 	error = kauth_cred_setgroups(ncred, grbuf, SCARG(uap, gidsetsize),
    293 	    -1, UIO_SYSSPACE);

	   https://nxr.netbsd.org/xref/src/sys/compat/linux/common/linux_uid16.c?r=1.4#276

	2. linux_sys___prctl calls sys___lwp_setname/getname with
	   incompletely initialized arguments, leaving the target lwp
	   id as stack garbage:

    800 	switch(c) {
    801 	case LINUX_PR_SET_NAME: {
    802 		struct sys__lwp_setname_args sls;
    803 		SCARG(&sls, name) = (char *) SCARG(uap, args[0]);
    804 		return sys__lwp_setname(l, &sls, retval);
    805 	}
    806 
    807 	case LINUX_PR_GET_NAME: {
    808 		struct sys__lwp_getname_args slg;
    809 		SCARG(&slg, name) = (char *) SCARG(uap, args[0]);
    810 		SCARG(&slg, len) = MAXCOMLEN;
    811 		return sys__lwp_getname(l, &slg, retval);
    812 		}

	   https://nxr.netbsd.org/xref/src/sys/compat/linux/common/linux_sched.c?r=1.87#800

   2117 struct sys__lwp_setname_args {
   2118 	syscallarg(lwpid_t) target;
   2119 	syscallarg(const char *) name;
   2120 };
...
   2125 struct sys__lwp_getname_args {
   2126 	syscallarg(lwpid_t) target;
   2127 	syscallarg(char *) name;
   2128 	syscallarg(size_t) len;
   2129 };

	   https://nxr.netbsd.org/xref/src/sys/sys/syscallargs.h?r=1.313#2117

>How-To-Repeat:

	code inspection

>Fix:

	1. scale by sizeof array element
	2. memset zero




Home | Main Index | Thread Index | Old Index