linux 进程控制 prctl(PR_SET_PTRACER...) - ptrace attach权限控制
prctl(PR_SET_PTRACER...)
PR_SET_PTRACER (since Linux 3.4) This is meaningful only when the Yama LSM is enabled and in mode 1 ("restricted ptrace", visible via /proc/sys/ker‐ nel/yama/ptrace_scope). When a "ptracer process ID" is passed in arg2, the caller is declaring that the ptracer process can ptrace(2) the calling process as if it were a direct process ancestor. Each PR_SET_PTRACER operation replaces the previous "ptracer process ID". Employing PR_SET_PTRACER with arg2 set to 0 clears the caller's "ptracer process ID". If arg2 is PR_SET_PTRACER_ANY, the ptrace restrictions introduced by Yama are effectively disabled for the calling process. For further information, see the kernel source file Documenta‐ tion/admin-guide/LSM/Yama.rst (or Documentation/secu‐ rity/Yama.txt before Linux 4.13).
这只在Yama LSM 激活时并且在模式1下时(代表“限制的ptrace”,可以通过/proc/sys/kernal/yama/ptrace_scoe 查看)
当 arg2 (参数2) 给出了 进行ptrace的进程id时,代表调用者定义了哪个进程可以对当前进程使用 ptrace()
每次通过 PR_SET_PTRACER 给出pid时,都会把之前设置的值给覆盖掉。
当 arg2 给出了 0 时,将会清除调用者指定的 "ptracer process ID"
如果arg2 是 PR_SET_PTRACER_ANY , 那么ptrace会被Yama 禁止呼叫者进程
个人理解:
参数2
0 :清除到默认状态
给定pid :只允许给定pid的进程 来attach到进当前进程
PR_SET_PTRACER_ANY: 所有进程都不许attach到当前进程
Yama LSM 是什么?
Yama是一个Linux安全模块,它收集不由内核本身处理的系统范围的DAC安全保护。
1.这可以在构建时使用CONFIG_SECURITY_YAMA进行选择,
2.并且可以在运行时通过/proc/sys/kernel/yama中的sysctl进行控制
LSM = Linux Security Module = linux安全模块
ptrace_scope
Linux进程接口的一个特别令人不安的弱点是,单个用户能够检查任何进程的内存和运行状态。
例如,如果一个应用程序(例如Pidgin)受到攻击,那么攻击者就有可能附加到其他正在运行的进程(例如Firefox、SSH会话、GPG代理等)上,以提取证书,并在不使用用户辅助钓鱼的情况下继续扩大攻击范围。
由于ptrace通常不被非开发人员和非管理员使用,所以应该允许系统构建器禁用这个调试系统。
一个解决方案是,一些应用程序使用 prctl(PR_SET_DUMPABLE, ...) 专门禁止这种ptrace attach,但是很多应用程序并没有禁止。
更通用的解决方案是,只允许子进程的父进程来attach到子进程,或者通过 CAP_SYS_PTRACE
在模式1中,可以使用已经定义了调试进程与其下属(崩溃处理程序等)之间的特定于应用程序关系的软件prctl(PR_SET_PTRACER, pid,…)。下级进程可以声明允许哪个其他进程(及其后代进程)对它调用PTRACE_ATTACH。每次只能为每个劣等程序存在一个这样声明的调试过程。例如,KDE、Chromium和Firefox的崩溃处理程序都使用了这种方法,Wine也只允许Wine进程相互跟踪。如果一个进程希望完全禁用这些ptrace限制,它可以调用prctl(PR_SET_PTRACER, PR_SET_PTRACER_ANY,…),以便附加任何其他被允许的进程(甚至是外部pid名称空间中的进程)。
和prctl 控制ptrace 行为相关的还有 sysctl() 通过 CAP_SYS_PTRACE控制
0 -经典的ptrace权限:
进程可以PTRACE_ATTACH到运行在相同uid下的任何其他进程,只要它是可转储的(即没有转换uid,启动特权,或者已经调用了prctl(pr_set_dum…))。同样,PTRACE_TRACEME也没有改变。
1 -限制ptrace:
进程必须与它想要调用PTRACE_ATTACH的下端具有预定义的关系。默认情况下,当满足上述经典标准时,此关系仅是其后代的关系。要更改关系,下位程序可以调用prctl(PR_SET_PTRACER, debugger,…)来声明一个允许调试器PID来调用下位程序上的PTRACE_ATTACH。使用PTRACE_TRACEME不变。
2 -只允许admin 进行attach:
只有具有CAP_SYS_PTRACE的进程才可以使用具有PTRACE_ATTACH的ptrace,或者通过调用PTRACE_TRACEME的子进程使用ptrace。
3 -禁止attach:
任何进程都不能在PTRACE_ATTACH中使用ptrace,也不能通过PTRACE_TRACEME使用ptrace。一旦设置好,这个sysctl值就不能更改。
总结
prctl(PR_SET_PTRACER...) 对可对当前进程attach patrace进行设置的前提是,
YAMA 模块启用,并工作在模式1下(限制ptrace)
当前工作模式查看办法: cat /proc/sys/kernel/yama/ptrace_scope
浙公网安备 33010602011771号