介绍
proc 文件系统 ` procfs`是类 Unix 操作系统中的特殊文件系统,它以分层文件结构呈现有关进程和其他系统详细信息的信息。与传统跟踪方法或直接访问内核内存相比,这为动态访问内核中保存的进程数据提供了一种更方便、更标准化的方法。通常,它在启动时安装在 ` /proc`处。proc 文件系统用作内核中正在运行的进程的内部数据结构的接口。在 Linux 中,它还可用于获取有关内核的信息并在运行时通过 ` sysctl`修改某些内核参数。
procfs 中的进程信息
目录 ` /proc/PID`包含各种文件,这些文件提供有关由 PID(进程标识符)标识的特定进程的信息。这些文件的内容是在进程读取它们时由内核动态生成的。Linux 于 1992 年 9 月在 0.97.3 版中首次引入了 `/proc` 文件系统,并于 1992 年 12 月在 0.98.6 版中将其扩展为包含与进程无关的数据。
截至 2020 年,`procfs` 的 Linux 实现为每个正在运行的进程(包括内核进程)包含一个目录,名为 ` /proc/PID`,其中PID是进程号。每个目录包含以下信息:
-
/proc/PID/cmdline:最初启动该进程的命令。
-
/proc/PID/cwd:指向进程当前工作目录的符号链接。
-
/proc/PID/environ:包含影响进程的环境变量的名称和值。
-
/proc/PID/exe:如果仍然存在,则为原始可执行文件的符号链接(在原始可执行文件被删除或替换后,进程仍可能继续运行)。
-
/proc/PID/fd:包含每个打开文件描述符的符号链接的目录。
-
/proc/PID/fdinfo:包含描述每个打开文件描述符的位置和标志的条目的目录。
-
/proc/PID/maps:包含有关映射文件和内存块(如堆和堆栈)信息的文本文件。
-
/proc/PID/mem:代表进程虚拟内存的二进制图像,只能由 ptracing 进程访问。
-
/proc/PID/root:进程看到的根路径的符号链接。对于大多数进程,这将是指向 / 的链接,除非进程在 chroot jail 中运行。
-
/proc/PID/status:包含有关进程的基本信息,包括其运行状态和内存使用情况。
-
/proc/PID/task:包含指向该进程(即父进程)启动的任何任务的硬链接的目录。
与进程无关的系统信息
`/proc` 文件系统还包括与进程无关的系统信息,其中包括:
-
/proc/cmdline:提供传递给内核的启动选项。
-
/proc/loadavg:包含有关过去几分钟内系统平均负载的统计信息。
-
/proc/meminfo:总结内核如何管理其内存。
-
/proc/modules:包含当前加载的内核模块列表及其依赖项的一些指示。
-
/proc/mounts:指向 self/mounts 的符号链接,列出当前已安装的设备、它们的安装点和文件系统类型。
-
/proc/net/:包含有关网络堆栈的有用信息的目录。
使用 ps 和 strace 进行进程监控
使用 Linux 系统时,了解系统上运行的进程至关重要。ps 命令是一个强大的工具,可提供各种选项来查看和过滤进程信息。在 Linux 上,` ps` (进程状态)命令通过读取` proc`文件系统 中的文件来检索数据。
要查看 ps 在 Linux 环境中的运行方式,可以使用 ` strace`(系统调用监控)。`strace`是 Linux 的一个诊断、调试和指导用户空间实用程序,用于监控进程与 Linux 内核之间的交互,包括系统调用、信号传递和进程状态的变化。此功能由称为 ` ptrace`的内核功能实现。
要检查“ps”命令访问的数据,可以使用“strace -e openat ps”。
图 1. 使用 `strace` 命令通过 `ps` 命令访问的数据的示例。
以下是` ps`命令通过 ` openat`访问的文件列表,显示它从 ` /proc/[PID]/*`收集数据。你可以执行相同的检查 ` ss -tnup`。
图 2. ps 命令通过 openat 访问的文件列表。
` ss ` 命令还从 `/proc/[PID]/*` 收集数据。
可以通过操作“proc”文件系统来隐藏进程吗?
那么,当尝试从`/proc/`中删除进程 ID 时会发生什么?如下所示,内核阻止用户(包括 root)从`/proc/`中删除进程 ID 。
图 3. 尝试从 `/proc/` 中删除进程 ID 将导致“操作不允许”。
但是当我们挂载一个与“/proc/”目录相同的空文件夹时会发生什么?
从 Linux 2.4.0 开始,可以使用以下命令将文件层次结构的一部分重新挂载到其他位置:
mount –bind 旧目录 新目录
或者更短的选项:
/olddir /newdir 无绑定
在 /etc/fstab 文件中,可以配置如下:
/olddir /newdir 无绑定
执行此命令后,两个位置均可访问相同的内容。也可以重新挂载单个文件。此操作仅影响文件系统的一部分,不包括子挂载。
图 4. 成功对管理员隐藏的进程的屏幕截图。
就是这样。我们成功地向管理员隐藏了一个进程。未分类的威胁行为者团体也采用了这种策略。传统的事件响应 (IR) 分类通常依赖于脚本列表,但这种技术可用于逃避安全保护。
建议
Group-IB 建议管理员应:
-
启用` SElinux/AppArmor '。
-
经常检查挂载表,确保没有文件夹挂载到`/proc/`,如下所示:
原文始发于微信公众号(Ots安全):隐藏在显眼的地方:Linux 中针对 `/proc` 文件系统操纵的技术和防御
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论