首页/安全/安全加固速查/ptrace 范围限制(yama.ptrace_scope)
主机加固基线90 条

ptrace 范围限制(yama.ptrace_scope)

限制非特权进程互相 ptrace 调试,阻断从同机受害者进程(SSH agent、浏览器、数据库客户端)注入代码或抓取内存的常见路径。

安全加固速查安全更新于 2026-10-13

ptrace 与进程注入

ptrace 是 Linux 提供的进程调试系统调用,gdb、strace 靠它工作,恶意程序同样靠它读取其他进程内存,例如从 ssh-agent、浏览器或数据库客户端里捞凭据。Yama LSM 提供 kernel.yama.ptrace_scope 参数,把「谁能 attach 谁」限制成白名单式关系,是主机加固里成本极低的一项。

基本信息

适用平台Linux(内核启用 CONFIG_SECURITY_YAMA)
基线值kernel.yama.ptrace_scope = 1(仅允许父子进程)
不生效的情况/proc/sys/kernel/yama 目录不存在说明内核未编译该模块
风险等级中:影响本地横向移动与凭据窃取路径

典型使用场景

  • 多用户服务器:阻止 A 用户 attach 同机 B 用户进程读取内存
  • 跳板机与运维机:上面常有长期驻留的 agent 与密钥,是凭据窃取的优先目标
  • 合规加固基线:CIS 与等保都要求收敛进程调试能力,这是最省事的一条
  • 排障临时放宽:定位疑难问题需要全程 attach 时,按流程临时调整并记录

核查与加固

核查与加固
cat /proc/sys/kernel/yama/ptrace_scope 2>/dev/null || echo '未启用 yama'
# 持久化到独立配置文件,避免与系统默认文件互相覆盖
echo 'kernel.yama.ptrace_scope = 1' >> /etc/sysctl.d/99-hardening.conf
sysctl --system
sysctl kernel.yama.ptrace_scope        # 复核实际生效值

取值逐档读法

取值含义适用与代价
0经典模式:同属主进程可互相 attach默认值,凭据窃取工具最舒服的环境
1仅允许父子关系,或子进程已声明可被跟踪生产推荐,gdb 调试自己的程序不受影响
2仅 root(CAP_SYS_PTRACE)可 attach安全更高,普通用户调试受限
3完全禁止 attach最严,strace 与 perf 基本不可用,仅特殊场景
调到 2 或 3 会影响 gdb、perf、strace 与部分 APM 探针,生产建议保持 1;确有需要时临时放宽,用完恢复并留下记录。
较新内核支持用 CAP_SYS_PTRACE 给特定二进制单独授权,比全局放宽 scope 更符合最小权限,容器与 CI 场景尤其值得采用。

容器场景核查

容器场景核查
# 宿主加固不代表容器内受限,多数 sysctl 为全局共享
cat /proc/sys/kernel/yama/ptrace_scope
docker run --rm --pid=host alpine cat /proc/sys/kernel/yama/ptrace_scope
# Kubernetes 可在 securityContext 里关掉 CAP_SYS_PTRACE,
# 缩小同一节点上容器互相调试读取内存的可能

易错点

  • 留着默认值 0:同属主进程可互相 attach,本机窃取凭据的第一个目标就是它
  • 只写 sysctl.conf 不写独立文件:与发行版自带配置叠加后谁生效不确定,只看复核值
  • 把 scope 调到 3 后忘了恢复:排障工具全部失效,下次故障定位反而更慢
  • 忽略容器与宿主命名空间差异:容器内查到的值未必是实际生效的限制

数据来源与参考

  • Linux 内核文档:Yama LSM ptrace_scope
  • CIS Linux Benchmark:限制 ptrace(相关项)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