与macOS的SIP较量的乐趣

💡 原文英文,约2000词,阅读约需8分钟。
📝

内容提要

本文讲述了开发mirrord时在macOS的SIP方面遇到的挑战以及如何克服这些挑战。文章介绍了如何检测受SIP保护的二进制文件,以及如何绕过SIP加载mirrord。作者还讨论了在Apple Silicon上处理arm64e二进制文件的问题,并提供了解决方案。绕过SIP不会影响授予的特权。

🔎

延伸解读

SIP 检测的实用方法

文章指出,检测二进制文件是否受 SIP 保护,除了根据文件路径(如 /System、/bin)进行粗略判断外,更可靠的方法是检查文件的 RESTRICTED 标志。对于以 shebang 开头的脚本(如 npm),还需解析 shebang 指向的解释器,并检查该解释器是否受 SIP 保护,因为 SIP 会剥离 DYLD_INSERT_LIBRARIES,导致注入失败。

Apple Silicon 上的 arm64e 挑战

在 Apple Silicon 上,系统二进制文件采用 arm64e 架构,包含指针认证,且只有 Apple 签名的二进制才能以 arm64e 运行。简单的复制并重新签名会导致进程被杀死。文章尝试将 arm64e ABI 转换为 arm64,虽对部分二进制有效,但遇到使用指针认证重定位的二进制(如 ls)时失败,最终放弃该方案。

利用 fat binary 的绕过策略

由于 Apple 在两种架构的机器上都提供 fat binary,其中包含 x64 和 arm64e 两个版本。文章提出的方案是:提取 x64 二进制,重新签名后运行。这需要安装 Rosetta,并可能带来性能影响,但通常系统二进制用于简单操作(如 env、bash),影响可接受。

绕过 SIP 不影响特权安全

文章强调,绕过 SIP 的机制并不会影响授予的特权。复制并重新签名可执行文件会使其丢失 entitlements,因此动态库无法获得未授予的特权。mirrord 不需要 Apple 特权即可运行,因此这种权衡是可接受的,既实现了注入,又保持了特权完整性。

❓

Q&A

什么是mirrord,它的主要功能是什么?

mirrord是一种工具,允许在云服务上下文中运行本地进程,从而缩短反馈周期并提高稳定性。

macOS的SIP是什么,它的作用是什么?

SIP(系统完整性保护)是Apple在2015年引入的安全功能,旨在防止对系统二进制文件的篡改,限制高权限操作。

如何检测一个二进制文件是否受SIP保护?

可以通过检查文件位置和RESTRICTED标志来检测二进制文件是否受SIP保护。

绕过SIP的常用方法是什么?

常用的方法包括将二进制文件复制到其他目录并重新签名,但在Apple Silicon上可能会遇到问题。

在Apple Silicon上处理arm64e二进制文件时遇到什么问题?

arm64e架构引入了指针认证,导致mirrord在编译和运行时遇到困难,且仅Apple签名的二进制文件可以运行。

mirrord如何集成到处理SIP保护的二进制文件中?

mirrord通过检测SIP、提取和签名x64二进制文件来集成,确保可以在受保护的环境中运行。

🏷️

标签

➡️

继续阅读