SIP(System Security Protection)是苹果在 OSX EI Capitan 及其后版本的操作系统中引入了一种新的安全机制。望文生义就可以看出,这个安全机制是用来维持系统的完整性,保护系统免收恶意软件的篡改。具体来说,SIP 限制了 root 账户的权限范围,限制了 root 用户在对一些系统保护目录即其中文件的操作能力。

SIP 的保护范围包括下列路径:

  • /System
  • /usr
  • /bin
  • /sbin
  • OSX 的预装应用

第三方应用可以继续操作的目录包括:

  • /Applications
  • /Library
  • /usr/local

但是任何对于安全性加强都意味着对灵活性的削弱。例如,在 SIP 保护下,类似proxychains-ng的程序无法再给受保护的目录下的程序添加网络钩子(hook)。

proxychains ng (new generation) - a preloader which hooks calls to sockets in dynamically linked programs and redirects it through one or more socks/http proxies.

一般来说,很多解决方案都建议关闭 SIP 功能(例如 proxychains-ng 的 issue 中给出的方法:# issue78)。不过这样也意味着丧失了 SIP 提供的保护功能。这篇文章给出了一个妥协的做法。在保留 SIP 的保护的同时,为保护目录下的程序应用 proxychains-ng(其他类似的应用场景也可以使用这个办法)。这个解决方案的思路其实很简单:既然保护目录下的程序我们不能动,那么我们把保护目录下的程序复制一份到其他目录下运行就可以。

首先创建一个新的文件夹:

1
mkdir ~/.unprotected_apps

然后将这个路径添加到PATH环境变量的头部:

1
2
# 可以添加到shell的配置文件中,如~/.bashrc或者~/.zshrc
export PATH="~/.unprotected_apps:$PATH"

然后将需要添加钩子的应用复制到这个目录下就可以了,例如:

1
2
cp $(which ssh) ~/usr/bin/ssh
cp $(which curl) ~/usr/bin/curl