Subject: Re: [PATCH RFC] bpf: Add support for reading user pointers

From: Joel Fernandes <[email-masked]>
Date: Fri, 3 May 2019 09:49:35 -0400

On Fri, May 03, 2019 at 01:12:34PM +0100, Qais Yousef wrote:
> Hi Joel
> 
> On 05/02/19 16:49, Joel Fernandes (Google) wrote:
> > The eBPF based opensnoop tool fails to read the file path string passed
> > to the do_sys_open function. This is because it is a pointer to
> > userspace address and causes an -EFAULT when read with
> > probe_kernel_read. This is not an issue when running the tool on x86 but
> > is an issue on arm64. This patch adds a new bpf function call based
> 
> I just did an experiment and if I use Android 4.9 kernel I indeed fail to see
> PATH info when running opensnoop. But if I run on 5.1-rc7 opensnoop behaves
> correctly on arm64.
> 
> My guess either a limitation that was fixed on later kernel versions or Android
> kernel has some strict option/modifications that make this fail?

Thanks a lot for checking, yes I was testing 4.9 kernel with this patch (pixel 3).

I am not sure what has changed since then, but I still think it is a good
idea to make the code more robust against such future issues anyway. In
particular, we learnt with extensive discussions that user/kernel pointers
are not necessarily distinguishable purely based on their address.

I hope agree this is an issue we need to fix.

See these discussions:

https://lkml.kernel.org/r/[email-masked]
https://lore.kernel.org/lkml/[email-masked]/T/#mf81816dbfe25ac5d0e96fbab029050e892f73af2

thanks,

 - Joel

> root@buildroot:/# uname -a
> Linux buildroot 5.1.0-rc7-00164-ga00214620959-dirty #41 SMP PREEMPT Thu May 2 16:33:00 BST 2019 aarch64 GNU/Linux
> root@buildroot:/# opensnoop
> PID    COMM               FD ERR PATH
> 5180   default.script     -1   2 /etc/ld.so.cache
> 5180   default.script     -1   2 /lib/tls/v8l/neon/vfp/libresolv.so.2
> 5180   default.script     -1   2 /lib/tls/v8l/neon/libresolv.so.2
> 5180   default.script     -1   2 /lib/tls/v8l/vfp/libresolv.so.2
> 5180   default.script     -1   2 /lib/tls/v8l/libresolv.so.2
> 5180   default.script     -1   2 /lib/tls/neon/vfp/libresolv.so.2
> 5180   default.script     -1   2 /lib/tls/neon/libresolv.so.2
> 5180   default.script     -1   2 /lib/tls/vfp/libresolv.so.2
> 5180   default.script     -1   2 /lib/tls/libresolv.so.2
> 5180   default.script     -1   2 /lib/v8l/neon/vfp/libresolv.so.2
> 5180   default.script     -1   2 /lib/v8l/neon/libresolv.so.2
> 5180   default.script     -1   2 /lib/v8l/vfp/libresolv.so.2
> 5180   default.script     -1   2 /lib/v8l/libresolv.so.2
> 5180   default.script     -1   2 /lib/neon/vfp/libresolv.so.2
> 5180   default.script     -1   2 /lib/neon/libresolv.so.2
> 5180   default.script     -1   2 /lib/vfp/libresolv.so.2
> 5180   default.script      3   0 /lib/libresolv.so.2
> 5180   default.script      3   0 /lib/libc.so.6
> 5180   default.script      3   0 /usr/share/udhcpc/default.script
> 5180   default.script      3   0 /usr/share/udhcpc/default.script.d/
> 
> 
> 
> 
> --
> Qais Yousef