• Wang Nan's avatar
    perf record: Fix segfault when running with suid and kptr_restrict is 1 · 3dbe46c5
    Wang Nan authored
    Before this patch perf panics if kptr_restrict is set to 1 and perf is
    owned by root with suid set:
    
      $ whoami
      wangnan
      $ ls -l ./perf
      -rwsr-xr-x 1 root root 19781908 Sep 21 19:29 /home/wangnan/perf
      $ cat /proc/sys/kernel/kptr_restrict
      1
      $ cat /proc/sys/kernel/perf_event_paranoid
      -1
      $ ./perf record -a
      Segmentation fault (core dumped)
      $
    
    The reason is that perf assumes it is allowed to read kptr from
    /proc/kallsyms when euid is root, but in fact the kernel doesn't allow
    reading kptr when euid and uid do not match with each other:
    
      $ cp /bin/cat .
      $ sudo chown root:root ./cat
      $ sudo chmod u+s ./cat
      $ cat /proc/kallsyms | grep do_fork
      0000000000000000 T _do_fork          <--- kptr is hidden even euid is root
      $ sudo cat /proc/kallsyms | grep do_fork
      ffffffff81080230 T _do_fork
    
    See lib/vsprintf.c for kernel side code.
    
    This patch fixes this problem by checking both uid and euid.
    Signed-off-by: default avatarWang Nan <wangnan0@huawei.com>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Alexei Starovoitov <ast@fb.com>
    Cc: He Kuang <hekuang@huawei.com>
    Cc: Zefan Li <lizefan@huawei.com>
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/r/20161115040617.69788-3-wangnan0@huawei.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    3dbe46c5
symbol.c 46.6 KB