发行版是 Ubuntu 22.04,我正在运行一个新创建的ext4
文件系统,我已将设置复制到该文件系统(在另一台机器上使用 rsync)。我正在运行手动编写的(python)文件系统性能测试,该测试在不同的机器上正常工作。完全偶然地,我发现wc
(或ls
)中存在某种不正确的行为,这种行为仅针对我系统上的特定文件表现出来 - 就我目前发现的而言 - /usr/bin/pkexec
。如果这相关,则该框正在运行官方 Ubuntu 的 coreutils 版本 8.32-4。
这是我针对任何不同文件所讨论的操作的示例:
$ ls -l /usr/bin/top
-rwxr-xr-x 1 root root 379389 Jun 11 12:04 /usr/bin/top
$ cat /usr/bin/top | wc -c
379389
$
注意 ls 和 wc 显示的尺寸。它们是相同的。
现在,有一个文件/usr/bin/pkexec
。根据手册页,
pkexec - Execute a command as another user
发生了这种情况
$ ls -l /usr/bin/pkexec
-rwsr-xr-x 1 root root 519851 Jun 11 12:04 /usr/bin/pkexec
$ cat /usr/bin/pkexec | wc -c
32145
$
大小不同。确实不同。
我认为这与某些文件系统损坏有关,我在恢复模式下运行了 fsck。什么都没有改变。
然后我将磁盘带到最初执行 rsync 的机器上。(它运行的是 Arch Linux)。我在那里挂载了 Ubuntu 的根分区。哇!
# ls -l /mnt/disk/usr/bin/pkexec
-rwsr-xr-x 1 root root 519851 Jun 11 12:04 /mnt/disk/usr/bin/pkexec
# cat /mnt/disk/usr/bin/pkexec | wc -c
519851
#
这里显示的大小相等。我不明白。我有一个不同版本的 Ubuntu 机器,上面文件的信息如下:
$ ls -l /usr/bin/pkexec
-rwsr-xr-x 1 root root 32145 Jul 26 14:45 /usr/bin/pkexec
$ cat /usr/bin/pkexec | wc -c
32145
$
wc
这里的大小匹配。我发现此版本的 Ubuntu 中此文件的正确大小是“32145”。但在第一台机器上,我看到和中的大小甚至不匹配ls
。我可能有这些解释
- 机器安装了不同的更新。但为什么实用程序之间显示的大小不同?
- 这是对该二进制文件的某种运行时保护
/usr/bin/pkexec
,因为我看到它是 SUID - 也许操作系统通过向用户显示不正确的数据来保护它?但为什么这种行为只在一台机器上出现,而在另一台机器上没有出现呢?
感谢您的帮助和解释。我想我不了解 Linux 的一些重要内容。
PS如果我使用 Python 等语言读取目录“/usr/bin”,并检索文件的元数据,问题也会出现。然后我读取每个文件并检查结果长度。pkexec
元数据中为 - 时,结果为 519851 字节。但如果我读取文件,结果会短得多 - 只有 32145 字节。谢谢。
事实证明该系统已被入侵。
很可能
ld preload
被滥用来隐藏恶意行为。这些是我见过的启动消息,看起来所有进程都运行了相同的代码:
我把磁盘拿到另一台机器上,发现有一个
/etc/ld.so.preload
文件存在。Ubuntu 原有安装中没有这个文件。我选择重新安装 Ubuntu。