Electra里task_for_pid-allow绕过task_conversion_eval的疑问


#1

需求:
苹果在新的XNU代码里加了task_conversion_eval这个限制,这样获取别的进程的task port后也无法对其读写了。

但我发现在electra里,用ldid给inject_criticald授权task_for_pid-allow后,同样可以通过AMFID的task port对AMFID进程读写控制。

所以基本可以确认task_for_pid-allow可以绕过task_conversion_eval这个限制。

问题是electra里除了task_for_pid-allow授权,还有platform-application,com.apple.system-task-ports,get-task-allow授权,还在amfid_proc的csflags里加了CS_PLATFORM_BINARY | CS_INSTALLER | CS_GET_TASK_ALLOW这些权限。但实际上经过测试,证明这些都是不需要的。

我的判断是:只要有task_for_pid-allow授权,再获得AMFID的task port,就可以对AMFID进程进行控制。实在不明白多出来那些权限是基于什么考虑。

请教下,是否我的判断有错误,这些权限存在的理由是什么呢?

操作步骤:
1.在electra.c中添加代码,使用TFP0获取到AMFID的taskport,然后试图操控AMFID进程,失败。(此步证明task_conversion_eval的存在)

2.恢复代码,再删除掉inject_criticald的Ent.plist中的platform-application,com.apple.system-task-ports,get-task-allow授权,注销掉electra.c里的
“wk32(amfid_proc + offsetof_p_csflags, (csflags | CS_PLATFORM_BINARY | CS_INSTALLER | CS_GET_TASK_ALLOW) & ~(CS_RESTRICT | CS_HARD));”
这句代码。编译运行electra,仍然成功越狱。(此步证明这些多余设置都无用)

3.接着再删除inject_criticald的Ent.plist中的task_for_pid-allow授权,编译运行electra,越狱失败。失败于inject_criticald对task_for_pid的调用。(此步证明只需要task_for_pid-allow授权)