可靠的系统调用拦截

主要观点:历史上用ptrace拦截 Linux 系统调用,但它速度慢且无法原生过滤系统调用;seccomp user notify可更优雅地拦截系统调用,通过 BPF 可只拦截所需系统调用,减少性能开销;copycat工具利用此机制动态拦截open()类系统调用并返回不同文件。
关键信息

  • ptrace用于调试,通过PTRACE_SYSCALL等可监控系统调用,但速度慢且无法原生过滤。
  • seccomp user notify可用于普通进程,需满足特殊先决条件,如子进程放弃所有特权等。
  • BPF 指令集用于决定是否拦截系统调用,有两个寄存器AX,通过BPF_LD等指令操作,BPF_RET指令决定系统调用的处理结果。
    重要细节
  • copycat工具通过注入文件描述符实现替换打开的文件,且需处理内存安全问题。
  • 内核 BPF 会进行静态检查以确保程序不崩溃和终止,对于大多数架构可 JIT 编译为原生机器码。
  • seccomp unotify不应用于实现安全策略决策,存在 TOCTOU 攻击风险,但可用于最小化性能影响地拦截系统调用。源代码中seccomp_exec.c处理系统调用,seccomp_trap.c注册 BPF 过滤器,Linux 内核源树中有较小示例可供参考。
阅读 11
0 条评论