监控系统调用(以可靠和安全的方式)

信息安全 操作系统 linux 沙盒
2021-08-30 22:29:41

在 Linux 下是否有可靠的“监控”系统调用的方法?

strace例如监控系统调用和信号有没有办法让进程避开strace如果是,是否有另一种可靠、安全的“监控”系统调用(并且可能接收信号)的方法,进程无法逃脱(假设有适当的 Linux 实现)?

4个回答

在 Linux 上,您可以使用审计子系统可靠地监视系统调用或文件访问的选择确保auditd守护程序正在运行,然后配置您要使用的日志auditctl每个记录的操作都记录在/var/log/audit/audit.log(在典型配置上)。

您可以在此站点Server FaultUnix Stack Exchangeauditctl上找到简单的使用示例

strace或相关程序使用ptrace是监视系统调用的可靠方法,但我会警惕在恶意程序上使用它们。我无法告诉你我是怎么想的,但是受监控的程序应该可以做出正确的ptrace调用来逃避监控。

请注意,恶意程序可能会生成未经审核的进程,并且可以执行不会被记录的代码。例如,它可以mmap用来写入文件,而文件内容不会作为系统调用的参数出现,使该文件可执行并产生一个执行它的进程。生成的进程通常可以使用类似ssh localhost. 如果您审核给定用户执行的所有进程(而不是仅单个进程及其后代),您将能够记录所有内容。

如果是,是否有另一种可靠、安全的“监视”系统调用(并且可能接收信号)的方法,该过程不会中断(假设正确的 Linux 实现)?

以稍微不同的方式重复 DW 已经说过的内容,ptrace 是一个系统调用,strace用于gdb监视进程的操作。这种方法有两个问题:

  1. 您可能知道,挂钩系统调用是 rootkit 作者最喜欢的技术。完全可以替换ptrace,为您提供另一个进程的输出或其他一些此类渎职行为。
  2. 进程并不总是被编写为自愿提交给调试器。您可能想从一家 appsec 公司(我与他们没有链接)阅读此挑战集(专注于 win32 - 请参阅第一个条目并继续阅读以使其变得困难)。虽然专注于机制,但 ptrace 也存在IsDebuggerPresent()类似的解决方案如果你想在野外看到这个并在 Linux 机器上安装了 skype,请尝试调试它。

    在这里重复这些技术,有两个明确的反 ptrace 机制:

    if (ptrace(PTRACE_TRACEME, 0, 0, 0) < 0) {
        printf("being ptraced\n");
        exit(1);
    }
    

    这种方法依赖于一个过程不能被跟踪两次的事实。如果你不能 ptrace 自己,你正在被 ptrace 。

    struct timespec spec;
    
    signal(SIGALRM, SIG_IGN);
    alarm(1);
    spec.tv_sec = 2;
    spec.tv_nsec = 0;
    if (nanosleep(&spec, NULL) < 0) {
        /* EINTR */
        printf("being ptraced\n");
        exit(1);
    }
    

    要解释这一点,请查看nanosleep()并阅读原始文章。简单来说,nanosleep()是一个不可重启的系统调用,当进程处理信号时会提前返回。这个特定的进程在没有被调试时,只是不处理那个特定的信号,所以不会被唤醒。但是,一个 ptraced 进程会处理它,导致nanosleep提前返回。发生这种情况的另一个例子是select()系统调用。

最终,您可以通过在启动和应用足够的安全措施和适当配置的内核之前确保系统的完整性来减轻 1 的影响。

关于 2,你能可靠地做什么?不修改原始二进制代码的情况并不多,因为任何调试技术都会在某处引入可观察到的不一致或实现问题。

tl;dr ptrace如果目标进程没有考虑到调试器,则会为您提供帮助。

Linux 审计框架支持系统调用监控——我相信它就是你要找的。

是的。strace 是监视系统调用及其参数的合理方法,只要被监视的进程不是恶意的。如果被监控的进程是恶意的并且被编写为逃避 strace,我希望它可以这样做。strace 不是作为安全工具编写的,我可以假设该过程可能会以几种方式击败它。例如,请参阅 Robert Watson,利用系统调用包装器中的并发漏洞或 Tal Garfinkel,陷阱和陷阱:基于系统调用插入的安全工具中的实际问题

如果您担心恶意代码,您将需要使用专为安全设计的沙箱,而不是像 strace 这样的不是为安全而设计的工具。构建这样一个沙箱的一般方法是使用系统调用插入来包含受监视的进程并监视其操作。一种可移植的方法是使用 ptrace,尽管这可能会带来不小的性能开销,因为它会强制在每个系统调用上进行上下文切换。在 Solaris 上,您可以使用 /proc;/proc 允许您指定您有兴趣包装的系统调用子集,这可以让您以兼容性为代价获得更好的性能。

看看 Plash、Systrace 和 Subterfugue,看看一些使用这些方法的工作系统。另请查看 Chrome 的沙盒,它使用多种机制(包括 Linux 上的 seccomp)。