Skip to contentSkip to conversation

fsverity: reject FS_IOC_ENABLE_VERITY on mode 3 fds

PATCH In review Eric Biggers 3 participants 3 messages Apr 6, 2023 – Apr 11, 2023

Subsystems (3)
lore
Share & tools
lore

Eric Biggers

author maintainer
#0 lore raw

PATCH 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.

Fixes 56124d6c87fd ("fsverity: support enabling with tree block size < PAGE_SIZE")
Reported-by [email protected]
---
 fs/verity/enable.c | 7 +++++++
 1 file changed, 7 insertions(+)
fs/verity/enable.c +7 -0
index bbec6f93172cf..fc4c50e5219dc 100644
@@ -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
maintainer Reviewed-by on v1 1/1
#2 lore raw
In reply to Eric Biggers
Quoted 18 lines · Eric Biggers

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.

Quoted 6 lines
Fixes 56124d6c87fd ("fsverity: support enabling with tree block size < PAGE_SIZE")
Reported-by [email protected]

---

Looks good to me,