Yama¶
Yama 是一个 Linux 安全模块,它收集核心内核本身不处理的系统范围内的 DAC 安全保护措施。 这可以在构建时通过 CONFIG_SECURITY_YAMA
选择,并且可以通过 /proc/sys/kernel/yama
中的 sysctl 在运行时进行控制
ptrace_scope¶
随着 Linux 越来越受欢迎,它将成为恶意软件的更大目标。 Linux 进程接口一个特别令人担忧的弱点是,单个用户能够检查其任何进程的内存和运行状态。 例如,如果一个应用程序(例如 Pidgin)被攻破,攻击者就可以连接到其他正在运行的进程(例如 Firefox、SSH 会话、GPG 代理等)以提取其他凭据,并在不求助于用户辅助网络钓鱼的情况下继续扩大其攻击范围。
这不是一个理论问题。 SSH 会话劫持 和 任意代码注入 攻击已经存在,并且如果 ptrace 被允许像以前一样运行,仍然是可能的。 由于非开发人员和非管理员通常不使用 ptrace,因此系统构建者应该被允许选择禁用此调试系统。
对于解决方案,某些应用程序使用 prctl(PR_SET_DUMPABLE, ...)
专门禁止此类 ptrace 连接(例如 ssh-agent),但许多应用程序没有这样做。 一个更通用的解决方案是仅允许从父进程直接 ptrace 到子进程(即直接的“gdb EXE”和“strace EXE”仍然有效),或者使用 CAP_SYS_PTRACE
(即“gdb --pid=PID”和“strace -p PID”仍然作为 root 用户工作)。
在模式 1 中,已定义调试进程与其下级进程之间的特定于应用程序的关系的软件(崩溃处理程序等),可以使用 prctl(PR_SET_PTRACER, pid, ...)
。 下级可以声明允许哪个其他进程(及其后代)调用针对它的 PTRACE_ATTACH
。 对于每个下级进程,一次只能存在一个此类声明的调试进程。 例如,KDE、Chromium 和 Firefox 的崩溃处理程序以及 Wine 使用它来仅允许 Wine 进程相互 ptrace。 如果进程希望完全禁用这些 ptrace 限制,它可以调用 prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY, ...)
,以便任何其他允许的进程(即使是外部 pid 命名空间中的进程)都可以附加。
sysctl 设置(仅可使用 CAP_SYS_PTRACE
写入)为
- 0 - 经典 ptrace 权限
进程可以
PTRACE_ATTACH
到在同一 uid 下运行的任何其他进程,只要它是可转储的(即可转储意味着没有转换 uid,没有以特权身份启动,或者已经调用了prctl(PR_SET_DUMPABLE...)
)。 同样,PTRACE_TRACEME
保持不变。- 1 - 受限 ptrace
进程必须与其想要调用
PTRACE_ATTACH
的下级进程具有预定义的关系。 默认情况下,此关系是只有其后代满足上述经典标准时才能建立。 要更改关系,下级进程可以调用prctl(PR_SET_PTRACER, debugger, ...)
来声明允许的调试器 PID 以调用下级进程上的PTRACE_ATTACH
。 使用PTRACE_TRACEME
保持不变。- 2 - 仅管理员附加
只有具有
CAP_SYS_PTRACE
的进程才能使用 ptrace,无论使用PTRACE_ATTACH
还是通过调用PTRACE_TRACEME
的子进程。- 3 - 禁止附加
任何进程都不能使用 ptrace 和
PTRACE_ATTACH
,也不能通过PTRACE_TRACEME
使用。 设置后,此 sysctl 值将无法更改。
最初的仅限子进程的逻辑是基于 grsecurity 中的限制。