fsverity: reject FS_IOC_ENABLE_VERITY on mode 3 fds
Eric Biggers
maintainerPATCH 1/1 fsverity: reject FS_IOC_ENABLE_VERITY on mode 3 fds
From: Eric Biggers <[email protected]>
Commit 56124d6c87fd ("fsverity: support enabling with tree block size < PAGE_SIZE") changed FS_IOC_ENABLE_VERITY to use __kernel_read() to read the file's data, instead of direct pagecache accesses.
An unintended consequence of this is that the 'WARN_ON_ONCE(!(file->f_mode & FMODE_READ))' in __kernel_read() became reachable by fuzz tests. This happens if FS_IOC_ENABLE_VERITY is called on a fd opened with access mode 3, which means "ioctl access only".
Arguably, FS_IOC_ENABLE_VERITY should work on ioctl-only fds. But ioctl-only fds are a weird Linux extension that is rarely used and that few people even know about. (The documentation for FS_IOC_ENABLE_VERITY even specifically says it requires O_RDONLY.) It's probably not worthwhile to make the ioctl internally open a new fd just to handle this case. Thus, just reject the ioctl on such fds for now.
--- fs/verity/enable.c | 7 +++++++ 1 file changed, 7 insertions(+)
fs/verity/enable.c +7 -0
@@ -357,6 +357,13 @@ int fsverity_ioctl_enable(struct file *filp, const void __user *uarg) err =file_permission (filp,MAY_WRITE );if (err)return err; +/* +* __kernel_read() is used while building the Merkle tree. So, we can't +* allow file descriptors that were opened for ioctl access only, using +* the special nonstandard access mode 3. O_RDONLY only, please! +*/ +if (!(filp->f_mode &FMODE_READ )) +return -EBADF ;if (IS_APPEND (inode))return -EPERM ;
base-commit: dbd91ed3b5acb7acba2cac2d38e7aec57a5f1e96
Signature · 1 line
2.40.0
Looks good:
Quoted 18 lines · Eric Biggers
From: Eric Biggers <[email protected]>
Commit
56124d6c87fd("fsverity: support enabling with tree block size <PAGE_SIZE") changedFS_IOC_ENABLE_VERITYto use__kernel_read()to read the file's data, instead of direct pagecache accesses.An unintended consequence of this is that the '
WARN_ON_ONCE(!(file->f_mode & FMODE_READ))' in__kernel_read()became reachable by fuzz tests. This happens ifFS_IOC_ENABLE_VERITYis called on a fd opened with access mode 3, which means "ioctl access only".Arguably,
FS_IOC_ENABLE_VERITYshould work on ioctl-only fds. But ioctl-only fds are a weird Linux extension that is rarely used and that few people even know about. (The documentation forFS_IOC_ENABLE_VERITYeven specifically says it requiresO_RDONLY.) It's probably not worthwhile to make the ioctl internally open a new fd just to handle this case. Thus, just reject the ioctl on such fds for now.
Quoted 6 lines
Fixes 56124d6c87fd ("fsverity: support enabling with tree block size < PAGE_SIZE")Reported-by [email protected]Signed-off-by Eric Biggers <[email protected]>---
Looks good to me,