diff options
author | Andreas Wellving <andreas.wellving@enea.com> | 2019-05-21 15:58:49 +0200 |
---|---|---|
committer | Adrian Mangeac <Adrian.Mangeac@enea.com> | 2019-05-21 17:27:02 +0200 |
commit | 8fe9a92a93b62e5bf943555503d93ab353d1f7a3 (patch) | |
tree | a5f1037353452335a9d21f215642037fd2d7e9ea | |
parent | 746a703f7ca5294893c4071d707d07da388f4ffd (diff) | |
download | enea-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.patch | 63 |
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 @@ | |||
1 | From d5e06a1867210049bbfe27864ee0a40cfd9b1e9b Mon Sep 17 00:00:00 2001 | ||
2 | From: Linus Torvalds <torvalds@linux-foundation.org> | ||
3 | Date: Fri, 5 Jan 2018 16:26:00 -0800 | ||
4 | Subject: [PATCH] loop: fix concurrent lo_open/lo_release | ||
5 | MIME-Version: 1.0 | ||
6 | Content-Type: text/plain; charset=UTF-8 | ||
7 | Content-Transfer-Encoding: 8bit | ||
8 | |||
9 | commit ae6650163c66a7eff1acd6eb8b0f752dcfa8eba5 upstream. | ||
10 | |||
11 | 范龙飞 reports that KASAN can report a use-after-free in __lock_acquire. | ||
12 | The reason is due to insufficient serialization in lo_release(), which | ||
13 | will continue to use the loop device even after it has decremented the | ||
14 | lo_refcnt to zero. | ||
15 | |||
16 | In the meantime, another process can come in, open the loop device | ||
17 | again as it is being shut down. Confusion ensues. | ||
18 | |||
19 | CVE: CVE-2018-5344 | ||
20 | Upstream-Status: Backport [https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=linux-4.14.y&id=d5e06a1867210049bbfe27864ee0a40cfd9b1e9b] | ||
21 | |||
22 | Reported-by: 范龙飞 <long7573@126.com> | ||
23 | Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> | ||
24 | Signed-off-by: Jens Axboe <axboe@kernel.dk> | ||
25 | Cc: Ben Hutchings <ben.hutchings@codethink.co.uk> | ||
26 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
27 | Signed-off-by: Andreas Wellving <andreas.wellving@enea.com> | ||
28 | --- | ||
29 | drivers/block/loop.c | 10 ++++++++-- | ||
30 | 1 file changed, 8 insertions(+), 2 deletions(-) | ||
31 | |||
32 | diff --git a/drivers/block/loop.c b/drivers/block/loop.c | ||
33 | index 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 | -- | ||
62 | 2.20.1 | ||
63 | |||