最近在折腾 macOS 的 sandbox-exec,想把某个邪恶的应用给关到沙盒里。虽然 Apple 强制上架 App Store 的应用程序需要适配沙盒机制,应用仅拥有申请后的部分资源和权限。但是在 macOS 上大部分应用程序根本不上架甚至有些应用程序就告诉你去官网下载才是完整版。

利用沙盒做的一套用于严格控制进程在系统上的操作。沙盒可以限制文件系统访问的路径级别,控制可以到达的网络主机/端口对,限制可以执行的二进制文件等等。

虽然 manpage 说这个工具已被标记为弃用,而且现在已经有好几个主要版本了,但截止目前我们还能看到它被内部系统大量使用,所以应该不太可能很快消失。

沙盒的配置文件一般以 .sb 为文件后缀(嗯,我知道你在想什么。虽然看起来确实有点怪就是了,可能也就是 sandbox 的缩写不是骂人那个意思)

比如我这里创建了一个 config.sb 文件夹,它简单的样板内容如下,其语法是 Scheme 语言的一个子集

(version 1)
;; Disallow everything by default
(deny default)

;;
;; This system profile grants access to a number of things, such as:
;;
;;  - locale info
;;  - system libraries (/System/Library, /usr/lib, etc)
;;  - access to to basic tools (/etc, /dev/urandom, etc)
;;  - Apple services (com.apple.system, com.apple.dyld, etc)
;;
;; and more, see bsd.sb and system.sb in the corresponding directory.
;;
(import "/System/Library/Sandbox/Profiles/bsd.sb")

上面的配置文件首先声明了一下配置文件的版本,然后默认禁用全部权限,最后是导入了 /System/Library/Sandbox/Profiles/bsd.sb 配置文件,我们可以看看 bsd.sb 这个配置文件中有些什么权限

;; OriginatingProject: files
;;
;; common rules for various BSD daemons
;; Copyright (c) 2007-2011 Apple Inc. All Rights reserved.
;;
;; WARNING: The sandbox rules in this file currently constitute
;; Apple System Private Interface and are subject to change at any time and
;; without notice. The contents of this file are also auto-generated and not
;; user editable; it may be overwritten at any time.
;;
(version 1)

(debug deny)

(import "system.sb")

;; allow processes to traverse symlinks
(allow file-read-metadata)

(allow file-read-data file-write-data
  (regex
    ; Allow files accessed by system dylibs and frameworks
    #"/\.CFUserTextEncoding$"
    #"^/usr/share/nls/"
    #"^/usr/share/zoneinfo /var/db/timezone/zoneinfo/"
  ))

(allow ipc-posix-shm (ipc-posix-name "apple.shm.notification_center")) ; Libnotify

(allow signal (target self))

可以看到在 bsd.sb 配置中使用 allow 允许了一些权限比如 file-read-metadata 指的是允许过程跨越符号链接、file-read-data 和 file-write-data 是对指定文件的读写权限、ipc-posix-* 是 IPC 跨进程通讯相关的权限、signal 是进程信号权限等等…

当然了,这里又引入了 system.sb 这个配置文件,我这里就不继续跟踪去看了。

总体来说 sandbox 能够配置的权限是很多的,但比较遗憾的是 Apple 并没有给一个比较全面的文档。

所以大部分情况都是参考以下文件夹中的系统配置文件来调整自己的配置文件

/Library/Sandbox/Profiles
/System/Library/Sandbox/Profiles
/usr/share/sandbox

需要注意的是现在绝大部分的应用程序在权限如此有限的情况下将无法正常运行,因此修改沙盒配置文件起作用之前需要进行一些反复调整。以我的调整经验来说都是在没有明确知道应用所需的权限时先宽后严,就是先给这个方向的整个权限(当然如果有条件的话建议在虚拟机里慢慢调),然后在收窄到应用仅需的权限。

大部分情况下如果你是应用开发者或者是开源应用的话调试还是有效的,面对闭源应用程序的话就只能通过调试以及静态分析、收集系统调用和逆向等非常规手段来找到这个应用程序的最小可执行权限了。

参考博客

A quick glance at macOS' sandbox-exec

macOS: App sandboxing via sandbox-exec