由于触发该漏洞需要规避一个flush-to-disk限制,Intezer研究人员将该漏洞称为 "Royal Flush"。逃脱flush-to-disk限制就意味着要把数据移交给内核,在那里数据对于其他进程来说是可见的,但是在系统重启后可能就无法使用了。
该公司发现,Azure Functions容器在运行时会使用privileged Docker标志,这意味着Docker主机和容器使用者都可以共享/dev目录中的设备文件。该漏洞是由于这些设备文件具有 "他人 "的读写权限而引起的。
周四发布的分析报告中描述,"相对宽松的设备文件权限并不是系统的默认设置"。
根据Intezer的说法,由于Azure Functions环境中包含了52个不同的文件系统分区,这些分区可以使得不同权限的用户可见,这个特点就成了一个很大的安全问题。
研究人员解释说:"我们怀疑这些分区是属于其他Azure Functions客户端的,但通过进一步的评估显示,这些分区只是同一操作系统所使用的普通文件系统,比如Docker主机的文件系统pmem0 "。
Intezer研究副总裁Ari Eitan告诉Theatpost:"在攻击者以一个低权限的用户身份来访问受害者环境的情况下,这可能就会变得非常危险,利用这个漏洞,攻击者可以升级权限,做一些他本不能够做到的事情(例如从文件系统中读取文件)。"
此外,虽然该漏洞不是一个Docker逃逸漏洞,他说:"如果用户能够升级到root权限,他们将能够使用各种Docker逃逸技术逃逸到Docker主机内,将这两者结合在一起使用,对于系统的安全来说将是一个巨大的威胁。"
Royal Flush云容器漏洞
为了查找这种设置可能会产生的攻击路径,研究人员创建了一个本地测试容器。他们发现,通过使用Debugfs程序(一种用于调试Linux内核的特殊程序,可以用来检查和改变文件系统的状态),一个无权限的用户可以轻松穿越Azure Functions文件系统。而且,事实证明,非特权用户还可以直接编辑其中的任何文件。
据分析:"一开始,我们尝试使用zap_block命令直接编辑文件系统块的内容。在系统内部,Linux内核会将/dev/sda5设备文件进行修改处理,对/etc/passwd文件的修改会写入到缓存中。因此,需要将系统的更改刷新到磁盘内,这种刷新是由Debugfs程序处理实现的。"
然而,研究人员找到了一种方法,能够绕过这种对文件进行直接修改的限制。
研究人员解释说:"首先,我们在容器的diff目录中,通过Debugfs创建了一个硬链接,这样更改就会影响到我们的容器中的文件了。"
他们补充说:"这个硬链接仍然需要root权限来编辑,所以我们还必须要使用zap_block来编辑其中的内容。受一个名为'pagecache管理'的项目启发,我们可以使用posix_fadvise来使得内核从缓存中刷新页面。这会使得内核加载我们的修改,我们最终会将它们传播到Docker主机文件系统中。"
研究人员指出,Debugfs还支持写模式,允许用户对底层磁盘进行修改。他们补充说:"需要重点注意的是,我们通常不会向挂载的磁盘中写入内容,因为它可能会导致磁盘的损坏"。
研究人员解释说,由于攻击者可以编辑Docker主机的任意文件, 因此他们可以对/etc/ld.so.preload文件进行修改,这将允许攻击者进行"预加载-劫持 "攻击,通过容器的diff目录来传播恶意的共享文件。
根据研究人员分析:"这个文件可能会被预加载到Docker主机系统中的每个进程中(我们之前就记录了使用这种技术的HiddenWasp恶意软件),因此攻击者这样就能够在Docker主机上执行恶意代码。"
Intezer向微软安全响应中心(MSRC)报告了该漏洞,但微软并没有发布补丁。根据分析,这家计算巨头认定该漏洞 "对Azure Functions用户的安全没有影响",因为研究人员使用的Docker主机实际上是一个HyperV容器,有另一个沙箱的保护。但这并不是说这个漏洞在其他的配置下就不会有危险。
Eitan说:"尽管MSRC说这个没有什么可担心的,但我们相信高级攻击者可以利用这个漏洞,并且它可以帮助攻击者进行更高级别的攻击,这也就是我们要公布它的原因。"
研究人员还提供了漏洞验证的代码。
微软对此并没有立即进行回复评论。
Intezer建议:"通过这样的案例我们可以发现,漏洞有时是未知的,或者是消费者无法控制的,我们建议要对云安全采取双层保护的方法。做好基本的防护工作,比如修复已知的漏洞和加固你的操作系统,降低被攻击的可能性。实施运行时的保护策略,检测和应对漏洞的利用和其他的内存攻击。"
本文翻译自:https://threatpost.com/azure-functions-privilege-escalation/165307/