什么是Stack Clash,我该怎么办呢?

我听说过一个名为Stack Clash的新漏洞,它显然会影响多个类Unix系统(不仅仅是Linux,还有BSD,Solaris)。

  • 它是什么? 多操作系统错误是如何发生的?
  • 我该如何保护我的系统?

Stack Clash是一种基于相当古老技术的漏洞。 进程使用的内存分为两个区域 – 堆栈和堆 。 人们通常认为堆栈向下生长,堆积向上生长。 当两者增长到足以与另一个发生冲突时会发生什么? 更一般地说,当堆栈增长到足以侵入不相关的内存空间时会发生什么? 最初的漏洞已有12年历史,Linux内核开发人员通过使用保护页面临时修复了它。 然而,尽管有警卫页面,Qualys的研究人员仍设法利用这一点。

Ars Technica报道 :

Stack Clash漏洞慢慢获得了广泛的认知,首先是2005年安全研究员GaëlDelalleau的调查结果,五年后研究员Rafal Wojtczuk 发布了Linux漏洞 。 Linux开发人员引入了旨在防止堆栈冲突的保护措施 ,但今天的研究表明,攻击者可以相对容易地绕过这一措施。

Qualys开发的主要概念validation攻击利用了一个索引为CVE-2017-1000364的漏洞。 Qualys的研究人员还开发了使用Stack Clash来利用单独漏洞的攻击,包括CVE-2017-1000365和CVE-2017-1000367。 例如,当与CVE-2017-1000367结合使用时,Qualys也发现了Sudo最近发现的一个缺陷,本地用户可以利用Sudo在更广泛的操作系统上获得完全root权限。 到目前为止,Qualys无法使攻击远程执行代码。 他们调查的唯一远程应用程序是Exim邮件服务器,巧合的是它是不可开发的。 Qualys表示不能排除存在这种远程代码执行漏洞的可能性。 Qualys表示,一旦人们有时间防范漏洞,它将在稍后发布概念validation漏洞利用程序。

[…] Qualys的详细技术咨询以及grsecurity的技术分析提供了更多信息。

引用LWN关于2010年原始修复的文章 :

由于Linux不会将进程堆栈和堆页分开,因此可以将堆栈页超出到相邻的堆页中。 这意味着足够深的堆栈(例如来自递归调用)可能最终使用堆中的内存。 可以写入该堆页面的程序(例如X客户端)可以操纵其中一个调用的返回地址以跳转到其选择的位置。 这意味着客户端可以使服务器运行其选择任意代码执行的代码 – 可以利用它来获得root权限。

以上描述适用于各种类Unix的内核。

虽然Ars Technica确实注意到Qualys报告中提到的临时解决方法(“将本地用户和远程服务的硬RLIMIT STACK和RLIMIT_AS设置为低值”),但应该注意的是, 这并不一定能防止这种攻击 。 目前唯一安全的方法是升级。 根据grsecurity分析:

应该清楚的是,仅内核尝试解决这个问题必然总是不完整的,因为真正的问题在于缺乏堆栈探测。 由于替代的真正解决方案取决于重建所有用户区,这可能是可预见的未来唯一可行的解​​决方案。

我们现在可以做的最好的事情是将内核升级到修补版本。

2010漏洞使用了X服务器,这个使用了sudo,下一个可以是多个用户态程序中的任何一个,在某些时候,它们可以在提升的权限下运行。

Qualys尚未发布任何针对漏洞利用的概念validation代码(他们计划在以后这样做)。


有多个与CVE-2017-1000364相关的Ubuntu安全通知:

  • USN-3324-1 (更新)
  • USN-3325-1 – Raspberry Pi 2(更新)
  • USN-3326-1
  • USN-3327-1 – Raspberry Pi 2
  • USN-3328-1
  • USN-3329-1
  • USN-3330-1 – Qualcomm Snapdragon
  • USN-3331-1 – AWS
  • USN-3332-1 – Raspberry Pi 2
  • USN-3333-1 – HWE
  • USN-3334-1 – Xenial HWE
  • USN-3335-1
  • USN-3335-2 – 12.04 ESM
  • USN-3338-1 – 12.04 ESM

