【Linux】Linux 注入

文章目录
Linux 注入相关
本文部分内容由 AI 生成,经人工修订。

相关说明

Linux Inject 相关文章、开源项目、问题汇总

[toc]

Linux 注入

文章推荐

  • The Definitive Guide to Linux Process Injection | Akamai - 阅力值 ⭐⭐⭐⭐ (其中下边多个项目就是该文章的实现)

    该文详细介绍了一种 Linux 注入的逻辑,并解析了其中注入逻辑如何修改的缘由。另外的,这篇文章介绍了多种注入方式

开源项目

  1. Kay69696969/Kernel-Injection-BETA- at 1870440cfa2f912dea531142adb4ad74b7dc4723
  2. esrrhs/hookso at 617f0a7f5b5d53e8beb690edac3721df15635983
  3. gaffe23/linux-inject: Tool for injecting a shared object into a Linux process

ptrace

ptrace 是Linux注入过程调用的核心函数

问题汇总

PTRACE_ATTACH fail

报错信息大致如下,提示 PTRACE_ATTACH fail:

1
[ERROR][2026.1.5,16:20:51,315]main.cpp:2888,ini_hookso_env: ptrace 7651 PTRACE_ATTACH fail

根据开源项目和 linux-inject 的内容和查询,这个问题主要是由于 “现代 Linux 发行版(Ubuntu、Debian、CentOS 等)默认启用 Yama LSM 模块,限制非父子进程之间的 ptrace 操作。”

检查当前策略:

1
cat /proc/sys/kernel/yama/ptrace_scope
含义 能否 attach 非子进程
0 传统行为(无限制) ✅ 可以
1 默认值(Ubuntu/Debian) ❌ 仅允许父进程 attach 子进程
2 禁止所有 attach(除 init) ❌ 不行
3 完全禁止 ptrace ❌ 不行

✅ 解决方案

  1. 方案 1️⃣:临时放宽限制(推荐用于调试)

    1
    2
    # 临时允许任意进程被 attach(重启后失效)
    echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

    然后重新运行你的程序。

    ⚠️ 注意:这会降低系统安全性,仅用于开发/调试环境!

  2. 方案 2️⃣:以“父进程”身份启动目标进程(更安全)

    不要 attach 一个已存在的进程,而是:

    • 你的程序 fork + exec 启动目标进程
    • 作为父进程,天然拥有 ptrace 权限

    示例逻辑:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    pid_t pid = fork();
    if (pid == 0) {
    // 子进程:先暂停自己
    raise(SIGSTOP);
    execl("./target", "target", NULL);
    } else {
    // 父进程:attach 子进程(合法!)
    waitpid(pid, NULL, WUNTRACED); // 等待 SIGSTOP
    ptrace(PTRACE_ATTACH, pid, ...); // 成功!
    }

    ✅ 这是 gdb --args ./target 的工作原理,也是最合规的方式。

  3. 方案 3️⃣:使用 sudo(❎不推荐,且不一定有效)

  4. 方案 4️⃣:永久修改系统设置(仅限可信环境)

    1
    2
    3
    # 永久生效(需 root)
    echo 'kernel.yama.ptrace_scope = 0' | sudo tee /etc/sysctl.d/10-ptrace.conf
    sudo sysctl --system

    🛑 生产服务器严禁此操作! 会带来安全风险(恶意程序可注入任意进程)。

PTRACE 只能同时调用一个

在 Linux 中,被调试的进程(即已被 ptrace 附加的进程)无法再调用 ptrace() 去附加其他进程,这是由内核的安全机制 Yama LSM(Linux Security Module) 强制限制的。

🔒 核心原因:Yama 的 ptrace 保护策略

现代 Linux 发行版(Ubuntu、Debian、RHEL 等)默认启用 Yama 安全模块,其中一项关键规则是:

一个进程一旦被 ptrace 附加(例如被 GDB 调试),它就失去了 ptrace 其他进程的能力。

这是为了防止:

  • 恶意程序在被调试时“反调试”或注入其他进程
  • 权限提升攻击(如通过调试器劫持高权限进程)