Bug 38163

Summary: bwrap игнорирует PATH при поиске запускаемых приложений
Product: Sisyphus Reporter: Anton Farygin <rider>
Component: bubblewrapAssignee: Yuri N. Sedunov <aris>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: aris, cas, iv, lav, ldv, rider, underwit, zerg
Version: unstable   
Hardware: x86_64   
OS: Linux   
See Also: https://bugzilla.altlinux.org/show_bug.cgi?id=51514
Bug Depends on:    
Bug Blocks: 34937    

Description Anton Farygin 2020-02-27 18:55:01 MSK
Нарвался при попытке использовании opam, но это точно воспроизводится для всех приложений, запускающих что-то через bwrap
В моём случае это выглядит так:

$echo $PATH
/home/rider/.opam/ocaml-base-compiler/bin:/home/rider/bin:/usr/lib/kf5/bin:/usr/local/bin:/usr/bin:/bin:/usr/games

$ bwrap --unshare-net --new-session --proc /proc --dev /dev --bind /tmp/.private/rider /tmp --setenv TMPDIR /tmp --setenv TMP /tmp --setenv TEMPDIR /tmp --setenv TEMP /tmp --tmpfs /run --ro-bind /usr /usr --ro-bind /bin /bin --ro-bind /lib /lib --ro-bind /lib64 /lib64 --ro-bind /etc /etc --ro-bind /opt /opt --ro-bind /home /home --ro-bind /var /var --ro-bind /home/rider/.opam/ocaml-base-compiler /home/rider/.opam/ocaml-base-compiler --bind /home/rider /home/rider --bind /home/rider/.cache/dune /home/rider/.cache/dune ocam
Creating root mount point
creating new namespace
forking for child
launch executable ocam
bwrap: execvp ocam: No such file or directory

$ which ocaml
/home/rider/.opam/ocaml-base-compiler/bin/ocaml

Легко воспроизводится, если попытаться запустить с помощью bwrap что-то из ~/bin/

На других дистрибутивах такого нет. 
Проблема скорее всего в нашей glibc - execvpe сбрасывает PATH для суидных бинарей.

А т.к. bwrap не работает, то проблемы запуска некоторых приложений flatpack тоже , вероятно, растут из этого места.
Comment 1 Anton Farygin 2020-02-27 18:56:03 MSK
В glibc это поведение привносится:
commit 69a1f59f8b86ee9b031c74fcd3d218605ba5be93
Author: Dmitry V. Levin <ldv@altlinux.org>
Date:   Mon Oct 20 11:06:36 2008 +0000

    owl-alt-sanitize-env
    
    Sanitize the environment in a paranoid way.
Comment 2 Anton Farygin 2020-02-27 18:57:56 MSK
Да, в первом примере запуск bwrap был с опечаткой, но по сути ничего не меняется:
$ bwrap --unshare-net --new-session --proc /proc --dev /dev --bind /tmp/.private/rider /tmp --setenv TMPDIR /tmp --setenv TMP /tmp --setenv TEMPDIR /tmp --setenv TEMP /tmp --tmpfs /run --ro-bind /usr /usr --ro-bind /bin /bin --ro-bind /lib /lib --ro-bind /lib64 /lib64 --ro-bind /etc /etc --ro-bind /opt /opt --ro-bind /home /home --ro-bind /var /var --ro-bind /home/rider/.opam/ocaml-base-compiler /home/rider/.opam/ocaml-base-compiler --bind /home/rider /home/rider --bind /home/rider/.cache/dune /home/rider/.cache/dune ocaml
Creating root mount point
creating new namespace
forking for child
launch executable ocaml
bwrap: execvp ocaml: No such file or directory
Comment 3 Anton Farygin 2020-02-27 19:04:26 MSK
Для чего используется bwrap в opam можно почитать тут:
https://opam.ocaml.org/doc/FAQ.html#Why-does-opam-require-bwrap

2ldv: хотелось бы, что бы bwrap у нас заработал так же как, как и в других дистрибутивах.
Comment 4 Dmitry V. Levin 2020-02-27 23:57:48 MSK
Из вышепроцитированного у меня сложилось ощущение, что это уязвимость в bwrap, причём в точности того класса, который наш ld.so затыкает.
Comment 5 Anton Farygin 2020-02-28 00:02:22 MSK
тогда  это хороший повод сходить в апстрим, если у тебя есть понимание, в чём заключается уязвимость и как её эксплуатировать.

Код в нём конечно ужасен, но именно в данном месте уязвимости быть не должно - bwrap в этом месте работает уже не под рутом.

/* This acquires the privileges that the bwrap will need it to work.
 * If bwrap is not setuid, then this does nothing, and it relies on
 * unprivileged user namespaces to be used. This case is
 * "is_privileged = FALSE".
 *
 * If bwrap is setuid, then we do things in phases.
 * The first part is run as euid 0, but with fsuid as the real user.
 * The second part, inside the child, is run as the real user but with
 * capabilities.
 * And finally we drop all capabilities.
 * The reason for the above dance is to avoid having the setup phase
 * being able to read files the user can't, while at the same time
 * working around various kernel issues. See below for details.
 */
Comment 6 Anton Farygin 2020-03-03 10:55:30 MSK
Есть предложение реализовать в bwrap самостоятельную обработку PATH по аналогии с execvpe из glibc.

Дима, как по твоему, что лучше - тащить реализацию поиска приложение из glibc в bubblewrap или откатить в нашем glibc игнорирование PATH в execvpe для суидных придожений ?
Comment 7 Anton Farygin 2020-04-09 15:33:11 MSK
ping
Comment 8 Sergey V Turchin 2020-05-08 11:40:06 MSK
Как видно, Дима предлагает самим выбрать из одного варианта.
Comment 9 Anton Farygin 2020-05-08 14:08:37 MSK
(Ответ для Sergey V Turchin на комментарий #8)
> Как видно, Дима предлагает самим выбрать из одного варианта.

Тогда перенесите в него поиск файла по пути, пожалуйста, из glibc, что бы нам не лезть в старый код в самом glibc.
Comment 10 underwit 2020-05-20 13:22:14 MSK
Сделал исправление. Пропустите сборку #251987
Comment 11 Sergey V Turchin 2020-05-20 16:29:33 MSK
У меня заработало. Например, установленный из flatpak kdenlive стал запускатся,
Comment 12 Repository Robot 2020-05-22 17:00:41 MSK
bubblewrap-0.4.1-alt2 -> sisyphus:

 Wed May 20 2020 Ivan Razzhivin <underwit@altlinux> 0.4.1-alt2
 - fix run path (Closes: 38163)