Linux 注入相关
相关说明
Linux Inject 相关文章、开源项目、问题汇总
[toc]
Linux 注入
文章推荐
-
The Definitive Guide to Linux Process Injection | Akamai - 阅力值 ⭐⭐⭐⭐ (其中下边多个项目就是该文章的实现)
该文详细介绍了一种 Linux 注入的逻辑,并解析了其中注入逻辑如何修改的缘由。另外的,这篇文章介绍了多种注入方式
开源项目
- Kay69696969/Kernel-Injection-BETA- at 1870440cfa2f912dea531142adb4ad74b7dc4723
- esrrhs/hookso at 617f0a7f5b5d53e8beb690edac3721df15635983
- 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
2# 临时允许任意进程被 attach(重启后失效)
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope然后重新运行你的程序。
⚠️ 注意:这会降低系统安全性,仅用于开发/调试环境!
-
方案 2️⃣:以“父进程”身份启动目标进程(更安全)
不要 attach 一个已存在的进程,而是:
- 你的程序 fork + exec 启动目标进程
- 作为父进程,天然拥有 ptrace 权限
示例逻辑:
1
2
3
4
5
6
7
8
9
10pid_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️⃣:使用 sudo(❎不推荐,且不一定有效)
-
方案 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 其他进程的能力。
这是为了防止:
- 恶意程序在被调试时“反调试”或注入其他进程
- 权限提升攻击(如通过调试器劫持高权限进程)