提问人:incubus 提问时间:10/20/2023 更新时间:10/20/2023 访问量:36
运行 sudo 命令时意外的挂载系统调用
Unexpected mount syscalls when running sudo command
问:
我正在开发一个程序,该程序监视挂载和卸载系统调用,并将调用的各种参数打印到终端。它工作正常,但我注意到一些行为,我不明白系统上的其他命令似乎在哪里触发了带有没有意义的参数的mount/umount系统调用。
例如,使用 bpftrace,我运行以下命令:.现在,如果我运行挂载命令(例如),终端上的输出与我预期的一样:bpftrace -e 'tracepoint:syscalls:sys_enter_mount { printf("%s %s %s %s\n", comm, str(args->dev_name), str(args->dir_name), str(args->type)) }'
mount /dev/nvme0n1p1 /home/tests
[root@rhel9-vm]# bpftrace -e 'tracepoint:syscalls:sys_enter_mount { printf("%s %s %s %s\n", comm, str(args->dev_name), str(args->dir_name), str(args->type)) }'
Attaching 1 probe...
mount /dev/nvme0n1p1 /home/tests xfs
如果我打开另一个终端并尝试运行任何 sudo 命令,我会得到很多带有空或意外参数的系统调用:mount
[root@rhel9-vm]# bpftrace -e 'tracepoint:syscalls:sys_enter_mount { printf("%s %s %s %s\n", comm, str(args->dev_name), str(args->dir_name), str(args->type)) }'
Attaching 1 probe...
(fprintd) /
(fprintd) / /proc/self/fd/3
(fprintd) /run/systemd/inaccessible/chr /proc/self/fd/4
(fprintd) /run/systemd/inaccessible/dir /proc/self/fd/4
(fprintd) proc /proc/self/fd/4 proc
(fprintd) /run/systemd/unit-root/proc/acpi /proc/self/fd/4
(fprintd) /run/systemd/unit-root/proc/asound /proc/self/fd/4
(fprintd) /run/systemd/unit-root/proc/bus /proc/self/fd/4
(fprintd) /run/systemd/unit-root/proc/fs /proc/self/fd/4
(fprintd) /run/systemd/unit-root/proc/irq /proc/self/fd/4
(fprintd) /run/systemd/inaccessible/reg /proc/self/fd/4
(fprintd) /run/systemd/inaccessible/reg /proc/self/fd/4
(fprintd) /run/systemd/inaccessible/reg /proc/self/fd/4
(fprintd) /run/systemd/unit-root/proc/mtrr /proc/self/fd/4
(fprintd) /run/systemd/unit-root/proc/scsi /proc/self/fd/4
(fprintd) /run/systemd/unit-root/proc/sys /proc/self/fd/4
(fprintd) /run/systemd/unit-root/proc/sysrq-trigger /proc/self/fd/4
(fprintd) /run/systemd/inaccessible/dir /proc/self/fd/4
(fprintd) /run/systemd/inaccessible/dir /proc/self/fd/4
(fprintd) /run/systemd/propagate/fprintd.service /proc/self/fd/4
(fprintd) /run/systemd/inaccessible/dir /proc/self/fd/4
(fprintd) /run/systemd/unit-root/sys/devices /proc/self/fd/4
(fprintd) /tmp/systemd-private-69f2a28c33e74958aed8c34daf301716-fprintd.s /proc/self/fd/4
(fprintd) /run/systemd/inaccessible/dir /proc/self/fd/4
(fprintd) /var/lib/fprint /proc/self/fd/4
(fprintd) /var/tmp/systemd-private-69f2a28c33e74958aed8c34daf301716-fprin /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /proc/self/fd/4
(fprintd) /run/systemd/unit-root /
(fprintd) /
(fprintd) /run/systemd/incoming
我不明白这种行为。为什么一个简单的命令会有任何系统调用?在短期内,我可以通过忽略任何没有设置文件类型的异常来过滤掉意外情况,但这似乎有点黑客攻击。也许入口标志中有什么可以解释它?mount
sudo ls
bpftrace 中的命令字段 () 提到,尽管当我通过第三方内核驱动程序查看调用时,我看到的是命令。comm
fprintd
systemd rhgb --switched-root --system --deserialize 31
对于我所看到的行为,有什么合理的解释吗?
答:
在 Linux 中,除了挂载文件系统之外,还可以做更多的事情——还有一个“绑定挂载”,它将一个目录的内容挂载到另一个目录——就像一个符号链接,但不同。mount
在该跟踪中,我们看到指纹扫描仪守护程序 () 准备了一个隔离的容器:一个进程,它只能查看系统的一部分并与其他进程分开。您可以在 man 命名空间中阅读有关 Linux 函数的更多信息。fprintd
在这种情况下,挂载它认为将来容器化进程所需的所有目录 - 一旦容器被密封,所有其他文件和目录将无法访问该进程。之后,它将使用 pivot_root 将根目录永久移动到新目录(对于该进程及其子目录)。fprintd
至于为什么会这样做——我不能说。这似乎是一些安全措施,但其复杂性超出了我的知识范围。systemd
评论