另请注意, CVE跟踪器将多个发布/内核组合列为待定修复。

通常,最简单的解决方法是尽快将系统更新到最新的内核包。

来自USN的相关内核版本( for i in {24..35}; curl -s https://www.ubuntu.com/usn/usn-33$i-1/ | pup 'dl:nth-last-of-type(1)'中使用for i in {24..35}; curl -s https://www.ubuntu.com/usn/usn-33$i-1/ | pup 'dl:nth-last-of-type(1)' ):

Ubuntu 17.04:
linux-image-4.10.0-24-lowlatency 4.10.0-24.28
linux-image-generic-lpae 4.10.0.24.26
linux-image-generic 4.10.0.24.26
linux-image-4.10.0-24-generic-lpae 4.10.0-24.28
linux-image-4.10.0-24-generic 4.10.0-24.28
linux-image-lowlatency 4.10.0.24.26
Ubuntu 17.04:
linux-image-4.10.0-1008-raspi2 4.10.0-1008.11
linux-image-raspi2 4.10.0.1008.10
Ubuntu 16.10:
linux-image-powerpc-smp 4.8.0.56.69
linux-image-powerpc-e500mc 4.8.0.56.69
linux-image-4.8.0-56-powerpc-smp 4.8.0-56.61
linux-image-4.8.0-56-powerpc-e500mc 4.8.0-56.61
linux-image-4.8.0-56-lowlatency 4.8.0-56.61
linux-image-generic 4.8.0.56.69
linux-image-4.8.0-56-generic 4.8.0-56.61
linux-image-powerpc64-emb 4.8.0.56.69
linux-image-virtual 4.8.0.56.69
linux-image-powerpc64-smp 4.8.0.56.69
linux-image-4.8.0-56-generic-lpae 4.8.0-56.61
linux-image-generic-lpae 4.8.0.56.69
linux-image-lowlatency 4.8.0.56.69
linux-image-4.8.0-56-powerpc64-emb 4.8.0-56.61
Ubuntu 16.10:
linux-image-4.8.0-1040-raspi2 4.8.0-1040.44
linux-image-raspi2 4.8.0.1040.44
Ubuntu 16.04 LTS:
linux-image-powerpc64-smp- lts -utopic 4.4.0.81.87
linux-image-generic- lts – wily 4.4.0.81.87
linux-image-generic- lts -utopic 4.4.0.81.87
linux-image-4.4.0-81-generic-lpae 4.4.0-81.104
linux-image-powerpc64-emb- lts -vivid 4.4.0.81.87
linux-image-powerpc-e500mc 4.4.0.81.87
linux-image-generic-lpae- lts -xenial 4.4.0.81.87
linux-image-generic-lpae- lts -utopic 4.4.0.81.87
linux-image-powerpc-e500mc- lts -xenial 4.4.0.81.87
linux-image-4.4.0-81-powerpc64-emb 4.4.0-81.104
linux-image-powerpc-e500mc- lts – wily 4.4.0.81.87
linux-image-4.4.0-81-powerpc-e500mc 4.4.0-81.104
linux-image-generic-lpae-lts- wily 4.4.0.81.87
linux-image-virtual- lts -vivid 4.4.0.81.87
linux-image-virtual- lts -utopic 4.4.0.81.87
linux-image-virtual 4.4.0.81.87
linux-image-powerpc64-emb-lts- wily 4.4.0.81.87
linux-image-lowlatency- lts -vivid 4.4.0.81.87
linux-image-powerpc-e500mc- lts -vivid 4.4.0.81.87
linux-image-powerpc64-emb 4.4.0.81.87
linux-image-powerpc-smp- lts -xenial 4.4.0.81.87
linux-image-4.4.0-81-generic 4.4.0-81.104
linux-image-powerpc64-smp- lts -vivid 4.4.0.81.87
linux-image-lowlatency-lts- wily 4.4.0.81.87
linux-image-4.4.0-81-lowlatency 4.4.0-81.104
linux-image-generic 4.4.0.81.87
linux-image-lowlatency- lts -xenial 4.4.0.81.87
linux-image-powerpc64-smp- lts -xenial 4.4.0.81.87
linux-image-powerpc64-emb- lts -utopic 4.4.0.81.87
linux-image-generic- lts -xenial 4.4.0.81.87
linux-image-generic- lts -vivid 4.4.0.81.87
linux-image-powerpc-e500mc- lts -utopic 4.4.0.81.87
linux-image-powerpc-smp 4.4.0.81.87
linux-image-4.4.0-81-powerpc-smp 4.4.0-81.104
linux-image-generic-lpae- lts -vivid 4.4.0.81.87
linux-image-generic-lpae 4.4.0.81.87
linux-image-powerpc64-smp-lts- wily 4.4.0.81.87
linux-image-powerpc64-emb- lts -xenial 4.4.0.81.87
linux-image-powerpc-smp- lts – wily 4.4.0.81.87
linux-image-virtual- lts – wily 4.4.0.81.87
linux-image-powerpc64-smp 4.4.0.81.87
linux-image-4.4.0-81-powerpc64-smp 4.4.0-81.104
linux-image-powerpc-smp- lts -utopic 4.4.0.81.87
linux-image-powerpc-smp- lts -vivid 4.4.0.81.87
linux-image-lowlatency 4.4.0.81.87
linux-image-virtual- lts -xenial 4.4.0.81.87
linux-image-lowlatency- lts -utopic 4.4.0.81.87
Ubuntu 16.04 LTS:
linux-image-4.4.0-1016-gke 4.4.0-1016.16
Ubuntu 16.04 LTS:
linux-image-snapdragon 4.4.0.1061.54
linux-image-4.4.0-1061-snapdragon 4.4.0-1061.66
Ubuntu 16.04 LTS:
linux-image-4.4.0-1020-aws 4.4.0-1020.29
Ubuntu 16.04 LTS:
linux-image-raspi2 4.4.0.1059.60
linux-image-4.4.0-1059-raspi2 4.4.0-1059.67
Ubuntu 16.04 LTS:
linux-image-4.8.0-56-powerpc-smp 4.8.0-56.61~16.04.1
linux-image-4.8.0-56-powerpc-e500mc 4.8.0-56.61~16.04.1
linux-image-4.8.0-56-lowlatency 4.8.0-56.61~16.04.1
linux-image-4.8.0-56-generic 4.8.0-56.61~16.04.1
linux-image-generic-hwe-16.04 4.8.0.56.27
linux-image-lowlatency-hwe-16.04 4.8.0.56.27
linux-image-4.8.0-56-generic-lpae 4.8.0-56.61~16.04.1
linux-image-virtual-hwe-16.04 4.8.0.56.27
linux-image-generic-lpae-hwe-16.04 4.8.0.56.27
linux-image-4.8.0-56-powerpc64-emb 4.8.0-56.61~16.04.1
Ubuntu 14.04 LTS:
linux-image-powerpc-smp- lts -xenial 4.4.0.81.66
linux-image-lowlatency- lts -xenial 4.4.0.81.66
linux-image-4.4.0-81-powerpc-smp 4.4.0-81.104~14.04.1
linux-image-4.4.0-81-powerpc-e500mc 4.4.0-81.104~14.04.1
linux-image-4.4.0-81-lowlatency 4.4.0-81.104~14.04.1
linux-image-4.4.0-81-generic-lpae 4.4.0-81.104~14.04.1
linux-image-generic-lpae- lts -xenial 4.4.0.81.66
linux-image-powerpc64-smp- lts -xenial 4.4.0.81.66
linux-image-4.4.0-81-generic 4.4.0-81.104~14.04.1
linux-image-4.4.0-81-powerpc64-smp 4.4.0-81.104~14.04.1
linux-image-generic- lts -xenial 4.4.0.81.66
linux-image-powerpc64-emb- lts -xenial 4.4.0.81.66
linux-image-powerpc-e500mc- lts -xenial 4.4.0.81.66
linux-image-virtual- lts -xenial 4.4.0.81.66
linux-image-4.4.0-81-powerpc64-emb 4.4.0-81.104~14.04.1
Ubuntu 14.04 LTS:
linux-image-powerpc-e500mc 3.13.0.121.131
linux-image-lowlatency-pae 3.13.0.121.131
linux-image-3.13.0-121-powerpc64-emb 3.13.0-121.170
linux-image-generic-pae 3.13.0.121.131
linux-image-3.13.0-121-powerpc-smp 3.13.0-121.170
linux-image-3.13.0-121-powerpc-e500mc 3.13.0-121.170
linux-image-3.13.0-121-powerpc-e500 3.13.0-121.170
linux-image-3.13.0-121-generic-lpae 3.13.0-121.170
linux-image-generic- lts -quantal 3.13.0.121.131
linux-image-virtual 3.13.0.121.131
linux-image-powerpc-e500 3.13.0.121.131
linux-image-generic- lts – trusty 3.13.0.121.131
linux-image-3.13.0-121-generic 3.13.0-121.170
linux-image-omap 3.13.0.121.131
linux-image-powerpc64-emb 3.13.0.121.131
linux-image-3.13.0-121-powerpc64-smp 3.13.0-121.170
linux-image-generic 3.13.0.121.131
linux-image-highbank 3.13.0.121.131
linux-image-generic- lts – saucy 3.13.0.121.131
linux-image-powerpc-smp 3.13.0.121.131
linux-image-3.13.0-121-lowlatency 3.13.0-121.170
linux-image-generic-lpae-lts- saucy 3.13.0.121.131
linux-image-generic- lts – raring 3.13.0.121.131
linux-image-powerpc64-smp 3.13.0.121.131
linux-image-generic-lpae-lts- trusty 3.13.0.121.131
linux-image-generic-lpae 3.13.0.121.131
linux-image-lowlatency 3.13.0.121.131
Ubuntu 12.04 ESM:
linux-image-powerpc-smp 3.2.0.128.142
linux-image-3.2.0-128-virtual 3.2.0-128.173
linux-image-3.2.0-128-generic-pae 3.2.0-128.173
linux-image-generic 3.2.0.128.142
linux-image-generic-pae 3.2.0.128.142
linux-image-highbank 3.2.0.128.142
linux-image-3.2.0-128-highbank 3.2.0-128.173
linux-image-3.2.0-128-powerpc-smp 3.2.0-128.173
linux-image-virtual 3.2.0.128.142
linux-image-powerpc64-smp 3.2.0.128.142
linux-image-3.2.0-128-omap 3.2.0-128.173
linux-image-3.2.0-128-powerpc64-smp 3.2.0-128.173
linux-image-omap 3.2.0.128.142
linux-image-3.2.0-128-generic 3.2.0-128.173
Ubuntu 12.04 LTS:
linux-image-3.13.0-121-generic 3.13.0-121.170~precision1
linux-image-generic-lpae-lts- trusty 3.13.0.121.112
linux-image-generic- lts – trusty 3.13.0.121.112
linux-image-3.13.0-121-generic-lpae 3.13.0-121.170~precision1

须藤

2017年5月30日起,上述sudo bug由USN-3304-1涵盖:

Ubuntu 17.04:
sudo-ldap 1.8.19p1-1ubuntu1.1
sudo 1.8.19p1-1ubuntu1.1
Ubuntu 16.10:
sudo-ldap 1.8.16-0ubuntu3.2
sudo 1.8.16-0ubuntu3.2
Ubuntu 16.04 LTS:
sudo-ldap 1.8.16-0ubuntu1.4
sudo 1.8.16-0ubuntu1.4
Ubuntu 14.04 LTS:
sudo-ldap 1.8.9p5-1ubuntu1.4
sudo 1.8.9p5-1ubuntu1.4

多操作系统错误是如何发生的?

要具体解决这部分问题:

出现此问题是因为堆(向上增长)和堆栈(向下增长)使用共享地址空间。

这种设计在许多系统中都很常见,因此许多系统容易受到同一类漏洞的攻击。