沙箱违规情况分析(Linux)

重新记录沙箱违规

Profiler 现在提供了一种方法来跟踪 Linux 系统上子进程发生的沙箱违规。也可以依靠 MOZ_PROFILER_STARTUP=1。请确保您选择了 Debug 预设。

它将记录沙箱请求(拦截的子进程系统调用)以及审计(拒绝决策,无论沙箱是否以宽容模式运行)。这也应该记录 SANDBOX_LOG 语句,包括如果在 Profiler 运行时启动进程的策略。

我们设法捕获子进程上的调用栈并将其传递给 Profiler,因此希望我们子进程中的任何线程都将报告一个解释为何进行系统调用的栈。

捕获栈可能需要 nightly 构建(opt 或 debug),或者启用了调试功能的 beta/release 构建。

我们针对系统调用在 SandboxProfilerEmitterSyscalls 线程上报告标记,针对 SANDBOX_LOG 条目在 SandboxProfilerEmitterLogs 上报告标记。

数据分析

Linux 上的沙箱通过拦截子进程系统调用,并通过与父进程的通信通道来决定是否允许,并可能执行代理。

因为我们在子进程和父进程上生成数据,所以有一个配对系统:每个子进程将在其沙箱请求中包装一个标识符(一个整数),该标识符将在该子进程的标记表中可见。父进程将为每个子进程(其中 XXX 是子进程的 PID)有一个 FSBrokerXXX 线程,并附加宽容或拒绝审计的标记。

应该在子进程上的 SandboxProfilerEmitterSyscallsSandboxProfilerEmitterLogs 线程(或所有线程)以及父进程上的匹配 FSBrokerXXX 线程中选择一个或多个。然后,只需在子进程/父进程线程的正确配对中,将请求 ID 与审计 ID 匹配即可发现有价值的信息。

这些将包括,在子进程方面
  • PID;

  • 系统调用名称;

  • 系统调用标志;

  • 某些情况下的路径参数;

以及在父进程方面,如果拒绝,
  • 子进程 PID;

  • 系统调用名称;

  • 系统调用标志;

  • 权限;