On Thu,  9 Aug 2018 09:18:00 -0400
Carlos Neira <cneirabus...@gmail.com> wrote:

> From: cneira <cneirabus...@gmail.com>
> 
> This helper obtains the active namespace from current and returns pid, tgid,
> device and namespace id as seen from that namespace, allowing to instrument
> a process inside a container.
> Device is read from /proc/self/ns/pid, as in the future it's possible that
> different pid_ns files may belong to different devices, according
> to the discussion between Eric Biederman and Yonghong in 2017 linux plumbers
> conference.
> 
> Currently bpf_get_current_pid_tgid(), is used to do pid filtering in bcc's
> scripts but this helper returns the pid as seen by the root namespace which is
> fine when a bcc script is not executed inside a container.
> When the process of interest is inside a container, pid filtering will not 
> work
> if bpf_get_current_pid_tgid() is used. This helper addresses this limitation
> returning the pid as it's seen by the current namespace where the script is
> executing.
> 
> This helper has the same use cases as bpf_get_current_pid_tgid() as it can be
> used to do pid filtering even inside a container.
> 
> For example a bcc script using bpf_get_current_pid_tgid() 
> (tools/funccount.py):
> 
>       u32 pid = bpf_get_current_pid_tgid() >> 32;
>       if (pid != <pid_arg_passed_in>)
>               return 0;
> 
> Could be modified to use bpf_get_current_pidns_info() as follows:
> 
>       struct bpf_pidns pidns;
>       bpf_get_current_pid_tgid(&pidns, sizeof(struct bpf_pidns));
        ^^^^^^^^^^^^^^^^^^^^^^^^

Shouldn't this be:
        bpf_get_current_pidns_info(...)

>       u32 pid = pidns.tgid;
>       u32 nsid = pidns.nsid;
>       if ((pid != <pid_arg_passed_in>) && (nsid != <nsid_arg_passed_in>))
>               return 0;
> 

[...]

> diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
> index dd5758dc35d3..031e7d9dba09 100644
> --- a/include/uapi/linux/bpf.h
> +++ b/include/uapi/linux/bpf.h
> @@ -2113,6 +2113,18 @@ union bpf_attr {
>   *           the shared data.
>   *   Return
>   *           Pointer to the local storage area.
> + *
> + * int bpf_get_current_pidns(struct bpf_pidns_info *pidns, u32 size_of_pidns)

Should this be:
          bpf_get_current_pidns_info(...)

> + *   Description
> + *           Copies into *pidns* pid, namespace id and tgid as seen by the
> + *           current namespace and also device from /proc/self/ns/pid.
> + *           *size_of_pidns* must be the size of *pidns*
> + *
> + *           This helper is used when pid filtering is needed inside a
> + *           container as bpf_get_current_tgid() helper returns always the
> + *           pid id as seen by the root namespace.
> + *   Return
> + *           0 on success -EINVAL on error.
>   */
>  #define __BPF_FUNC_MAPPER(FN)                \
>       FN(unspec),                     \
> @@ -2196,7 +2208,8 @@ union bpf_attr {
>       FN(rc_keydown),                 \
>       FN(skb_cgroup_id),              \
>       FN(get_current_cgroup_id),      \
> -     FN(get_local_storage),
> +     FN(get_local_storage),          \
> +     FN(get_current_pidns_info),

-- 
Best regards,
  Jesper Dangaard Brouer
  MSc.CS, Principal Kernel Engineer at Red Hat
  LinkedIn: http://www.linkedin.com/in/brouer

Reply via email to