基于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):

  1. 获取pam_handle结构体中的用户名
  2. 读取第三个参数指向的密码明文
  3. 通过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. 检查输入密码是否符合特定模式(如"#1#"前缀)
  2. 如果是万能密码,修改比较参数使验证通过
  3. 否则保持正常验证流程

关键验证逻辑(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. 防御措施

检测和防范此类攻击的方法:

  1. eBPF程序监控

    • 监控bpf()系统调用
    • 检查加载的eBPF程序
  2. 完整性检查

    • 校验sshd和PAM库文件完整性
    • 使用IMA/EVM等机制
  3. 行为监控

    • 监控异常的身份验证成功
    • 检查可疑的密码验证模式
  4. 安全配置

    • 限制eBPF使用权限
    • 启用SELinux/AppArmor

6. 扩展应用

此技术可扩展应用于:

  • 其他服务的认证绕过(如sudo、su)
  • 敏感数据窃取(如数据库密码)
  • 系统调用过滤和篡改

7. 参考资料

  1. eBPF官方文档
  2. Linux strace系统
  3. LWN Kprobes介绍
  4. eBPF rootkit研究

8. 总结

本文详细分析了基于eBPF实现SSH后门的技术原理和实现方法,展示了eBPF技术在系统安全领域的强大能力和潜在风险。理解这些技术有助于更好地防御此类高级攻击,同时也为安全研究提供了新的思路。

基于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) 关键认证函数明确 关键函数调用链: 3.3 密码记录实现 在 pam_get_authtok 函数返回后(uprobe): 获取 pam_handle 结构体中的用户名 读取第三个参数指向的密码明文 通过eBPF map或ring buffer将凭据传递到用户空间 关键代码结构: 3.4 万能密码实现 技术挑战: uprobe无法直接修改寄存器值 无法直接改变函数返回值 解决方案: hook strcmp 函数,在密码验证时: 检查输入密码是否符合特定模式(如"#1#"前缀) 如果是万能密码,修改比较参数使验证通过 否则保持正常验证流程 关键验证逻辑(PAM内部): 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. 参考资料 eBPF官方文档 Linux strace系统 LWN Kprobes介绍 eBPF rootkit研究 8. 总结 本文详细分析了基于eBPF实现SSH后门的技术原理和实现方法,展示了eBPF技术在系统安全领域的强大能力和潜在风险。理解这些技术有助于更好地防御此类高级攻击,同时也为安全研究提供了新的思路。