Skip to content

Commit 54fb4a6

Browse files
lag-linarogregkh
authored andcommitted
mailbox: mailbox-test: Fix potential double-free in mbox_test_message_write()
[ Upstream commit 2d1e952 ] If a user can make copy_from_user() fail, there is a potential for UAF/DF due to a lack of locking around the allocation, use and freeing of the data buffers. This issue is not theoretical. I managed to author a POC for it: BUG: KASAN: double-free in kfree+0x5c/0xac Free of addr ffff29280be5de00 by task poc/356 CPU: 1 PID: 356 Comm: poc Not tainted 6.1.0-00001-g961aa6552c04-dirty #20 Hardware name: linux,dummy-virt (DT) Call trace: dump_backtrace.part.0+0xe0/0xf0 show_stack+0x18/0x40 dump_stack_lvl+0x64/0x80 print_report+0x188/0x48c kasan_report_invalid_free+0xa0/0xc0 ____kasan_slab_free+0x174/0x1b0 __kasan_slab_free+0x18/0x24 __kmem_cache_free+0x130/0x2e0 kfree+0x5c/0xac mbox_test_message_write+0x208/0x29c full_proxy_write+0x90/0xf0 vfs_write+0x154/0x440 ksys_write+0xcc/0x180 __arm64_sys_write+0x44/0x60 invoke_syscall+0x60/0x190 el0_svc_common.constprop.0+0x7c/0x160 do_el0_svc+0x40/0xf0 el0_svc+0x2c/0x6c el0t_64_sync_handler+0xf4/0x120 el0t_64_sync+0x18c/0x190 Allocated by task 356: kasan_save_stack+0x3c/0x70 kasan_set_track+0x2c/0x40 kasan_save_alloc_info+0x24/0x34 __kasan_kmalloc+0xb8/0xc0 kmalloc_trace+0x58/0x70 mbox_test_message_write+0x6c/0x29c full_proxy_write+0x90/0xf0 vfs_write+0x154/0x440 ksys_write+0xcc/0x180 __arm64_sys_write+0x44/0x60 invoke_syscall+0x60/0x190 el0_svc_common.constprop.0+0x7c/0x160 do_el0_svc+0x40/0xf0 el0_svc+0x2c/0x6c el0t_64_sync_handler+0xf4/0x120 el0t_64_sync+0x18c/0x190 Freed by task 357: kasan_save_stack+0x3c/0x70 kasan_set_track+0x2c/0x40 kasan_save_free_info+0x38/0x5c ____kasan_slab_free+0x13c/0x1b0 __kasan_slab_free+0x18/0x24 __kmem_cache_free+0x130/0x2e0 kfree+0x5c/0xac mbox_test_message_write+0x208/0x29c full_proxy_write+0x90/0xf0 vfs_write+0x154/0x440 ksys_write+0xcc/0x180 __arm64_sys_write+0x44/0x60 invoke_syscall+0x60/0x190 el0_svc_common.constprop.0+0x7c/0x160 do_el0_svc+0x40/0xf0 el0_svc+0x2c/0x6c el0t_64_sync_handler+0xf4/0x120 el0t_64_sync+0x18c/0x190 Signed-off-by: Lee Jones <[email protected]> Signed-off-by: Jassi Brar <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent 15994ba commit 54fb4a6

File tree

1 file changed

+7
-0
lines changed

1 file changed

+7
-0
lines changed

drivers/mailbox/mailbox-test.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <linux/kernel.h>
1313
#include <linux/mailbox_client.h>
1414
#include <linux/module.h>
15+
#include <linux/mutex.h>
1516
#include <linux/of.h>
1617
#include <linux/platform_device.h>
1718
#include <linux/poll.h>
@@ -38,6 +39,7 @@ struct mbox_test_device {
3839
char *signal;
3940
char *message;
4041
spinlock_t lock;
42+
struct mutex mutex;
4143
wait_queue_head_t waitq;
4244
struct fasync_struct *async_queue;
4345
struct dentry *root_debugfs_dir;
@@ -110,6 +112,8 @@ static ssize_t mbox_test_message_write(struct file *filp,
110112
return -EINVAL;
111113
}
112114

115+
mutex_lock(&tdev->mutex);
116+
113117
tdev->message = kzalloc(MBOX_MAX_MSG_LEN, GFP_KERNEL);
114118
if (!tdev->message)
115119
return -ENOMEM;
@@ -144,6 +148,8 @@ static ssize_t mbox_test_message_write(struct file *filp,
144148
kfree(tdev->message);
145149
tdev->signal = NULL;
146150

151+
mutex_unlock(&tdev->mutex);
152+
147153
return ret < 0 ? ret : count;
148154
}
149155

@@ -392,6 +398,7 @@ static int mbox_test_probe(struct platform_device *pdev)
392398
platform_set_drvdata(pdev, tdev);
393399

394400
spin_lock_init(&tdev->lock);
401+
mutex_init(&tdev->mutex);
395402

396403
if (tdev->rx_channel) {
397404
tdev->rx_buffer = devm_kzalloc(&pdev->dev,

0 commit comments

Comments
 (0)