Skip to content

Commit b2d22b6

Browse files
committed
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: syzbot+2c49971e251e36216d1f@syzkaller.appspotmail.com Fixes: a8b13aa ("fanotify: enable FAN_REPORT_FID init flag") Signed-off-by: Kees Cook <keescook@chromium.org> Reviewed-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz>
1 parent 62c9d26 commit b2d22b6

File tree

1 file changed

+11
-1
lines changed

1 file changed

+11
-1
lines changed

fs/notify/fanotify/fanotify_user.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ static int copy_fid_to_user(struct fanotify_event *event, char __user *buf)
208208
{
209209
struct fanotify_event_info_fid info = { };
210210
struct file_handle handle = { };
211+
unsigned char bounce[FANOTIFY_INLINE_FH_LEN], *fh;
211212
size_t fh_len = event->fh_len;
212213
size_t len = fanotify_event_info_len(event);
213214

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

234235
buf += sizeof(handle);
235236
len -= sizeof(handle);
236-
if (copy_to_user(buf, fanotify_event_fh(event), fh_len))
237+
/*
238+
* For an inline fh, copy through stack to exclude the copy from
239+
* usercopy hardening protections.
240+
*/
241+
fh = fanotify_event_fh(event);
242+
if (fh_len <= FANOTIFY_INLINE_FH_LEN) {
243+
memcpy(bounce, fh, fh_len);
244+
fh = bounce;
245+
}
246+
if (copy_to_user(buf, fh, fh_len))
237247
return -EFAULT;
238248

239249
/* Pad with 0's */

0 commit comments

Comments
 (0)