Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b2d22b6b authored by Jan Kara's avatar Jan Kara
Browse files

fanotify: Allow copying of file handle to userspace



When file handle is embedded inside fanotify_event and usercopy checks
are enabled, we get a warning like:

Bad or missing usercopy whitelist? Kernel memory exposure attempt detected
from SLAB object 'fanotify_event' (offset 40, size 8)!
WARNING: CPU: 1 PID: 7649 at mm/usercopy.c:78 usercopy_warn+0xeb/0x110
mm/usercopy.c:78

Annotate handling in fanotify_event properly to mark copying it to
userspace is fine.

Reported-by: default avatar <syzbot+2c49971e251e36216d1f@syzkaller.appspotmail.com>
Fixes: a8b13aa2 ("fanotify: enable FAN_REPORT_FID init flag")
Signed-off-by: default avatarKees Cook <keescook@chromium.org>
Reviewed-by: default avatarAmir Goldstein <amir73il@gmail.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 62c9d267
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -208,6 +208,7 @@ static int copy_fid_to_user(struct fanotify_event *event, char __user *buf)
{
	struct fanotify_event_info_fid info = { };
	struct file_handle handle = { };
	unsigned char bounce[FANOTIFY_INLINE_FH_LEN], *fh;
	size_t fh_len = event->fh_len;
	size_t len = fanotify_event_info_len(event);

@@ -233,7 +234,16 @@ static int copy_fid_to_user(struct fanotify_event *event, char __user *buf)

	buf += sizeof(handle);
	len -= sizeof(handle);
	if (copy_to_user(buf, fanotify_event_fh(event), fh_len))
	/*
	 * For an inline fh, copy through stack to exclude the copy from
	 * usercopy hardening protections.
	 */
	fh = fanotify_event_fh(event);
	if (fh_len <= FANOTIFY_INLINE_FH_LEN) {
		memcpy(bounce, fh, fh_len);
		fh = bounce;
	}
	if (copy_to_user(buf, fh, fh_len))
		return -EFAULT;

	/* Pad with 0's */