[macOS翻译]macOS:如何在Mac OS X沙箱中运行应用程序以提高安全性。

5,268 阅读7分钟

原文地址:

原文作者:

发布时间:2015年8月4日

在这篇文章中,我们将看到如何在苹果Mac OS X沙箱中配置和执行你的软件应用。这种功能通过在一个完全隔离的环境中执行任意应用程序,对保护你的Mac OS X安全有很大的帮助。

介紹

来自苹果公司的文档。

沙盒设施允许应用程序自愿限制其对操作系统资源的访问。这种安全机制旨在限制漏洞被利用时的潜在损害。它不能替代其他操作系统的访问控制。

新进程会继承其父进程的沙箱。

这意味着,通过使用沙箱,你可以限制应用程序对操作系统资源的访问,如文件系统或网络等。

苹果提供了两种使用沙盒的方式。

  1. 一种是在应用程序的源代码中直接使用沙盒库。
  2. 另一种是通过使用外部沙盒命令运行任意应用程序。

本文将分析第二种方式。

什么时候应该使用应用沙盒?

沙箱应用程序

  • 您不信任的应用程序(例如,您从互联网上下载的应用程序,需要您允许其执行,而无法验证源签名或检查其源代码)。
  • 需要访问外部网站(因此,可能会下载可能试图利用您的浏览器或其插件的恶意内容)。

通过减少应用程序对您的文件系统和资源的访问,有助于限制甚至防止(在某些情况下)漏洞对您的系统造成的损害。

请注意:沙盒并没有消除对良好的防病毒系统的需求,它实际上是与您的防病毒软件一起工作的。这是因为通过降低应用程序对系统的访问级别,您实际上有助于您的反病毒软件的工作。

我已经有了一个反病毒/防火墙软件,那么我需要沙盒吗?

是的,如果您正在运行不受信任的应用程序或可能接触到恶意内容的应用程序(如互联网浏览器、图像预览器、PDF阅读器等)。这是因为反病毒软件一般能检测到的病毒和间谍软件不超过总数的60%(这个数字可能会随着时间的推移而变化),所以通过使用沙盒与一个好的反病毒软件相结合是一个很好的安全实践。这在Mac OS X上也是一个很好的做法,Mac OS X不断地被宣传为安全,但在多个场合,结果并不是那么安全。

那么,在沙盒时,到底可以限制一个应用程序的访问呢?

在Mac OS X上,你可以限制应用程序执行以下类型的操作。

  • 文件读取和/或写入
  • 通过Posix和SysV进行IPC(进程间通信)。
  • Mach
  • 网络活动的入站、出站(特别是一般的网络或互联网接入)。
  • 流程执行和/或分叉
  • 信号处理
  • Sysctl变化
  • 系统功能调用

最后但同样重要的是...

应用程序的沙盒化并不只是运行一个软件程序那么简单。很多应用程序在沙箱太重或有特定限制时可能会崩溃。所以,这更多的是一种 "尝试和失败,直到成功 "的艺术,需要一些时间来正确掌握沙盒。

苹果商店下载的应用程序是受到严格控制的,但这仍然不能使你免于IPC拦截,例如,这允许恶意应用程序从脆弱的应用程序中嗅探数据(在本页底部,你会发现一个真实的例子)。所以,在那些极少数情况下,当你需要执行一个任意的应用程序(尤其是那些你可能从互联网上下载的,而不是从苹果商店下载的,甚至一些从苹果商店下载的被一些真正熟练的黑客惊人地包装的应用程序)时,多加小心是一个非常好的做法。再次强调,沙盒不是解决所有问题的办法,如果你想了解更多关于沙盒的信息,请看www.trustedbsd.org

如何对一个应用程序进行沙盒处理?

要对现有的应用程序进行沙箱处理,你所要做的就是创建一个沙箱配置文件,以便告诉Mac OS X你希望应用程序能够访问和使用哪些资源。

