AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 416852
Accepted
bfuvx
bfuvx
Asked: 2018-01-14 08:40:15 +0800 CST2018-01-14 08:40:15 +0800 CST 2018-01-14 08:40:15 +0800 CST

rmdir 删除空目录失败

  • 772

我在删除空目录时遇到问题,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什么都不显示。

malware ext4
  • 3 3 个回答
  • 2064 Views

3 个回答

  • Voted
  1. Best Answer
    bfuvx
    2018-01-15T16:15:24+08:002018-01-15T16:15:24+08:00

    我跟踪ls并获得了更多信息来挖掘(剥离了不重要的系统调用):

    open("empty_dir", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3
    getdents(3, /* 3 entries */, 32768)     = 80
    write(1, ".\n", 2.)                     = 2
    write(1, "..\n", 3..)                   = 3
    

    嗯,我们看到系统调用getdents正常工作并返回了所有 3 个条目('.'、'..' 和 '_---*'),但ls只写了 '.' 和 '..'。这意味着我们对getdentscoreutils 使用的包装器有一些问题。并且 coreutils 使用readdirglibc 包装器用于getdents. getdents还要证明我从 getdents手册页的示例部分测试了小程序没有问题。该编显示了所有文件。

    也许我们刚刚在 glibc 中发现了一个错误?所以我将 glibc 包更新到我的发行版中的最后一个版本,但没有得到任何好的结果。我也没有在 bugzilla 中找到任何相关信息。

    所以让我们更深入:

    # gdb ls
    (gdb) break readdir
    (gdb) run
    Breakpoint 1, 0x00007ffff7dfa820 in readdir () from /lib64/libncom.so.4.0.1
    (gdb) info symbol readdir
    readdir in section .text of /lib64/libncom.so.4.0.1
    

    等等,什么?libncom.so.4.0.1?不是libc?是的,我们只是看到了一个带有 libc 函数的恶意共享库,用于隐藏恶意活动:

    # LD_PRELOAD=/lib64/libc.so.6 find / > good_find
    # find / > injected_find
    # diff good_find injected_find
    10310d10305
    < /lib64/libncom.so.4.0.1
    73306d73300
    < /usr/bin/_-config
    73508d73501
    < /usr/bin/_-pud
    73714d73706
    < /usr/bin/_-minerd
    86854d86845
    < /etc/ld.so.preload
    

    删除 rootkit 文件,检查所有包的文件(rpm -Va在我的例子中),自动启动脚本,预加载/预链接配置,系统文件(在我的例子中是find /+ rpm -qf),更改受影响的密码,查找和杀死 rootkit 的进程:

    # for i in /proc/[1-9]*; do name=$(</proc/${i##*/}/comm); ps -p ${i##*/} > /dev/null || echo $name; done
    _-minerd
    

    最后完整系统更新,重新启动并解决问题。黑客成功的原因:ipmi 接口带有非常旧的固件,突然可以从公共网络获得。

    • 4
  2. Hauke Laging
    2018-01-14T09:37:06+08:002018-01-14T09:37:06+08:00

    您可以在其中debugfs删除文件。您甚至不需要文件名(如果 francois P 在评论中猜测的特殊字符存在问题,这可能是相关的):

    kill_file <26808797>
    
    • 1
  3. Guillaume
    2022-01-13T08:31:56+08:002022-01-13T08:31:56+08:00

    在我的例子中,这是因为文件系统被挂载为 cifs smb/samba 共享,具有以下全局选项:

    [global]
       vfs objects = catia fruit streams_xattr
       fruit:aapl = yes
    

    这提供了与 Apple 计算机的兼容性以及他们为所有媒体类型(例如 mp4)创建辅助元数据流的愿望。

    但它的工作方式是创建不可见的点文件(例如.apple.mp4for apple.mp4,它不能被远程系统删除,并且如果本地系统删除apple.mp4但不删除点文件,它可能会不同步。

    解决方案是返回本地系统,点文件在该系统中可见并且可以rm“d”。

    • 1

相关问题

  • 移动数百万个小文件会导致“空间不足”错误

  • ZFS 磁盘上的“VFS:找不到 ext4 文件系统”

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve