我在删除空目录时遇到问题,strace 显示错误:
rmdir("empty_dir") = -1 ENOTEMPTY (Directory not empty)
并且ls -la empty_dir
什么也不显示。所以我用 debugfs 连接到 fs (ext4) 并看到这个目录中的隐藏文件:
# ls -lia empty_dir/
total 8
44574010 drwxr-xr-x 2 2686 2681 4096 Jan 13 17:59 .
44573990 drwxr-xr-x 3 2686 2681 4096 Jan 13 18:36 ..
debugfs: ls empty_dir
44574010 (12) . 44573990 (316) ..
26808797 (3768) _-----------------------------------------------------------.jpg
为什么会发生这种情况?有没有机会在不卸载和全面检查 fs 的情况下解决这个问题?
附加信息:
“隐藏”文件只是一个普通的 jpg 文件,可以通过图像查看器打开:
debugfs: dump empty_dir/_-----------------------------------------------------------.jpg /root/hidden_file
# file /root/hidden_file
/root/hidden_file: JPEG image data, JFIF standard 1.02
rm -rf empty_dir
没有出现同样的错误:
unlinkat(AT_FDCWD, "empty_dir", AT_REMOVEDIR) = -1 ENOTEMPTY (Directory not empty)
find empty_dir/ -inum 26808797
什么都不显示。
我跟踪
ls
并获得了更多信息来挖掘(剥离了不重要的系统调用):嗯,我们看到系统调用
getdents
正常工作并返回了所有 3 个条目('.'、'..' 和 '_---*'),但ls
只写了 '.' 和 '..'。这意味着我们对getdents
coreutils 使用的包装器有一些问题。并且 coreutils 使用readdir
glibc 包装器用于getdents
.getdents
还要证明我从 getdents手册页的示例部分测试了小程序没有问题。该编显示了所有文件。也许我们刚刚在 glibc 中发现了一个错误?所以我将 glibc 包更新到我的发行版中的最后一个版本,但没有得到任何好的结果。我也没有在 bugzilla 中找到任何相关信息。
所以让我们更深入:
等等,什么?libncom.so.4.0.1?不是libc?是的,我们只是看到了一个带有 libc 函数的恶意共享库,用于隐藏恶意活动:
删除 rootkit 文件,检查所有包的文件(
rpm -Va
在我的例子中),自动启动脚本,预加载/预链接配置,系统文件(在我的例子中是find /
+rpm -qf
),更改受影响的密码,查找和杀死 rootkit 的进程:最后完整系统更新,重新启动并解决问题。黑客成功的原因:ipmi 接口带有非常旧的固件,突然可以从公共网络获得。
您可以在其中
debugfs
删除文件。您甚至不需要文件名(如果 francois P 在评论中猜测的特殊字符存在问题,这可能是相关的):在我的例子中,这是因为文件系统被挂载为 cifs smb/samba 共享,具有以下全局选项:
这提供了与 Apple 计算机的兼容性以及他们为所有媒体类型(例如 mp4)创建辅助元数据流的愿望。
但它的工作方式是创建不可见的点文件(例如
.apple.mp4
forapple.mp4
,它不能被远程系统删除,并且如果本地系统删除apple.mp4
但不删除点文件,它可能会不同步。解决方案是返回本地系统,点文件在该系统中可见并且可以
rm
“d”。