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,
# 缩小同一节点上容器互相调试读取内存的可能