summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--patches/cve/CVE-2018-5344-loop-fix-concurrent-lo_open-lo_release.patch63
1 files changed, 63 insertions, 0 deletions
diff --git a/patches/cve/CVE-2018-5344-loop-fix-concurrent-lo_open-lo_release.patch b/patches/cve/CVE-2018-5344-loop-fix-concurrent-lo_open-lo_release.patch
new file mode 100644
index 0000000..4e9bd40
--- /dev/null
+++ b/patches/cve/CVE-2018-5344-loop-fix-concurrent-lo_open-lo_release.patch
@@ -0,0 +1,63 @@
1From d5e06a1867210049bbfe27864ee0a40cfd9b1e9b Mon Sep 17 00:00:00 2001
2From: Linus Torvalds <torvalds@linux-foundation.org>
3Date: Fri, 5 Jan 2018 16:26:00 -0800
4Subject: [PATCH] loop: fix concurrent lo_open/lo_release
5MIME-Version: 1.0
6Content-Type: text/plain; charset=UTF-8
7Content-Transfer-Encoding: 8bit
8
9commit ae6650163c66a7eff1acd6eb8b0f752dcfa8eba5 upstream.
10
11范龙飞 reports that KASAN can report a use-after-free in __lock_acquire.
12The reason is due to insufficient serialization in lo_release(), which
13will continue to use the loop device even after it has decremented the
14lo_refcnt to zero.
15
16In the meantime, another process can come in, open the loop device
17again as it is being shut down. Confusion ensues.
18
19CVE: CVE-2018-5344
20Upstream-Status: Backport [https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-4.14.y&id=d5e06a1867210049bbfe27864ee0a40cfd9b1e9b]
21
22Reported-by: 范龙飞 <long7573@126.com>
23Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
24Signed-off-by: Jens Axboe <axboe@kernel.dk>
25Cc: Ben Hutchings <ben.hutchings@codethink.co.uk>
26Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
27Signed-off-by: Andreas Wellving <andreas.wellving@enea.com>
28---
29 drivers/block/loop.c | 10 ++++++++--
30 1 file changed, 8 insertions(+), 2 deletions(-)
31
32diff --git a/drivers/block/loop.c b/drivers/block/loop.c
33index 85de67334695..a2a0dce5114e 100644
34--- a/drivers/block/loop.c
35+++ b/drivers/block/loop.c
36@@ -1576,9 +1576,8 @@ static int lo_open(struct block_device *bdev, fmode_t mode)
37 return err;
38 }
39
40-static void lo_release(struct gendisk *disk, fmode_t mode)
41+static void __lo_release(struct loop_device *lo)
42 {
43- struct loop_device *lo = disk->private_data;
44 int err;
45
46 if (atomic_dec_return(&lo->lo_refcnt))
47@@ -1605,6 +1604,13 @@ static void lo_release(struct gendisk *disk, fmode_t mode)
48 mutex_unlock(&lo->lo_ctl_mutex);
49 }
50
51+static void lo_release(struct gendisk *disk, fmode_t mode)
52+{
53+ mutex_lock(&loop_index_mutex);
54+ __lo_release(disk->private_data);
55+ mutex_unlock(&loop_index_mutex);
56+}
57+
58 static const struct block_device_operations lo_fops = {
59 .owner = THIS_MODULE,
60 .open = lo_open,
61--
622.20.1
63