BlackHat 2018 | iOS越狱细节揭秘:危险的用户态只读内存
在先容完了全部这些机制性的题目后,我们来先容两个用于Jailbreak的要害裂痕。裂痕1存在于DMA映射模块,先条件到,体系的内存属性mapOption会被传入底层DART的代码中,然而在iOS 10以赶早期的iOS 11版本中,这个mapOption参数被基层的DART转换所忽略: 全部操纵体系中的假造地点,城市被映射成IOSpace中应承读写的内存: 之后我们先容第二个裂痕,这个裂痕存在于苹果图形模块中。在IOAccelResource工具建设进程中,一个IOAccelClientShareRO工具会被映射到用户态作为只读内存,这个工具包括4个IOAccelEvent工具: 在IOAccelResource工具烧毁进程中,testEvent函数会被执行,用于测试IOAccelResource对应的画图指令是否已经被GPU处理赏罚完成: 在这个代码逻辑中,因为内核充实信赖这块IOAccelEvent内存不会被用户态措施改动(由于是只读映射),因此并没有对channelIndex做界线搜查。这固然在绝大大都环境下是安详的,但假如我们共同裂痕1,在用户态直接修改这块只读内存,就会导致可信界线被彻底粉碎,从而造成m_stampAddressArray的越界读以及m_inlineArray的越界写: 最后,我们接头两个裂痕的操作。要操作这两个裂痕并不轻易,由于我们必要找到一种内存机关要领,让m_stampAddressArray以及m_inlineArray这两个数组的越界值都可控。但由于这两个数组在体系启动初期就已经分派,并且这两个数组的元素巨细并不沟通,因此机关并不轻易。 颠末研究,我们发明,只有通过指定大index以及公道的内查对喷,才气实现这样的机关。由于在iPhone7装备中,用户态应用可以喷射或许350MB的内存,而且在m_stampAddressArray以及m_inlineArray初始化后,会有特殊50MB的内存耗损,因此我们必要使得index满意以下两个前提:
也就是说index的值必要在[0x640000, 0x10AAAAA]这个范畴内,可以使得两个数组的越界值极或许率在我们可控的喷射内存内: 然后,下一个题目就是,我们是否可以或许恣意地点读以及恣意地点写。对付恣意地点读好像不是什么题目,由于m_stampAddressArray的元素巨细是8字节,可以通过指定恣意index达到恣意内存地点。但恣意地点写必要研究,由于m_inlineArray的元素巨细是24字节,只有一个field可以用于越界写,以是不是每个内存地点都可以被写到: 在这种环境下,我们退求其次,假如能实现对付一个页中的恣意偏移值举办写操纵,那么也可以根基到达我们的要求。在这里,我们必要通过同余定理来实现: 由于:
因此对付恣意整数n,满意:
(编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |