Fedora 41 has reached Linux 6.12 kernel with TOMOYO enabled. I observed
that /usr/lib/systemd/systemd executes /usr/lib/systemd/systemd-executor
by passing dirfd == 9 or dirfd == 16 upon execveat().
Commit ada1986d07 ("tomoyo: fallback to realpath if symlink's pathname
does not exist") used realpath only if symlink's pathname does not exist.
But an out of tree patch suggested that it will be reasonable to always
use realpath if symlink's pathname refers to proc filesystem.
Therefore, this patch changes the pathname used for checking "file execute"
and the domainname used after a successful execve() request.
Before:
<kernel> /usr/lib/systemd/systemd
file execute proc:/self/fd/16 exec.realpath="/usr/lib/systemd/systemd-executor" exec.argv[0]="/usr/lib/systemd/systemd-executor"
file execute proc:/self/fd/9 exec.realpath="/usr/lib/systemd/systemd-executor" exec.argv[0]="/usr/lib/systemd/systemd-executor"
<kernel> /usr/lib/systemd/systemd proc:/self/fd/16
file execute /usr/sbin/auditd exec.realpath="/usr/sbin/auditd" exec.argv[0]="/usr/sbin/auditd"
<kernel> /usr/lib/systemd/systemd proc:/self/fd/16 /usr/sbin/auditd
<kernel> /usr/lib/systemd/systemd proc:/self/fd/9
file execute /usr/bin/systemctl exec.realpath="/usr/bin/systemctl" exec.argv[0]="/usr/bin/systemctl"
<kernel> /usr/lib/systemd/systemd proc:/self/fd/9 /usr/bin/systemctl
After:
<kernel> /usr/lib/systemd/systemd
file execute /usr/lib/systemd/systemd-executor exec.realpath="/usr/lib/systemd/systemd-executor" exec.argv[0]="/usr/lib/systemd/systemd-executor"
<kernel> /usr/lib/systemd/systemd /usr/lib/systemd/systemd-executor
file execute /usr/bin/systemctl exec.realpath="/usr/bin/systemctl" exec.argv[0]="/usr/bin/systemctl"
file execute /usr/sbin/auditd exec.realpath="/usr/sbin/auditd" exec.argv[0]="/usr/sbin/auditd"
<kernel> /usr/lib/systemd/systemd /usr/lib/systemd/systemd-executor /usr/bin/systemctl
<kernel> /usr/lib/systemd/systemd /usr/lib/systemd/systemd-executor /usr/sbin/auditd
Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>