导语:安全研究人员发现Ubuntu崩溃报告工具存在远程代码执行漏洞,攻击者可能只需要一个恶意文件就能攻陷你的Linux系统。
2016是网络攻击爆发的一年,这个说法应该非常准确,因为今年的网络攻击的数量不但前所未有,而且攻击的模式也花样百出,不管是号称最安全的苹果系统还是Linux系统都统统在今年来了个遍,当然臭大街的Windows系统就不用提了。
现在黑客攻击的手法真像电信诈骗犯一样防不胜防,比如很多产品为了防止网络的恶意攻击,会主动出现一些错误提示,但俗话说道高一尺魔高一丈,黑客竟然对这些错误提示打起了主意,诱导用户进行恶意攻击,这么说绝不是仅凭想象,就在最近,来自布宜诺斯艾利斯的研究员 Manuel Caballero发现,诈骗分子可以利用漏洞创建一个伪造的警告页面,通过改变URL字符并附加哈希值内容伪装成合法的站点,显示文字警告并留下诈骗电话。诈骗分子非常聪明,因为用户只需点击其中伪造的电话号码链接就可以联系到他们。而这种诈骗方式合情合理,并不会出现任何可疑操作,不明真相的用户是不会怀疑这宗信息的真实性。
Ubuntu也被黑客找到了突破口
感兴趣的读者可以回顾《防不胜防:Edge浏览器的警告页面也被造假》。显然一种新的犯罪模式出来之后,很容易就被模仿,这不连号称最安全的Linux操作系统乌班图(Ubuntu)也出现了这样的情况,安全研究人员发现Ubuntu崩溃报告工具存在远程代码执行漏洞,攻击者可能只需要一个恶意文件就能攻陷你的Linux系统。
该漏洞影响所有默认安装的Ubuntu Linux 12.10 (Quantal)及其之后的版本。根据Donncha O’Cearbhaill的研究,这个漏洞在用户打开一个特制的恶意文件时,允许命令执行。
何为Ubuntu崩溃报告:在桌面版Ubuntu中,经常会遇到一些弹窗窗口,警告用户Ubuntu发生了内部错误,问用户要不要发送错误报告。具体的过程如下:
Ubuntu桌面版预装了Apport,apport就是ubuntu上的"crash report"服务,就是当有程序崩溃时弹出的那个发送error report的程序。
它是一个错误收集系统,会收集软件崩溃、未处理异常和其他,包括程序bug,并为调试目的生成崩溃报告。当一个应用程序崩溃或者出现Bug时候,Apport就会通过弹窗警告用户并且询问用户是否提交崩溃报告。你也许也看到过下面的消息。
•"Sorry, the application XXXX has closed unexpectedly." •"对不起,应用程序XXXX意外关闭了。" •"Sorry, Ubuntu XX.XX has experienced an internal error." •"对不起,Ubuntu XX.XX 发生了一个内部错误。" •"System program problem detected." •"检测到系统程序问题。"
而黑客就是欺骗Ubuntu用户打开一个恶意诱骗的崩溃文件。一旦受害者打开文件,它会注入Ubuntu崩溃文件处理程序中的恶意代码,解析代码并执行任意Python代码。
向crash文件中注入Python代码
Apport会根据不同软件生成的不同报告,提交给不同的Ubuntu Launchpad 项目(Launchpad 是一个提供维护、支持或连络 Ubuntu 开发者的网站平台,由 Ubuntu 的母公司 Canonical所架设,用户可以利用该网站的汇报机制来汇报相关软件的 Bugs)。特殊的hook脚本软件包(从/usr/share/apport/package-hooks/文件夹中加载)可以自定义文件内容和崩溃报告的发送目的地。目标项目也可以由崩溃报告中的CrashDB 字段指定。
CrashDB 的配置存储在/etc/apport/crashdb.conf.d文件中。Crash文件中的CrashDB字段可以用于从指定的文件夹中加载这个配置文件。
O'Cearbhaill在一篇博文中写道:
CrashDB字段会直接加载CrashDB配置的代码而不是从存储文件中,代码会首先检查CrashDB 字段中是不是以“{”开始,如果是,则意味着这里存储的是一个Python程序段,Apport将会调用Python的eval()内建函数,来处理CrashDB 字段中的信息。eval()会将字段中的信息作为传入参数,当成python表达式来处理,这就直接导致了可靠的代码执行。
这段有漏洞的代码是在2012-08-22引进到Apport revision 2464中的。第一个有这个漏洞的Apport是 2.6.1版本,所有ubuntu 12.10和以后的版本中都包含这个漏洞。
研究人员还在GitHub上发布了概念验证(PoC)漏洞代码和攻击的视频:视频地址:https://player.vimeo.com/video/194867494视频演示了有可能在恶意文件的帮助下利用这个缺陷获得Ubuntu的控制。在视频中,专家用一个简单的Apport崩溃报告文件并利用上面的crashDB漏洞来执行任意代码,最后打开了一个Gnome计算器:
这段代码可以用.crash 扩展名来存储,或任何ubuntu无法识别的其它扩展名。
Apport 在给用户用图形界面显示一个需要提交的bug报告时,通常会先读取崩溃文件的子字段,但是CrashDB 字段只有在用户确认提交这个bug报告后,才会被解释和执行。然而,当崩溃报告中设置了“ProblemType: Bug”时,apport-gtk会转换到“streamlined Bug”图形化界面,这会直接引起CrashDB 字段的解释和执行,并且是在没有任何用户交互的情况下。
如果崩溃报告中没有Stracktrace 字段的信息,Apport 会花一些时间,试着去收集崩溃进程的信息。这会延迟CrashDB 字段的执行。在利用代码中,我们可以用一个空的Stracktrace 字段绕过去。
使用CVE-2016-9950路径遍历漏洞
在ubuntu中,Apport 的hook脚本软件包会安装到/usr/share/apport/package-hooks文件夹下。这些python hook 脚本的加载基于软件包名称。他们允许软件包的维护者从用户的电脑上收集有用的特定软件包的崩溃信息。然而当建立一个软件包hook文件时,崩溃文件中的package字段并没有经过过滤。代码可以用.crash扩展名或任何其他未在Ubuntu上注册的扩展名保存。
这里的代码允许攻击者遍历文件路径,并在系统hook_dirs(/usr/share/apport/general-hooks/ or/usr/share/apport/package-hooks/)文件夹外,执行任意python脚本。_run_hook 函数会将一个hook文件的内容当作python代码来执行。攻击者可以向用户下载的文件中,植入恶意的一个.py文件和一个崩溃文件,来执行攻击代码。这个方案通过Chromium 会非常容易,它会自动下载文件而没有提示。
这个路径遍历漏洞在2007-01-24被引入到了Apport 0.44中,这个版本在ubuntu 7.04中被首次使用。
利用CrashDB和hook注入漏洞来提权(需要用户交互)
所有UID小于500的崩溃文件被认为是系统崩溃文件,当打开系统崩溃文件时,“apport-crashreports”会使用PolicyKit 给用户进行提示,并使用root权限。
提示信息通常是“System program problem detected”信息,并没有给用户提供其他崩溃信息。
如果一个使用了UID小于500的崩溃文件,利用这两个漏洞,并会崩溃文件放入到/var/crash文件夹中,并且用户接受了这个提示,代码就会以ROOT权限执行。当然需要用户交互,在产生一个随机的崩溃之后,在任何时间使用Ubuntu的人都会看到这个能将代码提权的提示信息。
这样的bug允许一个低特权应用程序跨越权限的边界。比如,可以利用一个SQL 注入漏洞,通过 "INTO OUTFILE"语句向/var/crash目录中写入一个恶意崩溃文件,当一个桌面用户登录后,这个恶意的崩溃文件会自动执行。
上面的所有漏洞已经通知了Apport 的维护人员,他们在2016年12月14日已经发布了三个漏洞的补丁。CrashDB 代码注入漏洞被编号为CVE-2016-9949,路径遍历漏洞为CVE-2016-9950,另外一个问题,“重新启动”行为下的任意代码执行漏洞为CVE-2016-9951。为了感谢O'Cearbhaill所发现的漏洞, Ubuntu 已经向他发了一万美元的赏金。
2016就剩最后半个月了,相信还会有新的漏洞和新的攻击事件再出现,各位用户一定要加强安全意识,无论您使用的是什么系统都一定要注意尽快升级补丁,把危险降到最低。