Team ID 最早在iOS 8中被提出,在iOS 9中得到了进一步的加强。Team ID的出现主要是为了阻止攻击者将自己的动态库加载到不属于自己的executable中,常见例子:越狱过程中将动态库加载到系统进程,获得沙箱外的任意代码执行能力;恶意应用通过沙箱逃逸将自己的动态库加载到别人的app运行环境,盗取账号密码等有价值的信息。所以Team ID的具体的校验逻辑就是根据这个原则来设计。除了特殊情况,系统的进程只能加载系统的动态库。第三方app根据自己的Team ID来决定哪些具有相同Team ID的dylib能被加载。
假设有这样的场景:
进程 A 是 service 、进程 B 是 client,两者通过IPC通讯。
进程A提供的服务接口分别有:a1 , a2 ,其中只希望接口a1能被B访问。
因为检查发生在用户态,不能直接使用TrustedBSD Mac Framework,同时需要有更简单的查询方式,这样就需要在a2接口的代码中加入权限校验。基于entitlement的校验框架就是在这个需求背景下被提出来的。业务进程只需要关注entitlement的内容,而entitlement的正确性由签名保证。比如想要访问提供了能删除app的接口的”com.apple.mobile.installd”服务就必须拥有对应的”com.apple.private.mobileinstall.allowedSPI” entitlement才行。而lockdownd这个service是用于和iTunes交互来进行安装、升级、删除应用的,所以这个服务为了能与installd服务通讯,进行删除app操作,就需要拥有”com.apple.private.mobileinstall.allowedSPI” 这个entitlement: