]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
kprobes: Limit max data_size of the kretprobe instances
authorMasami Hiramatsu <mhiramat@kernel.org>
Wed, 1 Dec 2021 14:45:50 +0000 (23:45 +0900)
committerStefan Bader <stefan.bader@canonical.com>
Thu, 3 Feb 2022 17:57:22 +0000 (18:57 +0100)
BugLink: https://bugs.launchpad.net/bugs/1956381
commit 6bbfa44116689469267f1a6e3d233b52114139d2 upstream.

The 'kprobe::data_size' is unsigned, thus it can not be negative.  But if
user sets it enough big number (e.g. (size_t)-8), the result of 'data_size
+ sizeof(struct kretprobe_instance)' becomes smaller than sizeof(struct
kretprobe_instance) or zero. In result, the kretprobe_instance are
allocated without enough memory, and kretprobe accesses outside of
allocated memory.

To avoid this issue, introduce a max limitation of the
kretprobe::data_size. 4KB per instance should be OK.

Link: https://lkml.kernel.org/r/163836995040.432120.10322772773821182925.stgit@devnote2
Cc: stable@vger.kernel.org
Fixes: f47cd9b553aa ("kprobes: kretprobe user entry-handler")
Reported-by: zhangyue <zhangyue1@kylinos.cn>
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
include/linux/kprobes.h
kernel/kprobes.c

index a121fd8e7c3a01701a69de6d681f9933e78d50c1..c7764d9e6f39719ce28fe2a64cf0552779075082 100644 (file)
@@ -155,6 +155,8 @@ struct kretprobe {
        raw_spinlock_t lock;
 };
 
+#define KRETPROBE_MAX_DATA_SIZE        4096
+
 struct kretprobe_instance {
        struct hlist_node hlist;
        struct kretprobe *rp;
index 1668439b269d3257c2299afee8dbfcd0407a4f17..c93340bae3ac2590e8d67e966c5212b17f68408c 100644 (file)
@@ -2003,6 +2003,9 @@ int register_kretprobe(struct kretprobe *rp)
                }
        }
 
+       if (rp->data_size > KRETPROBE_MAX_DATA_SIZE)
+               return -E2BIG;
+
        rp->kp.pre_handler = pre_handler_kretprobe;
        rp->kp.post_handler = NULL;
        rp->kp.fault_handler = NULL;