cap: fix format-string vulnerability
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 2 May 2019 00:16:06 +0000 (20:16 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 2 May 2019 01:10:52 +0000 (21:10 -0400)
commit9691b1c8dbbd97d5a308aea0c161002b9f98c150
tree6aa11f35dcd1826467b42704f8fc869a9d88efe3
parent95e5d955a8e4bd291260b6f7f89b51e824d1d30d
cap: fix format-string vulnerability

It looks like the old code was trying to use snprintf() to sanitize the
user-provided strings.  That worked, but then we passed it to error(),
and the string passed to error() is *itself* a format string.  So in
attempting to make things more secure, we botched it.

Note that from and key are not user-pointers, and we know they are
null-terminated.  Our printf family of functions (and thus our error())
can handle null-terminated strings made of user-data, but not user
*pointers.*  By default, snprintf() does an unbounded strnlen() on the
string pointer, which could look beyond the region checked by
is_user_raddr().

Reported-by: syzbot+871c0525c81bbe0e93a5@syzkaller.appspotmail.com
Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/drivers/dev/capability.c