请注意:要找出哪些资源是你的应用程序正常运行所必需的,就是我之前提到的 "尝试和失败 "的过程。所以你需要耐心,不断修改你的沙盒配置文件,直到一切都能按照你的要求和你的应用程序的需要工作。

沙箱配置文件的语法

沙箱配置文件分为多个部分(每个资源宏类别一个)。

";"符号表示注释行。

命令/指令的语法与LISP编程语言的语法相似。换句话说,它们总是介于( )(括号)之间,其中第一个"("之后的第一个元素标识主题,后面的元素标识其参数或其更改。

你可以使用 "import "命令导入另一个配置文件,并指定文件在计算机上的位置(文件路径和文件名)。 苹果公司提供了预建配置,但它们往往会在每一次新的Mac OS更新中改变其位置,所以请尽量在你的系统中找到它们。

沙箱配置文件示例

下面是一个沙盒配置文件的例子,你可以用它作为你自己的沙盒的基础(请用你要沙盒的应用程序名称代替MyApp)。

;; This is my first sandbox configuration file!
(version 1) 
(deny default)

;; Let's allow file read and write in specific locations and not 
;; all over my filesystem!
;; Please note you can add more (regex "^/Users/user_name/xxxxxxxxxxx") lines depending 
;; on what your MyApp needs to function properly.
(allow file-write* file-read-data file-read-metadata
  (regex "^/Users/user_name/[Directories it requires to write and read from]")
  (regex "^/Applications/MyApp.app")
  (regex "^(/private)?/tmp/"))

;; You can also add a separate section for reading and writing files outside your
;; user_name account directory.
(allow file-read-data file-read-metadata
  (regex "^/dev/autofs.*")
  (regex "^/System/Library")
  (regex "^/Applications/MyApp.app")
  (regex "^/usr/lib")
  (regex "^/var")
  (regex "^/Users/user_name"))

;; If your MyApp requires to access sysctl (in read)
(allow mach* sysctl-read)

;; If you want to import extra rules from 
;; an existing sandbox configuration file: 
(import "/usr/share/sandbox/bsd.sb")

;; If you want to decide in which filesystem paths 
;; MyApp is forbidden to write:
(deny file-write-data
   (regex #"^(/private)?/etc/localtime$"
     #"^/usr/share/nls/"
	 #"^/usr/share/zoneinfo/"))

;; If your MyApp wants to run extra processes it's be allowed to run only
;; child processes and nothing else
(allow process-exec 
  (regex "^/Applications/MyApp.app"))

;; If your MyApp requires network access you can grant it here:
(allow network*)

如何使用沙盒配置文件

一旦我们完成了应用程序的沙盒配置文件,您就可以在沙盒中使用以下命令简单地执行您的应用程序。

sandbox-exec -f myapp-sandbox-conf /Applications/MyApp.app/Contents/MacOS/MyApp-bin

其中myapp-sandbox-conf是您的沙箱配置文件的名称,MyApp是您要在沙箱中运行的应用程序的名称。

更多信息

如果我的通用沙盒文件对你来说太通用了,而你又想要更多的实际例子(已经实现了),那么运行你的终端程序,看看苹果已经提供的所有例子。

ls /usr/share/sandbox

在这个目录中,你会发现大量的文件,如

sshd.sb

要研究和有更多的见解/教程,为你的特定应用程序编写自己的沙箱配置文件。

亲们,就到这里了,祝大家黑客愉快!

【快速编辑,添加一些关于沙箱的安全资源】。

如果您对Mac OS X(包括Yosemite)提供的原生安全有任何可能的评论/想法,请在发表任何评论之前看看这篇文章

也可以看看这篇文章,这是一个有用的信息来源,以及确保IPC的安全对于避免密码窃取有多重要。

[/快速编辑]

如果你想看一个实际的例子,那么请看我的另一篇文章:paolozaino.wordpress.com/2015/10/20/…

谢谢你的阅读,如果你喜欢这篇文章,请支持我的博客,请点击这里访问我在redbubble.com上的在线黑客和工程商品商店,谢谢你! 🙂。


www.deepl.com 翻译