Patch "block: Deny writable memory mapping if block is read-only" has been added to the 6.3-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    block: Deny writable memory mapping if block is read-only

to the 6.3-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     block-deny-writable-memory-mapping-if-block-is-read-.patch
and it can be found in the queue-6.3 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 80f6863b3bbb73937ab4b54aa12e94dc1e8d9be6
Author: Loic Poulain <loic.poulain@xxxxxxxxxx>
Date:   Wed May 10 09:42:23 2023 +0200

    block: Deny writable memory mapping if block is read-only
    
    [ Upstream commit 69baa3a623fd2e58624f24f2f23d46f87b817c93 ]
    
    User should not be able to write block device if it is read-only at
    block level (e.g force_ro attribute). This is ensured in the regular
    fops write operation (blkdev_write_iter) but not when writing via
    user mapping (mmap), allowing user to actually write a read-only
    block device via a PROT_WRITE mapping.
    
    Example: This can lead to integrity issue of eMMC boot partition
    (e.g mmcblk0boot0) which is read-only by default.
    
    To fix this issue, simply deny shared writable mapping if the block
    is readonly.
    
    Note: Block remains writable if switch to read-only is performed
    after the initial mapping, but this is expected behavior according
    to commit a32e236eb93e ("Partially revert "block: fail op_is_write()
    requests to read-only partitions"")'.
    
    Signed-off-by: Loic Poulain <loic.poulain@xxxxxxxxxx>
    Reviewed-by: Christoph Hellwig <hch@xxxxxx>
    Link: https://lore.kernel.org/r/20230510074223.991297-1-loic.poulain@xxxxxxxxxx
    Signed-off-by: Jens Axboe <axboe@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/block/fops.c b/block/fops.c
index d2e6be4e3d1c7..58d0aebc7313a 100644
--- a/block/fops.c
+++ b/block/fops.c
@@ -678,6 +678,16 @@ static long blkdev_fallocate(struct file *file, int mode, loff_t start,
 	return error;
 }
 
+static int blkdev_mmap(struct file *file, struct vm_area_struct *vma)
+{
+	struct inode *bd_inode = bdev_file_inode(file);
+
+	if (bdev_read_only(I_BDEV(bd_inode)))
+		return generic_file_readonly_mmap(file, vma);
+
+	return generic_file_mmap(file, vma);
+}
+
 const struct file_operations def_blk_fops = {
 	.open		= blkdev_open,
 	.release	= blkdev_close,
@@ -685,7 +695,7 @@ const struct file_operations def_blk_fops = {
 	.read_iter	= blkdev_read_iter,
 	.write_iter	= blkdev_write_iter,
 	.iopoll		= iocb_bio_iopoll,
-	.mmap		= generic_file_mmap,
+	.mmap		= blkdev_mmap,
 	.fsync		= blkdev_fsync,
 	.unlocked_ioctl	= blkdev_ioctl,
 #ifdef CONFIG_COMPAT



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux