测试最不安全的Docker应用程序的实际安全性
JFrog高级安全系列:在最不安全的Docker应用程序WebGoat上分析第三方漏洞的可利用性。

我们之前对顶级DockerHub映像中的CVE可利用性进行了研究发现78%报告的cve实际上是不可利用的。这一次,JFrog安全研究团队使用JFrog x射线的上下文分析特性,自动分析报告的cve的适用性,扫描OWASP WebGoat—一个故意不安全的应用程序。
结果表明,在60个报告有关键CVSS评分的cve中,只有10个是实际适用的.
WebGoat关键cve的上下文分析扫描结果
这篇博客文章将提供上下文分析所报告的重要CVE的详细适用性分析,并提供减少CVE误报数量的见解。
WebGoat是一个不安全的web应用程序,主要用Java编写,公开用于应用程序安全培训和工具基准测试。WebGoat Docker图像是我们研究的一个精心选择的案例,它展示了上下文分析在发现实际可利用的漏洞和过滤掉不可利用的漏洞时是多么强大。流行的第三方组件和合成的第一方不安全缺陷的组合使其成为一个很好的测试目标。由于此图像是一个合成的不安全应用程序,我们还可以使用植入漏洞的官方文档,我们可以将其作为基本事实进行比较,甚至可以找到更多不是故意植入且没有记录的可利用漏洞。
WebGoat图片,Dockerhub
我们的研究方法
在这项研究中,我们开始寻找哪些cve在高度脆弱的应用程序(如WebGoat)中实际上是可利用的。虽然我们总是对广泛的可利用性测试感兴趣,但出于本文的目的,我们将只关注具有关键CVSS分数的漏洞。
在选择了我们的目标应用程序WebGoat之后,下一步就是使用启用上下文分析功能的JFrog Xray扫描它,以确定哪些报告的cve是真正可利用的。
我们研究的最后一步是进一步调查Xray的上下文分析功能提供的结果。上下文分析扫描结果考虑可利用性因素,如代码先决条件、配置先决条件和运行环境,以确定CVE是否可被利用。
与我们之前的研究一样,我们预计大多数报告的cve都是不可开发的。这是因为在大多数情况下,即使报告了一个漏洞是因为“安装了X包”,但要使漏洞被利用,一些对利用至关重要的因素和先决条件(代码、配置或环境)实际上不存在于“易受攻击”的应用程序中。
JFrog x线扫描结果
在使用JFrog Xray的上下文分析扫描WebGoat Docker图像后,我们发现了这一点在60个报告有关键CVSS评分的cve中,只有10个是实际适用的.
这些扫描结果帮助我们专注于最有可能被利用的cve的研究,并演示了上下文分析如何帮助安全团队优先修复适用的cve,并优先处理实际上不适用的cve。
让我们使用上下文分析结果来检查cve的适用性条件。
分析所报告的cve
我们从分析上下文分析结果所报告的10个关键cve开始。这10个cve的可利用条件通过Docker图像中的上下文分析得到了确认。这意味着他们最有可能成为目标和利用黑帽黑客和我们在这项研究中所做的一样白帽黑客.下面是这些适用的cve的分析。
cve - 2013 - 7285
第一个值得注意的CVE是XStream for Java中的命令注入,它允许在反序列化精心制作的XML或JSON数据时远程执行代码。为了利用此漏洞,攻击者必须能够向' xstream.fromXML() '函数提供任意输入。
如上所述,在易受攻击的版本中安装XStream不足以成功利用此漏洞。WebGoat图像的上下文分析扫描结果有助于我们了解此漏洞是否适用于上下文。上下文分析的适用结果意味着在应用程序中存在易受攻击的XStream使用,换句话说,易受攻击的函数' fromXML() '被外部输入调用。结果表明,此漏洞是适用的,因此应视为可能被攻击者利用的严重问题。
JFrog x射线信息CVE-2013-7285
以下是上下文分析的细分:

