* Anton Arapov <[email protected]> [2013-04-03 18:00:37]:

> Unlike the kretprobes we can't trust userspace, thus must have
> protection from user space attacks. User-space have  "unlimited"
> stack, and this patch limits the return probes nestedness as a
> simple remedy for it.
> 
> Note that this implementation leaks return_instance on siglongjmp
> until exit()/exec().
> 
> The intention is to have KISS and bare minimum solution for the
> initial implementation in order to not complicate the uretprobes
> code.
> 
> In the future we may come up with more sophisticated solution that
> remove this depth limitation. It is not easy task and lays beyond
> this patchset.
> 
> Signed-off-by: Anton Arapov <[email protected]>

Acked-by: Srikar Dronamraju <[email protected]>

> ---
>  include/linux/uprobes.h |  3 +++
>  kernel/events/uprobes.c | 11 +++++++++++
>  2 files changed, 14 insertions(+)
> 
> diff --git a/include/linux/uprobes.h b/include/linux/uprobes.h
> index 5f8960e..d7bcf10 100644
> --- a/include/linux/uprobes.h
> +++ b/include/linux/uprobes.h
> @@ -38,6 +38,8 @@ struct inode;
>  #define UPROBE_HANDLER_REMOVE                1
>  #define UPROBE_HANDLER_MASK          1
> 
> +#define MAX_URETPROBE_DEPTH          64
> +
>  enum uprobe_filter_ctx {
>       UPROBE_FILTER_REGISTER,
>       UPROBE_FILTER_UNREGISTER,
> @@ -72,6 +74,7 @@ struct uprobe_task {
>       struct arch_uprobe_task         autask;
> 
>       struct return_instance          *return_instances;
> +     unsigned int                    depth;
>       struct uprobe                   *active_uprobe;
> 
>       unsigned long                   xol_vaddr;
> diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c
> index d129c1d..489f5e3 100644
> --- a/kernel/events/uprobes.c
> +++ b/kernel/events/uprobes.c
> @@ -1381,6 +1381,13 @@ static void prepare_uretprobe(struct uprobe *uprobe, 
> struct pt_regs *regs)
>       if (!utask)
>               return;
> 
> +     if (utask->depth >= MAX_URETPROBE_DEPTH) {
> +             printk_ratelimited(KERN_INFO "uprobe: omit uretprobe due to"
> +                             " nestedness limit pid/tgid=%d/%d\n",
> +                             current->pid, current->tgid);
> +             return;
> +     }
> +
>       ri = kzalloc(sizeof(struct return_instance), GFP_KERNEL);
>       if (!ri)
>               goto fail;
> @@ -1416,6 +1423,8 @@ static void prepare_uretprobe(struct uprobe *uprobe, 
> struct pt_regs *regs)
>       ri->orig_ret_vaddr = orig_ret_vaddr;
>       ri->chained = chained;
> 
> +     utask->depth++;
> +
>       /* add instance to the stack */
>       ri->next = utask->return_instances;
>       utask->return_instances = ri;
> @@ -1652,6 +1661,8 @@ static bool handler_uretprobe(struct pt_regs *regs)
>               if (!chained)
>                       break;
> 
> +             utask->depth--;
> +
>               BUG_ON(!ri);
>       }
> 
> -- 
> 1.8.1.4
> 

-- 
Thanks and Regards
Srikar Dronamraju

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to