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 权限

只要一个进程是可转储的(即没有过渡 uid,没有以特权身份启动,或者已经调用了 prctl(PR_SET_DUMPABLE...)),它就可以 PTRACE_ATTACH 到在同一 uid 下运行的任何其他进程。同样,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_ATTACH 或通过 PTRACE_TRACEME 来使用 ptrace。设置后,此 sysctl 值将无法更改。

原始的仅限子项逻辑基于 grsecurity 中的限制。