summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Wellving <andreas.wellving@enea.com>2019-05-21 15:58:49 +0200
committerAdrian Mangeac <Adrian.Mangeac@enea.com>2019-05-21 17:27:02 +0200
commit8fe9a92a93b62e5bf943555503d93ab353d1f7a3 (patch)
treea5f1037353452335a9d21f215642037fd2d7e9ea
parent746a703f7ca5294893c4071d707d07da388f4ffd (diff)
downloadenea-kernel-cache-8fe9a92a93b62e5bf943555503d93ab353d1f7a3.tar.gz
loop: CVE-2018-5344
loop: fix concurrent lo_open/lo_release Reference: https://nvd.nist.gov/vuln/detail/CVE-2018-5344 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-4.14.y&id=d5e06a1867210049bbfe27864ee0a40cfd9b1e9b Change-Id: Ic46cc23eaa20fafd3ff2b0275b989cb46f716774 Signed-off-by: Andreas Wellving <andreas.wellving@enea.com>
-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