9月3日才注意到这个在8月28日刊登在英文网站9月1日在驱动之家的,关于OS X系统的sudo漏洞没有修补的新闻,今天才有时间成文上传。
这个sudo漏洞是在2013年2月27日被公布出来的,它的注册号是CVE-2013-1775, 大家可以上网找找,这个漏洞相继在不同的类Unix系统中被确认,特别是基于开源的操作系统。它影响sudo发布版本中所有从1.6版到1.7.10p6, 从1.8.0到1.8.6p6。从sudo命令的网站上看,它同时在2013年2月27日推出了一个重要的系统更新版本,用来修复这个漏洞,Sudo version 1.8.6p7 和Sudo version 1.7.10p7 。目前来看,OS X 10.7.4和10.8.3的sudo版本都是1.7.4p6,10.6.8是1.7.0。大家可以自己在Terminal终端中运行sudo -V来查看。
该新闻中,主要提到的是,该漏洞在OS X 10.6到现在的10.8.4的各个版本都存在,基于Apple的升级策略与微软或者其它厂家的不同,苹果既没有推出及时更新也没有正面回复第三方的询问。
在各个网友的回复中,普遍存在误解。反方是坚定了自己对Mac系统的鄙视态度,正方是在鉴定苹果系统最安全的基础上对此漏洞采取一带而过忽视的作法,所以吵得还挺热闹。
新闻就是新闻,总是由不懂行的人道听途说地写出来,既不清晰也不易懂。咱们还是从该漏洞的具体内容开始说说吧:
首先,这个牵扯到计算机开元世纪(Unix epoch),计算机的时钟是从零开始计数的,Unix系统默认地把时钟0,当作1970年1月1日0时0分0秒(也就是1970:01:01 01:00:00),那么如果电脑时钟计数是10,那么系统就认为是1970年1月1日0时0分10秒。
再说,sudo的作用主要是提升当前用户的权限,比如可以让一个管理员用root权限来运行命令,众所周知,root在类Unix系统中就是上帝,可以做任何事情,甚至比上帝都全能,能杀掉自己!能够用root权限来执行命令,就意味着完全地控制了这个系统。默认地,在运行sudo的时候,会在Terminal中提示让用户输入密码,正确后,它会生成一个时间戳,再次使用sudo的时候,它会用当前时间和当初生成的那个时间戳比较,如果这个时间没有超出了设定的时间间隔,该间隔默认的是5分钟,那么它不会再次询问用户密码,而是直接运行命令;如果超出,那么需要用户再次输入密码确认。
其实,即便没有超出时间间隔,也可以使用sudo -k命令来重置时间戳,这样下次在使用sudo,系统会询问密码。在sudo的1.6版本之后,sudo -k命令不是把那个时间戳彻底移除,而是把它设置到电脑开元世纪时间,正是这个举动给骇客以可乘之机。因为在这些版本中,它不管时间戳是不是开元世纪时间,而是依然使用当前时间与之对比,大家可以看到其中的漏洞了吧。只要用户可以把系统时间修改成开元世纪,在5分钟内,可以不用输入用户密码,就可以成功运行sudo命令了。比如sudo su后就可以切换到root用户,只要不退出Terminal,就可以没有时间限制地完全掌控这个系统。
要想利用这个漏洞,需要有几个关键条件:
- 这个用户曾经成功运行过sudo命令,也就是sudo建立过时间戳,并运行sudo -k,这样让它归零-不归零的话,可不好猜该用户上一次什么时候运行的sudo命令-如果谁能够知道方法那么sudo的漏洞可就更大了,这是题外话。不过还好了,sudo -k运行的时候不需要密码的。
- 其次是,骇客需要更改系统时间,如果通过GUI的System Preferences,系统当然会再次询问用户密码才能变更系统时间;不过,systemsetup命令可以在不用提供密码的情况下可以变更系统时间(这一点在我的10.8.4中需要使用sudo才能变更系统时间设定,我要在其它系统中尝试在确定一下):
systemsetup -setusingnetworktime off
systemsetup -setdate 01:01:1970
systemsetup -settime 00:05
注:上面的命令只用于举例,并不用于真正的入侵行为 - 因为1的原因,也就暗含了另外一个条件,也就是这个用户必须被准许运行sudo命令,默认情况下,OS X系统的管理员帐户都被准许执行,除非特殊设定.
- 需要可以在这台机器上操作,也就是这台机器已经被满足1和3条件的用户登陆了,当然也可能远程登陆。
注:如果细心的读者使用上面的方法突破系统,很可能不成功,那是因为我在上面的命令中有益忽略了一个特殊的命令导致。