查看原文
其他

Apache Tomcat权限提升漏洞分析(CVE-2022-23181)

启明星辰 ADLab 2023-01-16

更多安全资讯和分析文章请关注启明星辰ADLab微信公众号及官方网站(adlab.venustech.com.cn)












01漏洞概述

Apache Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,实现了对Servlet和JavaServer Page(JSP)的支持。由于Tomcat本身也内含了一个HTTP服务器,它也可以被视作一个单独的Web服务器。

2022年1月27日,Apache发布安全公告,公开了Apache Tomcat中的一个权限提升漏洞(CVE-2022-23181)。根据官方描述该漏洞属于TOCTOU(Time-of-checkTime-of-use)型竞态条件漏洞。

经过深入分析发现CVE-2022-23181漏洞是由于Apache Tomcat CVE-2020-9484的漏洞修复不完全导致的,可以通过Symlinks文件的方式绕过路径检查,再通过条件竞争的方式继续执行反序列化操作。此漏洞仅当Tomcat 配置为使用 FileStore 持久化会话时,此漏洞才可被利用。

02受影响版本

  • Apache Tomcat 10.1.0-M1到10.1.0-M8 版本

  • Apache Tomcat 10.0.0-M5到10.0.14 版本

  • Apache Tomcat 9.0.35到9.0.56 版本

  • Apache Tomcat 8.5.55到8.5.73版本


03漏洞分析

由于CVE-2022-23181漏洞是CVE-2020-9484的绕过,在分析CVE-2022-23181漏洞之前,先来看一下CVE-2020-9484这个漏洞的成因。查看FileStore的load方法,代码如下:

Load方法的参数id即为sessionid,该值可通过Cookie的JSESSIONID向服务器提交。Id先经过了file方法,如果文件存在的话会继续对该文件进行反序列化处理,最终导致代码执行。我们看file方法对文件做了哪些处理,代码如下图所示:

没有对id做任何过滤,我们可以使用../../这样的路径来控制反序列化的文件。成功利用的截图如下所示:

CVE-2020-9484漏洞分析完了,我们来看一下它的补丁,如下图所示:

使用file对象的canonicalFile()方法来获取文件的路径,我们来看一下canonicalFile这个方法的官方描述:

该方法返回同一个文件或目录的规范路径名字符串表示。

所以当使用../../的时候会返回其拼接../../后的实际路径, 假定session存储路径为“/tomcat/test/“,“/tomcat/test/../../../../a.txt”在使用canonicalFile方法后最终的路径为/a.txt,这样就无法和“/tomcat/test/”进行匹配,也就无法再利用这个漏洞。如下图所示:

下面我们来分析CVE-2022-23181这个漏洞。通过Tomcat官方的补丁,可知漏洞点同样位于file方法中,补丁commit如下图所示:

通过对漏洞深入分析发现补丁核心逻辑是返回经过getCanonicalFile方法处理后的canonicalFile对象,而不是直接返回file。

只看代码似乎并没有什么区别,但是官方为什么要这样处理呢? 这里涉及到java.io.File类的getCanonicalFile方法特性,在getCanonicalFile处理Symlinks类型的文件时,会返回其所链接的文件路径。下面我们来做个实验验证一下:

ln -s /Users/xxxx/java/soft/apache-tomcat-8.5.42/work/Catalina/localhost/ROOT/a.session ceshi.session
备注:a.session这个文件必须存在。

可以看到使用符号链接的文件经过getCanonicalFile处理后得到的是其指向的文件。这样我们就能在我们可控的范围内达到绕过file方法验证的目的了,我们模拟tomcat存在漏洞的代码复现这个漏洞,如下所示:

可以看到使用Symlinks类型文件已经成功绕过了检查,并将我们指定的恶意文件路径返回。

如果返回的是canonicalFile的话,那么漏洞就不存在了,这也是官方为何如此修复漏洞,如下图所示:

还有一个问题就是file方法返回的是我们创建的Symlinks文件,并不能反序列化利用,此时我们还需要将这个Symlinks文件替换成序列化后的恶意文件。所以此时就会有一个条件竞争的问题。必须能在文件验证成功之后瞬间将Symlinks文件替换成恶意序列化文件。所以该漏洞很难被成功利用,无法稳定复现。 

总结一下这个漏洞需要满足以下条件:

  • 攻击者能够控制服务器上文件的内容和文件名称。

  • 服务器PersistenceManager配置中使用了FileStore。

  • Tomcat依赖jar包中存在反序列化利用链。

  • 攻击者知道使用的FileStore存储位置并且知道其目录下存在的任意文件名称。

  • 满足条件竞争,创建Symlinks文件,并在完成文件验证后瞬间覆盖恶意序列化文件。

04处置建议

目前此漏洞已经修复,建议受影响的用户及时升级更新到以下版本:

  • Apache Tomcat 10.1.0-M10 或更高版本

  • Apache Tomcat 10.0.16 或更高版本

  • Apache Tomcat 9.0.58 或更高版本

  • Apache Tomcat 8.5.75 或更高版本

请根据开发者提供的信息更新到最新版本。



参考链接:

[1]https://www.cybersecurity-help.cz/vdb/SB2022012708

[2]https://nvd.nist.gov/vuln/detail/CVE-2022-23181





启明星辰积极防御实验室(ADLab)





ADLab成立于1999年,是中国安全行业最早成立的攻防技术研究实验室之一,微软MAPP计划核心成员,“黑雀攻击”概念首推者。截止目前,ADLab已通过CVE累计发布安全漏洞近1100个,通过 CNVD/CNNVD累计发布安全漏洞2000余个,持续保持国际网络安全领域一流水准。实验室研究方向涵盖操作系统与应用系统安全研究、移动智能终端安全研究、物联网智能设备安全研究、Web安全研究、工控系统安全研究、云安全研究。研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。






您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存