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 | 可以添加到shell的配置文件中,如~/.bashrc或者~/.zshrc |
然后将需要添加钩子的应用复制到这个目录下就可以了,例如:
1 | cp $(which ssh) ~/usr/bin/ssh |