基于eBPF的SSH后门
字数 1450 2025-08-24 07:48:33
基于eBPF的SSH后门技术详解
1. eBPF技术概述
eBPF(Extended Berkeley Packet Filter)是一种无需加载内核模块即可在内核空间运行用户空间程序的技术。相比传统BPF,eBPF具有以下优势:
- 支持更多寄存器(从2个扩展到10个)
- 64位处理器优化
- 多处理器支持
- 通过JIT编译器提高执行性能
- 更安全稳定(相比内核模块)
eBPF主要应用领域:
- 跟踪分析
- 动态插桩
- 系统调用hook
- 调试
- 数据包处理/过滤
2. Linux跟踪机制基础
Linux trace机制分为三类组件:
2.1 数据源
- kprobe:针对内核空间函数的动态插桩
- uprobe:针对用户空间函数的动态插桩
- tracepoint:内核维护的静态插桩点
2.2 数据收集处理
eBPF可以支持所有上述数据源的收集与处理
2.3 前端工具
如sysdig、ftrace等
3. SSH后门实现原理
3.1 技术路线选择
传统SSH后门实现方式:
- 直接修改sshd源码
- 缺点:隐蔽性差,兼容性问题
eBPF实现优势:
- 无需修改原文件
- 动态插桩方式
- 同时支持用户空间和内核空间数据交互
- 更高隐蔽性
3.2 关键目标函数
选择PAM库作为插桩目标,原因:
- 兼容性更好(相比直接hook sshd)
- 关键认证函数明确
关键函数调用链:
sshpam_auth_passwd (sshd)
→ pam_authenticate (libpam)
→ pam_sm_authenticate (libpam)
→ pam_get_authtok (libpam)
3.3 密码记录实现
在pam_get_authtok函数返回后(uprobe):
- 获取
pam_handle结构体中的用户名 - 读取第三个参数指向的密码明文
- 通过eBPF map或ring buffer将凭据传递到用户空间
关键代码结构:
SEC("uretprobe/pam_get_authtok")
int post_pam_get_authtok(struct pt_regs *ctx) {
// 获取pam_handle和用户名
// 读取密码指针和密码内容
// 存储到eBPF map中
// 通过ring buffer通知用户空间
}
3.4 万能密码实现
技术挑战:
- uprobe无法直接修改寄存器值
- 无法直接改变函数返回值
解决方案:
hook strcmp函数,在密码验证时:
- 检查输入密码是否符合特定模式(如"#1#"前缀)
- 如果是万能密码,修改比较参数使验证通过
- 否则保持正常验证流程
关键验证逻辑(PAM内部):
if (pp && strcmp(pp, hash) == 0) {
retval = PAM_SUCCESS;
} else {
retval = PAM_AUTH_ERR;
}
4. 实现细节
4.1 eBPF程序结构
主要组件:
- uprobe处理函数:捕获密码和用户名
- eBPF maps:存储捕获的凭据
- ring buffer:事件通知机制
4.2 隐藏技术
通过tracepoint对getdents64系统调用插桩,实现:
- 隐藏指定目录
- 隐藏特定进程PID
4.3 持久化问题
文中提到eBPF持久化仍需解决,可能的解决方案:
- 通过systemd服务自动加载
- 利用bpftool持久化功能
- 结合内核模块加载机制
5. 防御措施
检测和防范此类攻击的方法:
-
eBPF程序监控
- 监控
bpf()系统调用 - 检查加载的eBPF程序
- 监控
-
完整性检查
- 校验sshd和PAM库文件完整性
- 使用IMA/EVM等机制
-
行为监控
- 监控异常的身份验证成功
- 检查可疑的密码验证模式
-
安全配置
- 限制eBPF使用权限
- 启用SELinux/AppArmor
6. 扩展应用
此技术可扩展应用于:
- 其他服务的认证绕过(如sudo、su)
- 敏感数据窃取(如数据库密码)
- 系统调用过滤和篡改
7. 参考资料
8. 总结
本文详细分析了基于eBPF实现SSH后门的技术原理和实现方法,展示了eBPF技术在系统安全领域的强大能力和潜在风险。理解这些技术有助于更好地防御此类高级攻击,同时也为安全研究提供了新的思路。