JFrog x射线上下文分析CVE-2013-7285
使用上下文分析的结果,我们可以看到一个易受攻击的' fromXML() '调用,它的第一个参数有外部输入。下面是' xstream.fromXML() '的脆弱用法,可以在WebGoat源代码中看到:

WebGoat中' fromXML() '的脆弱使用,Github
在我们的研究中,通过将恶意反序列化对象作为参数传递给此函数并执行远程代码执行,我们成功地利用了此漏洞。
需要注意的是,此漏洞是为了培训目的而在WebGoat应用程序中植入的,是脆弱组件部分的一部分。在实际应用程序中,易受攻击的用例完全相同,而典型的区别是用户输入传播到易受攻击调用的方式。
Xstream开发作为WebGoat培训的一部分
此外,x射线结果显示了更多与同一Xstream版本相关的Xstream cve。在WebGoat项目中没有记录这些cvet.使用上下文分析,我们还成功检测并利用了以下关键漏洞:
- cve - 2021 - 21344
- cve - 2013 - 7285
- cve - 2021 - 21351
- cve - 2021 - 21350
- cve - 2021 - 21347
- cve - 2021 - 21346
- cve - 2021 - 21345
- cve - 2021 - 21342
cve - 2022 - 22965 (SpringShell)
最后一个值得注意的CVE报告是著名的SpringShell- Spring Web中的类加载器漏洞,导致远程代码执行。为了利用此漏洞,攻击者必须找到一个公开的web端点,该端点将请求参数绑定到pojo(普通旧Java对象)。
这个漏洞在于Spring框架的“数据绑定”机制。这种机制从请求URL或请求体中获取参数,并将它们分配给函数参数,或者在某些情况下分配给Java对象。
当将请求参数分配给Java对象时,存在安全风险,因为构建对象的一些“内部”参数永远不应该被外部控制(如' Class ', ' ClassLoader '和' ProtectionDomain ')。春天包含具体代码这将阻止攻击者为这些内部属性赋值。
不幸的是,从Java 9开始,由于引入了一个新的API (' class.getModule '),它可以绕过Spring的保护,并为' ClassLoader '属性的属性分配任意值。
让我们来看看当我们扫描WebGoat Docker图像时,这个漏洞的上下文分析结果:

JFrog x射线信息CVE-2022-22965
来自上下文分析的适用结果意味着在应用程序中存在Spring框架“数据绑定”机制的脆弱使用,或者换句话说,具有脆弱注释的函数(例如。' @GetMapping '),它接受简单的java类参数。
让我们来看看上下文分析的细目:
CVE-2022-22965的JFrog x射线上下文分析
正如我们所看到的,上下文分析以一种脆弱的方式提供了WebGoat.jar中所有使用Spring框架“数据绑定”机制的位置。

JFrog x射线扫描仪CVE-2022-22965的解释
以下是WebGoat源代码中上述检测到的易受攻击的数据绑定功能之一:

易受攻击的POJO数据绑定功能到“UserForm”对象。(摘自WebGoat Github)

