返回 登录
0

揭秘苹果耗时半年修复的OS X漏洞

阅读18865

OS X 10.7之后的所有苹果桌面系统都存在重大的安全漏洞,这一这漏洞利用了系统进程(如系统偏好设置)通过未公布的OS X API接口获得提升权限,可被任何权限的OS X用户利用以获得root权限

苹果本周四发布的OS X 10.10.3更新,已经修复了该漏洞。不过这一漏洞苹果于上周四向公众披露,旧版OS X系统仍然很危险。

对于未更新的OS X系统来说,这意味着重大的安全威胁。用户可能会不经意安装包含恶意代码的软件。OS X用户最好尽快升级至10.10.3,因为修复非常复杂,苹果不会修复旧版OS X系统。

http://img.my.csdn.net/uploads/201504/10/1428631929_1348.jpg

由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了。这在以前是管理员权限来完成的。

我接着发现了下面代码可快速的绕过:

http://img.my.csdn.net/uploads/201504/10/1428635234_4520.jpg

我们以root用户用户运行时 systemsetup 验证会简单?

Philip试图修补功能,并成功了:

http://img.my.csdn.net/uploads/201504/10/1428635466_7688.jpg

到此,我们只是回到了OS 10.8.5版本此前的systemsetup状态,可以使用systemsetup执行命令:

$ systemsetup –setremotelogin on

继续往下走,在systemsetup实现setremotelogin命令的方法叫[ServerSettings setRemoteLogin:]

输入验证这个功能,然后调用[InternetServices setSSHServerEnabled:],这是在管理员进程下实现的。此举表面setSSHServerEnabled 不是获得 InternetServices 接口的唯一方法,还有启动/停止许多其它服务的方法。清单如下:

http://img.my.csdn.net/uploads/201504/10/1428636526_8928.jpg

其中像setHttpdEnabled 和 setSSHServerEnabled 的实现使用了共享的辅助方法[ADMInternetServices setInetDServiceEnabled:enabled:].

我读取了许多管理员framework代码,但停滞于下面代码:

http://img.my.csdn.net/uploads/201504/10/1428636795_3877.jpg

这似乎为宾客账户创建了一个定制用户的Apache配置文件(root权限是文件所有者):

http://img.my.csdn.net/uploads/201504/10/1428637090_2919.jpg

获得root权限的 API 显现

上面代码截图的Objective-C方法是createFileWithContents:path:attributes:.它还需要一个字节数组(the data to write), a file path 和 POSIX 文件属性。

重新使用我自己的Objective-C 代码后有些会像这样:

http://img.my.csdn.net/uploads/201504/10/1428637368_6868.jpg

问题是我们如何掌握神奇的“tool”,如果我们看截图代码的开头,对应的代码是这样:

http://img.my.csdn.net/uploads/201504/10/1428637606_2906.jpg

没那么简单,还是出现了问题:

http://img.my.csdn.net/uploads/201504/10/1428637687_1631.jpg

接下来找出错误信息:

http://img.my.csdn.net/uploads/201504/10/1428637749_3875.jpg

这是一个检查,接着来看下_onewayMessageDispatcher,定位初始代码:

http://img.my.csdn.net/uploads/201504/10/1428637959_6942.png

authenticateUsingAuthorization就是问题所在:

http://img.my.csdn.net/uploads/201504/10/1428638059_5754.png

这是我需要的,创建 writeconfig XPC服务的XPC客户端,且以root身份运行:

http://img.my.csdn.net/uploads/201504/10/1428638266_8975.png

这是对[SFAuthorization authorization] 的结果耍的小聪明,我修改后的攻击代码如下,开使新的尝试:

http://img.my.csdn.net/uploads/201504/10/1428638392_1401.jpg

我使用了一种类似于 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用户都是管理员。

若是以普通用户访问还是会错误,更多的实战请点击这里查看。

点此查看HackerNews上对这个漏洞的讨论

——————————————————————

极客头条正式开通了微信公众号,刊选每日精华内容和最新的资讯文章。

在微信搜索“csdn_geek”或扫描下方的二维码:

http://img.my.csdn.net/uploads/201504/09/1428549628_6721.jpg

评论