时间:2015-04-13 08:45:09 来源: 复制分享
OSX 10.7之后的所有苹果桌面系统都存在重大的安全漏洞,这一这漏洞利用了系统进程(如系统偏好设置)通过未公布的OS X API接口获得提升权限,可被任何权限的OS X用户利用以获得root权限
苹果本周四发布的OS X 10.10.3更新,已经修复了该漏洞。不过这一漏洞苹果于上周四向公众披露,旧版OS X系统仍然很危险。
对于未更新的OS X系统来说,这意味着重大的安全威胁。用户可能会不经意安装包含恶意代码的软件。OS X用户最好尽快升级至10.10.3,因为修复非常复杂,苹果不会修复旧版OS X系统。
由TruSec公司的Emil Kvarnhammar在去年十月在OS X Mavericks系统中首次发现,由于修复该漏洞的过程需要作出大量改变,苹果请求了Kvarnhammar推迟公开披露时间,漏洞直到今天才被修复。
日前,Emil Kvarnhammar也撰文详解了导致漏洞的苹果OS X API,下面摘译如下:
这个漏洞已经存在好几年(至少从2011年开始),我发现它是在2014年的10月,该漏洞可被系统中的任何权限的用户获得管理员权限。苹果已经发布了最新版的OS X,且已经修复了这个漏洞,但是老版本用户苹果并未修复,所以我们建议所有用户都升级到最新版。(运行OS X 10.10,10.10.1以及10.10.2的用户可在安全更新2015-004补丁中得到修复。)
我参加过一些关于黑客的行业峰会,不少讲师demo的恶意代码都是来自一些易受攻击设备,我很想说OS X、iOS或Android都是可以入侵的。开发人员开发出的操作系统软件,错误总是不可避免的,而错误必然带来安全漏洞。我想强调一下,即使是苹果中的软件仍有未被发现的漏洞。
demo
2013年9月,OS 10.8.5版本有一个长达一年的漏洞,基于CVE-2013-1775,利用的是系统认证。下面为攻击代码:
$ sudo -k;systemsetup -setusingnetworktime Off -settimezone GMT -setdate 01:01:1970 -settime 00:00;sudo su
我和同事以及软件开发者PhilipÅkesson讨论这个攻击代码可利用systemsetup来修改系统时间,好奇心使然,我们在努力找出苹果后来修复的细节,原来除了修复sudo,苹果还改了systemsetup机制运行systemsetup时需要root权限(在10.8.5更高的版本中)
$ systemsetup
You need administrator access to run this tool... exiting!
这个消息实则是误导用户,因为我们实际上在安装应用时是默认是管理员账户。总是上述信息显示在执行命令时需要root了。这在以前是管理员权限来完成的。
我接着发现了下面代码可快速的绕过:
我们以root用户用户运行时systemsetup验证会简单?
Philip试图修补功能,并成功了:
到此,我们只是回到了OS 10.8.5版本此前的systemsetup状态,可以使用systemsetup执行命令:
$ systemsetupsetremotelogin on
继续往下走,在systemsetup实现setremotelogin命令的方法叫[ServerSettings setRemoteLogin:]
输入验证这个功能,然后调用[InternetServices setSSHServerEnabled:],这是在管理员进程下实现的。此举表面setSSHServerEnabled不是获得InternetServices接口的唯一方法,还有启动/停止许多其它服务的方法。清单如下:
其中像setHttpdEnabled和setSSHServerEnabled的实现使用了共享的辅助方法[ADMInternetServices setInetDServiceEnabled:enabled:].
我读取了许多管理员framework代码,但停滞于下面代码:
这似乎为宾客账户创建了一个定制用户的Apache配置文件(root权限是文件所有者):
获得root权限的API显现
上面代码截图的Objective-C方法是createFileWithContents:path:attributes:.它还需要一个字节数组(the data to write), a file path和POSIX文件属性。
重新使用我自己的Objective-C代码后有些会像这样:
问题是我们如何掌握神奇的“tool”,如果我们看截图代码的开头,对应的代码是这样:
没那么简单,还是出现了问题:
接下来找出错误信息:
这是一个检查,接着来看下_onewayMessageDispatcher,定位初始代码:
authenticateUsingAuthorization就是问题所在:
这是我需要的,创建writeconfig XPC服务的XPC客户端,且以root身份运行:
这是对[SFAuthorization authorization]的结果耍的小聪明,我修改后的攻击代码如下,开使新的尝试:
我使用了一种类似于authenticateUsingAuthorization的相同功能,且设置许可为4777。创建文件和设定setuid位。
-rwsrwxrwx 1 root wheel 25960 Apr 1 19:29 rootpipe.tmp
设定setuid位加上root权限所有者,我们也提升了权限。
第一个攻击代码适用10.7.x和10.8.x,其中的类和方法略有不同,上面所用是针对10.9或更高。
目前攻击代码仍然有限制,只限于管理员许可的用户。上文提及,几乎所有的OS X用户都是管理员。