易受攻击的POJO数据绑定功能到“UserForm”对象。(摘自WebGoat Github)
至于利用这个弱点,原始的利用出版针对Apache Tomcat的此漏洞,以及其他一些其他利用也发布了更多的网络应用程序,如Payara和Glassfish。在我们扫描的WebGoat图像中,易受攻击的网络服务器实际上是Undertow。虽然到目前为止还没有针对Undertow的公开利用,但可以假设攻击者能够针对这种情况开发一个有效的利用,因为适用性条件适用于上面所演示的上下文。因此,我们认为这个漏洞是可以利用的,应该作为一个严重的问题来对待。
分析报告的cve不适用
如前所述,JFrog的上下文分析提供了在应用程序上下文中确定漏洞是否可被利用的能力。上下文扫描程序在最保守的设置下运行,这允许对标记为不适用的漏洞进行极高置信度的适用性检测。
自动减少需要检查的漏洞数量的能力改变了游戏规则。这种能力可以帮助安全工程师根据漏洞的可利用性(而不仅仅是其严重程度)优先考虑甚至忽略漏洞。
让我们进一步研究这个问题。
根据上下文分析,总共有35例cve不适用:
| CVE ID | 组件 | 为什么CVE不适用 (上下文分析结果) |
|---|---|---|
| cve - 2016 - 1000027 | spring web | 脆弱类(简单)httpinvokerserviceexport从未实例化 |
| cve - 2017 - 11462 | krb5 | 没有发现对gssapi的脆弱函数的引用 |
| cve - 2017 - 12652 | libpng | 没有找到对易受攻击函数的引用 |
| cve - 2017 - 14062 | libpng | 没有找到对易受攻击函数的引用 |
| cve - 2017 - 15088 | krb5 | 没有找到对易受攻击函数的引用 |
| cve - 2017 - 15670 | libc6 | 脆弱的函数glob/glob64从未被调用 |
| cve - 2017 - 15804 | libc6 | 脆弱的函数glob/glob64从未被调用 |
| cve - 2017 - 18269 | libc6 | 脆弱的函数memmove从未被调用 |
| cve - 2018 - 11236 | libc6 | 脆弱的函数realpath永远不会被调用 |
| cve - 2018 - 6485 | libc6 | 没有找到对易受攻击函数的引用 |
| cve - 2018 - 6551 | libc6 | 没有找到对易受攻击函数的引用 |
| cve - 2019 - 12900 | libbzip2 | 脆弱函数BZ2_bzDecompress从未被调用 |
| cve - 2019 - 20367 | libbsd | 脆弱函数nlist永远不会被调用 |
| cve - 2019 - 8457 | sqlite3 | 脆弱模块rtree未启用 |
| cve - 2019 - 9169 | libc6 | 没有找到对易受攻击函数的引用 |
| cve - 2020 - 10683 | dom4j | 没有找到对易受攻击函数的引用 |
| cve - 2020 - 11656 | sqlite3 | 漏洞模块SQLITE_DEBUG未启用 |
| cve - 2020 - 1745 | undertow-core | 在Undertow的配置中未启用AJP连接器 |
| cve - 2021 - 33574 | glibc | 脆弱的mq_notify函数永远不会被调用 |
| cve - 2021 - 3520 | liblz4 | 脆弱函数LZ4_decompress_safe_partial从未被调用 |
| cve - 2021 - 35942 | glibc | 脆弱的函数wordexp从未被调用 |
| cve - 2022 - 1471 | snakeyaml | 脆弱函数Yaml。Load没有被调用 |
| cve - 2022 - 21724 | postgresql | 易受攻击的功能DriverManager。getConnection从不使用外部输入调用 |
| cve - 2022 - 22822 | libexpat | 没有找到对易受攻击函数的引用 |
| cve - 2022 - 22823 | libexpat | 没有找到对易受攻击函数的引用 |
| cve - 2022 - 22824 | libexpat | 没有找到对易受攻击函数的引用 |
| cve - 2022 - 22978 | spring security | 没有找到对易受攻击函数的引用 |
| cve - 2022 - 23218 | glibc | 脆弱函数svcunix_create从未被调用 |
| cve - 2022 - 23219 | glibc | 脆弱的函数clnt_create从未被调用 |
| cve - 2022 - 23852 | libexpat | 没有找到对易受攻击函数的引用 |
| cve - 2022 - 25235 | libexpat | 没有找到对易受攻击函数的引用 |
| cve - 2022 - 25236 | libexpat | 没有找到对易受攻击函数的引用 |
| cve - 2022 - 25315 | libexpat | 没有找到对易受攻击函数的引用 |
| cve - 2022 - 26520 | postgresql | 易受攻击的函数setLoggerFile, setUrl, setUrl, setProperty, connect, getConnection从不使用外部输入调用 |
| cve - 2022 - 27404 | libfreetype | 没有找到对易受攻击函数的引用 |
让我们来看看上面列表中的两个例子:
cve - 2022 - 21724
第一个CVE是PostgreSQL中不充分的输入验证。此漏洞允许远程攻击者造成不安全的反序列化。为了利用此漏洞,攻击者需要向易受攻击的函数' DriverManager.getConnection() '提供恶意类。换句话说,应用程序必须以易受攻击的方式使用PgJDBC,并将不受控制的输入传递给易受攻击的函数' DriverManager.getConnection() '。
JFrog x射线信息CVE-2022-21724
此漏洞的上下文扫描程序检查带有不受控制输入的“getConnection()”调用。PgJDBC没有易受攻击的使用,这意味着这个漏洞是不可利用的。
CVE-2022-21724的JFrog x射线上下文分析
cve - 2022 - 23852
第二个CVE是libexpat中的xmlparse.c中的整数溢出。此漏洞允许远程攻击者可能造成未指定的影响。为了利用此漏洞,系统中必须存在以易受攻击的方式使用库的代码(与libexpat易受攻击的api交互)。

