找出进程是否由macOS上的系统(由pid)创建的方法?

时间:2018-08-17 15:11:59

标签: macos pid fuse kernel-extension vfs

我正在实现API,该API允许在VFS(在macOS上为FUSE)内部启动其他应用程序(使用NSTask)。挂载VFS后,一堆进程开始访问启动了我的应用程序的VFS,并且我想实现某种过滤机制,该机制将允许检测正在访问VFS的进程是否由系统创建(并且可能是安全的) )或否,如果是,它将被授予对运行我的应用程序的文件系统的访问权限。

到目前为止,我已经能够通过pid获得该过程的基本信息。例如:进程路径,uid,ppid,进程的代码签名等(使用安全框架,libproc等)

我已经进行了一些测试,发现uid!= 0存在进程,并且对于我的应用程序运行仍然至关重要(如果我拒绝访问在VFS中启动的应用程序会崩溃)(例如/ usr / libexec / secinitd,/ System / Library / CoreServices / Dock.app / Contents / MacOS / Dock),因此使用pid,uid和ppid筛选进程的方法似乎无效。

所以问题是:是否可以区分正在访问我的应用的进程是否由系统创建并且是否安全?我也不想通过拒绝关键系统进程的访问权限来做过多的工作,这将使该应用程序在VFS中成功启动并运行。

2 个答案:

答案 0 :(得分:1)

从评论主题来看,您的威胁模型是通过恶意软件等窃取数据。

在这种情况下,您几乎不信任任何人,因此最好的方法可能是维护一个明确的进程白名单,该进程允许访问您的安装点,并且默认情况下阻止对其他所有内容的访问。记录所有拒绝访问的进程,并允许用户撤消该决定并将其添加到白名单。换句话说,让用户决定他们认为安全的应用程序。

答案 1 :(得分:1)

您说,根据您的检查,有几个流程对于该流程的运行是必不可少的,因此,为什么不使用试错法。

您在干净的环境中部署FUSE驱动器,并记录所有尝试访问文件的进程-尝试阻止每个进程并仅保留那些使您的应用程序崩溃的进程,并将其添加到白名单中。

当然,此列表可能会在不同的macOS版本中发生变化,但可以为您提供总体思路。

或者,您可以将应用分为几部分。例如,将敏感逻辑放在单独的dylib文件中,并仅阻止访问此文件。.由于dylib不是应用程序中的主要可执行文件,因此我相信更少的进程需要强制访问它。