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 中的限制。