JFrog x射线信息CVE-2022-23852, x射线
此漏洞的上下文扫描程序会检查任何使用libexpat易受攻击api的第一方二进制文件(XML_GetBuffer, XML_Parse)。因此,不使用这些易受攻击的api意味着此漏洞不可利用。
CVE-2022-23852的JFrog x射线上下文分析
结论
许多cve被证明是不适用的。这是否意味着这个“故意不安全的应用程序”最终是安全的?
上面的扫描结果表明,在上下文分析的关键cve中,只有10/60是实际适用的。考虑到WebGoat是一个故意构建的不安全应用程序,这可能会令人相当惊讶。我们可能期望一个合成的易受攻击的应用程序具有大量可利用的cve。事实上,这些发现与我们迄今为止对cve的了解是一致的——在2023年,在大多数情况下,开发cve的适用性条件都不满足。
发现这么多不可利用的关键cve的第一个原因是,WebGoat设计用于包含应用程序第一方代码中不安全的逻辑缺陷,而不是由第三方易受攻击的组件引起的安全问题。因此,可利用的cve的数量,以及潜在可利用的cve,不受WebGoat是一个易受攻击的应用程序这一事实的影响。
此外,正如我们所知,WebGoat中存在一个易受攻击的组件,就像在任何其他应用程序中一样,并不足以使漏洞被利用。其他参数(如配置、运行环境以及应用程序如何使用易受攻击组件)是易受攻击组件可利用性的最主要影响因素。因此,尽管存在大量的cve和易受攻击的组件,但实际上只有少数是可利用的。WebGoat的作者根本没有设置易受攻击的条件,比如使用易受攻击的第三方功能,也没有配置系统来执行易受攻击的组件。
为什么发现了未登记的可利用cve ?
上面的上下文分析结果报告的cve在WebGoat项目的培训部分中甚至没有被记录为已知的安全问题(参见上面的Xstream cve列表)。在一个故意不安全的应用程序中存在未知的可利用漏洞可能是具有讽刺意味的,但实际上是完全有道理的,因为即使正在开发不安全的应用程序,它也总是会有更多未知的安全问题特别是在第三方cve的世界中,新的漏洞不断被披露。这强调了将安全性集成为开发和CI/CD过程的一部分的重要性,使用自动化工具并自动分析所报告的cve在最终产品上的适用性。
上下文分析与JFrog高级安全
这项研究是由最新的“上下文分析”功能驱动的JFrog高级安全公司宣布JFrog x射线功能集。该版本将JFrog Xray从其熟悉的软件组合分析空间带入到先进的软件供应链安全.
上下文分析使用工件的上下文来确定漏洞是否适用。此过程涉及在容器映像上运行自动上下文扫描程序,以确定可达路径和已分析漏洞的配置设置。Xray自动验证高影响和非常高影响的漏洞,例如那些具有利用先决条件的漏洞,并提供上下文分析信息,以帮助确定哪些漏洞适用或不适用。这为开发人员节省了大量的时间和精力。
- 通过只修复可用的漏洞来节省开发人员的时间
- 以与攻击者相同的方式分析完成的代码(二进制)
- 了解哪些cve是可以利用的,以及它们的潜在影响
- 在完整的工件、build或Release Bundle上下文中测试一个漏洞
- 在工件、构建或发布包的上下文中启用操作和补救