6c2596f00c
After the commit of the current version, Scott Long pointed out, that an attacker might be able to cause a use-after-free access if this function returned the value of the sysctl variable "user.localbase" by freeing the allocated memory without the cached address being cleared in the library function. To resolve this issue, I have proposed the originally suggested version with a statically allocated buffer in a review (D27370). There was no feedback on this review and after waiting for more than 2 weeks, the potential security issue is fixed by this commit. (There was no security risk in practice, since none of the programs converted to use this function attempted to free the buffer. The address could only have pointed into the heap if user.localbase was set to a non-default value, into r/o data or the environment, else.) This version uses a static buffer of size LOCALBASE_CTL_LEN, which defaults to MAXPATHLEN. This does not increase the memory footprint of the library at this time, since its data segment grows from less than 7 KB to less than 8 KB, i.e. it will get two 4 KB pages on typical architectures, anyway. Compiling with LOCALBASE_CTL_LEN defined as 0 will remove the code that accesses the sysctl variable, values between 1 and MAXPATHLEN-1 will limit the maximum size of the prefix. When built with such a value and if too large a value has been configured in user.localbase, the value defined as ILLEGAL_PREFIX will be returned to cause any file operations on that result to fail. (Default value is "/dev/null/", the review contained "/\177", but I assume that "/dev/null" exists and can not be accessed as a directory. Any other string that can be assumed not be a valid path prefix could be used.) I do suggest to use LOCALBASE_CTL_LEN to size the in-kernel buffer for the user.localbase variable, too. Doing this would guarantee that the result always fit into the buffer in this library function (unless run on a kernel built with a different buffer size.) The function always returns a valid string, and only in case it is built with a small static buffer and run on a system with too large a value in user.localbase, the ILLEGAL_PREFIX will be returned, effectively causing the created path to be non-existent. Differential Revision: https://reviews.freebsd.org/D27370 |
||
---|---|---|
.. | ||
tests | ||
_secure_path.3 | ||
_secure_path.c | ||
auth.c | ||
expand_number.3 | ||
expand_number.c | ||
flopen.3 | ||
flopen.c | ||
fparseln.3 | ||
fparseln.c | ||
getlocalbase.3 | ||
getlocalbase.c | ||
gr_util.c | ||
hexdump.3 | ||
hexdump.c | ||
humanize_number.3 | ||
humanize_number.c | ||
kinfo_getallproc.3 | ||
kinfo_getallproc.c | ||
kinfo_getfile.3 | ||
kinfo_getfile.c | ||
kinfo_getproc.3 | ||
kinfo_getproc.c | ||
kinfo_getvmmap.3 | ||
kinfo_getvmmap.c | ||
kinfo_getvmobject.3 | ||
kinfo_getvmobject.c | ||
kld.3 | ||
kld.c | ||
libutil.h | ||
login_auth.3 | ||
login_auth.c | ||
login_cap.3 | ||
login_cap.c | ||
login_cap.h | ||
login_class.3 | ||
login_class.c | ||
login_crypt.c | ||
login_ok.3 | ||
login_ok.c | ||
login_times.3 | ||
login_times.c | ||
login_tty.3 | ||
login_tty.c | ||
login.conf.5 | ||
Makefile | ||
Makefile.depend | ||
pidfile.3 | ||
pidfile.c | ||
property.3 | ||
property.c | ||
pty.3 | ||
pty.c | ||
pw_util.3 | ||
pw_util.c | ||
quotafile.3 | ||
quotafile.c | ||
realhostname_sa.3 | ||
realhostname.3 | ||
realhostname.c | ||
stub.c | ||
trimdomain.3 | ||
trimdomain.c | ||
uucplock.3 | ||
uucplock.c |