作为中国本土技术团队,时隔半年后,6月24日,盘古团队发布了iOS7.1.1完美越狱工具,这款工具在一片质疑声中得到了国外知名的越狱大神iH8sn0w的中肯评价:“除了带有盗版商店的可选安装之外以及企业认证之外,Pangu并没有附带任何恶意软件。也就是说,用户在安装之后不会有安全方面的问题,盘古是一个非常成熟的越狱工具。”
而根据来自盘古数据的统计,从完美越狱工具发布到上周六,这短短的18天,盘古网站浏览量达到500万,后成功越狱的设备数量达到300万,来自中国与美国的iPhone是真正的主力。
来自盘古团队的独立安全研究员Windknown与我们分享盘古团队如何发现并用来实现完美越狱的漏洞。Windknown介绍了代码签名绕过、内核信息泄漏、内核内存覆盖三个漏洞的细节,并且演示如何针对这些漏洞编写溢出,从而使得盘古越狱能在iOS设备上存活。
代码签名绕过
绕过代码签名的思路很简单,这是苹果的特性,可以利用其重新导出而迫使它加载。完美越狱,希望能够在手机重启过程当中,找到机会执行盘古的代码,然后去溢出内核,把内核当中的签名、检查、沙盒等保护去掉。这当中我们要做到两点,一个要有内核的漏洞,并且在比较早的时候触发这个漏洞。第二是找到未签名的代码,我们要绕过未签名的漏洞。
盘古通过Launchd的代码加载所有的Plist配置服务的。它通过这个文件定位文件当中的XPCD文件,这里面需要注意XPCD是需要认证的。苹果把所有的DYLIB放在缓存文件中,这可以通过这个标志位,构造的一个加载但仍然需要有签名检查的,还是需要绕过它签名检查的机制。
内核信息泄漏
Early_random对于64位的,它通过简单的暴力猜解就可以获取所有的值。对于32位,需要知道一个输入值才可以恢复剩余的值。32位的Output中返回32个指针,62位的Output中返回16个指针,这是非常简单的代码。
这里面关键的一个东西就是这个参数,叫OutputCount。真正功能的处理调用,是在对应的ExternalMethod时,你会重写ExternalMethod。在调用ExternalMethod的时候,它首先在站中准备了一个OutputCount,准备了16个数据的长度,然后它把这个参数再传递给,反映给上层,这就是一个正常的行为。
可以看到如果大家通过ID一分析的话,可以看到ID驱动在重载externalMethod的话有两种方式。一种方式是它在自己类的成员中有一个对象,有一个成员是method的数组。如果不这样调用的情况下,在代码实现的过程中,他可能根本没有关心需要设置初参,就像Outputcount,Outputcount里面,给了16个数据的长度,并告知16个数据长度,如果没有做,那就是零,它在调用数据过程当中会把这16个数据调用给用户。到目前为止,盘古在使用的数据,可以把那些所有的随机值全部的恢复。
内核内存覆盖
最后的漏洞,可以利用它来达到写任何内核内存的目的。首先要触发漏洞,打开一个IOHIDEventService服务,设置一个通知端口,映射队列内存,在映射队列内存的结尾可以找到mach-msg-header-t结构,修改mach-msg-header-t指向我们的虚假port,等待队列有数据后向虚假port发送消息。
代码执行其实有很多种不同的思路,一个最简单的思路就是覆盖一个内核对象的指针,这个很简单,首先你有任意读,我可以就把整个内核对象的内容读出来,然后仅仅修改vtable指针,再覆盖整个内核对象,将对象放在连续的代码之间。
最后,Windknown表示“三个漏洞都是目前都没有被修补的,完美越狱至少4-5个漏洞,exploit对兼容性要求比较高,任何正常软件都很难做到一夜之间下载到百万,而越狱就可以,这也就是它的魅力所在。”我们也希望作为中国最顶尖的技术团队之一,盘古能继续保持佳绩,并在国际上打开影响力!