CVE-2021-44521:利用Apache Cassandra用户定义函数进行远程代码执行

Apache Cassandra用户定义函数JFrog的安全研究团队最近披露了一个RCE(远程代码执行)问题Apache Cassandra,这已被分配给cve - 2021 - 44521(CVSS 8.4)。这个Apache安全漏洞很容易被利用,并且有可能对系统造成严重破坏,但幸运的是,它只出现在Cassandra的非默认配置中。

Cassandra是一个高度可伸缩的分布式NoSQL数据库,由于其分布式特性的好处而非常受欢迎。Cassandra被Netflix、Twitter、Urban Airship、Constant Contact、Reddit、Cisco、OpenX、Digg、CloudKick、Ooyala等企业使用。Cassandra在DevOps和云原生开发圈中也非常受欢迎,这可以从它的支持中看出CNCF项目(例如Jaeger).
一些公司甚至提供基于Cassandra的基于云的交钥匙解决方案,例如DataStax(无服务器、多云DBaaS)。

在这篇博文中,我们将介绍我们如何发现RCE的背景安全漏洞,提供有关PoC漏洞的详细信息,并分享建议的修复和缓解选项。

udf和Nashorn

Cassandra提供了创建用户定义函数(udf)的功能,以对数据库中的数据执行自定义处理。

默认情况下,可以用Java和JavaScript编写Cassandra udf。在JavaScript中它使用NashornJava运行时环境(JRE)是一个运行在Java虚拟机(JVM)之上的JavaScript引擎。

当接受不受信任的代码时,不能保证Nashorn是安全的。因此,任何允许此类行为的服务必须始终将Nashorn的执行包装在沙盒中¹。

例如,运行下面的Nashorn JavaScript代码允许执行任意shell命令:

java.lang.Runtime.getRuntime()。exec(“砍”)

Cassandra的开发团队决定在UDF执行过程中实现一个自定义的沙箱,它使用两种机制来限制UDF代码:

  1. 的过滤机制白名单和黑名单(只有匹配白名单的类不匹配的黑名单是允许的):
    private static final String[] allowedPatterns = {"com/google/common/reflect/TypeToken", "java/io/IOException.class", "java/io/Serializable.class", "java/lang/", "java/math/", "java/net/Inet4Address.class", "java/net/Inet4Address.class",…private static final String[] disallowedPatterns = {"com/datastax/driver/core/Cluster.class", "com/datastax/driver/core/Metrics.class", " com/datastax/driver/core/netttyoptions.class ", "com/datastax/driver/core/Session.class", "com/datastax/driver/core/Statement.class", "com/datastax/driver/core/TimestampGenerator.class", "java/lang/Compiler.class", "java/lang/InheritableThreadLocal.class", "java/lang/Package.class", "java/lang/Process.class",…
  2. 使用Java安全管理器来执行权限执行的代码(在默认配置中,不授予任何权限)

一些项目,如NashornEscape实现一个沙盒来确保Nashorn代码的执行

通过Nashorn访问Java类

Nashorn引擎通过使用Java.type
例如:var System = Java.type("java.lang.System")将允许我们访问使用系统变量。

具有足够权限的用户可以使用创建函数查询例如,这个函数将把它的输入输出到控制台:

创建或替换函数print(name text)返回NULL ON NULL INPUT返回text LANGUAGE javascript AS $$var System = Java.type("java.lang.System")System.out.println(名字),名称$ $;

用户可以使用下面的SELECT查询调用该函数。

从表中打印姓名

什么时候可以利用CVE-2021-44521 ?

当我们在研究Cassandra UDF沙盒实现时,我们意识到特定(非默认)配置选项的混合可能会让我们滥用Nashorn引擎,逃离沙盒并实现远程代码执行。这是我们报告的漏洞CVE-2021-44521。

Cassandra部署容易受到CVE-2021-44521的攻击cassandra.yaml配置文件包含以下定义:

Enable_user_defined_functions: true enable_scripted_user_defined_functions: true enable_user_defined_functions_threads: false

注意,这些是唯一需要的非默认配置选项,因为启用udf时,允许所有用户创建和执行任意udf。这包括匿名登录,默认启用(身份验证= AllowAllAuthenticator).

注意,Cassandra也可以通过Config.java配置文件,它支持与上面相同的标志。

公共布尔enable_user_defined_functions = false;...

前两个标志启用了对Java和JavaScript²的UDF支持。
enable_user_defined_functions_threads是利用CVE-2021-44521漏洞的关键。

²Cassandra还支持在udf中使用其他脚本语言,如Python

JFrog产品是否易hth华体会最新官方网站受CVE-2021-44521攻击

JFrog产hth华体会最新官方网站品不使用Apache Cassandra,因此不容易受到CVE-2021-44521的攻击。

解释enable_user_defined_functions_threads

从源代码(Config.java):

解释enable_user_defined_functions_threads

enable_user_defined_functions_threads设为真正的默认情况下,这意味着每个被调用的UDF函数将在不同的线程中运行,使用没有任何权限的安全管理器—我们将在后面的小节中介绍针对此默认配置的DoS攻击。

当该选项设置为,所有被调用的UDF函数都在Cassandra中运行守护进程的安全管理器一些权限。我们将展示如何滥用这些权限来实现沙盒转义和RCE。

请注意,源代码中的文档暗示关闭该值是不安全的,但出于拒绝服务的考虑。我们将演示关闭此值直接导致远程代码执行。

RCE通过沙箱逃生

UDF沙箱不会直接允许我们在服务器上执行代码,例如通过调用.exec java.lang.Runtime.getRuntime () ()
在研究沙盒执行时,我们发现我们可以使用至少两种方法逃离沙盒:

  1. 滥用Nashorn引擎实例
  2. 负载loadLibrary功能

因为Cassandra的类过滤机制允许访问,这两种方法都可以用来逃离沙盒。

方法1 -滥用Nashorn引擎实例

为了完全逃离沙盒,我们必须:

  1. 禁用类过滤机制
  2. 运行时没有安全管理器

enable_user_defined_functions_threads设为,我们的UDF代码在守护线程中运行,该守护线程具有调用的权限setSecurityManager!这立即允许我们关闭安全管理器,所以现在我们只需要绕过类过滤机制。

当在Nashorn上运行JavaScript代码时,我们可以使用this.engine来访问Nashorn实例引擎。如载于小心犀牛这实际上允许我们通过创建一个新的脚本引擎,它不受类过滤机制的限制。

但是,较新的Java版本(8u191及更高版本)已经收到了阻止访问的缓解this.engine当一个安全经理是活跃的。
对于攻击者来说幸运的是——正如我们之前所建立的,我们可以调用setSecurityManager禁用安全管理器,随后访问this.engine

把所有的东西放在一起,PoC查询可能看起来像这样:

$$ var System = Java.type("java.lang.System");System. setsecuritymanager (NULL);this.engine.factory. scriptenengine .eval('java.lang.Runtime.getRuntime(). .Exec ("touch hacked")');name $$;

此查询将通过将安全管理器设置为关闭安全管理器然后创建一个不受类过滤机制限制的新脚本引擎,在Cassandra服务器上运行任意shell命令。

PoC正在运行

执行PoC是为了在Cassandra服务器上创建一个名为“hacked”的新文件:

PoC正在运行

方法二:java.lang。系统’s load and loadLibrary functions

除了Nashorn转义技术之外,还有更多的库函数没有被类过滤器过滤,当安全管理器关闭时,这些函数可能被滥用于代码执行。

例如,负载方法允许我们通过指定绝对路径来加载任意共享对象。

假设攻击者可以以某种方式将恶意共享对象文件上传到易受攻击的系统(只要攻击者知道上传文件的完整路径,那么在受害机器上的上传目录是什么并不重要)负载方法可用于加载库,库可以将任意代码作为其入口例程的一部分运行。

其他值得注意的问题

在我们的研究中,我们发现并披露了一些值得一提的问题,当在一些非默认(尽管合理)配置上运行Cassandra(和相关工具)时。这些选项被记录为不安全的但是,我们想强调这些问题及其确切的影响,以便供应商意识到不要在可公开访问的网络中部署此类配置。

Cassandra UDF DoS

当启用UDF函数并且enable_user_defined_functions_threads标志设置为真正的(默认值)恶意用户可以创建一个UDF来关闭Cassandra守护进程。这是由于UDF超时机制的行为造成的,该机制由user_defined_function_fail_timeout国旗。

如果UDF函数运行的时间超过了分配的时间,那么整个Cassandra守护进程将关闭(而不仅仅是运行UDF的线程)。尽管这是有文档记录的行为,但是攻击者可以通过创建一个永远循环的函数来轻松地DoS整个数据库而(真)

我们目前不知道有什么直接的方法来缓解这个问题(改变user_function_timeout_policy国旗的忽略可能导致更严重的DoS),不过可以通过确保低权限用户不能创建任意的UDF函数来间接缓解这个问题(请参阅下面的“可能的缓解措施”)。

通过不安全对象反序列化强调RCE

Cassandra包含一个叫做cassandra-stressd用于对数据库进行压力测试。这个工具已被Apache归档作为一个“不安全”的工具。

这是一个面向网络的工具,默认情况下只监听本地主机接口。

但是,这个工具可以通过提供- h标志和IP地址。

直接反序列化来自套接字的输入StressServer.java,这意味着攻击者可能会提供一个序列化的“gadget”对象,导致在反序列化时执行任意代码:

公共静态类应力线程扩展线程{私有最终Socket套接字;公共压力线程(Socket客户端){这个。Socket = client;}公共无效运行(){尝试{//任意反序列化!ObjectInputStream in = new ObjectInputStream(socket.getInputStream());...

这个问题的利用取决于正在运行的Cassandra实例的类路径中的可用类。

我们敦促用户确保他们没有运行cassandra-stressd- h指向外部接口的标志。

如何修复CVE-2021-44521?

我们强烈建议所有Apache Cassandra用户升级到以下解决CVE-2021-44521的版本之一:

3.0.xusers should upgrade to 3.0.26
3.11.xusers should upgrade to 3.11.12
4.0.xusers should upgrade to 4.0.2

Apache的修复增加了一个新的标志-allow_extra_insecure_udfs(默认为false),不允许关闭安全管理器并阻止访问

希望udf与沙箱外的元素进行交互(并且不介意潜在的安全风险)的用户可以打开标志来恢复遗留行为(不推荐!)。

如何缓解CVE-2021-44521?

对于无法升级Cassandra实例的用户,我们建议采用以下缓解措施:

  1. 如果udf没有被积极使用,可以通过设置完全禁用它们enable_user_defined_functions(这是默认值)
  2. 如果需要udf,设置enable_user_defined_functions_threads真正的(这是默认值)
  3. 通过移除以下权限,可以移除不受信任用户的创建、修改和执行函数的权限:所有的功能键空间中的所有函数函数创建改变执行查询。

可以使用以下查询来完成此操作role_name到理想的角色。

在所有函数上撤销CREATE,所有在KEYSPACE中的函数,FUNCTION from< role_name >;撤销键空间中所有的CREATE函数< role_name >;撤销CREATE ON函数< role_name >;撤销对所有函数的ALTER,所有在KEYSPACE中的函数< role_name >;撤销键空间中所有函数的ALTER< role_name >;撤销ALTER ON FUNCTION< role_name >;撤销对所有函数执行,所有键空间中的函数,函数从< role_name >;撤销键空间中所有函数的执行< role_name >;撤销对函数的执行< role_name >;

结论和致谢

总之,我们强烈建议您将Cassandra升级到最新版本,以避免可能利用CVE-2021-44521。

我们要感谢Cassandra的维护者及时确认并修复了这个问题,并负责任地为这个问题创建了一个CVE。

使用JFrog Xray查找易受攻击的版本

除了暴露新的安全漏洞和威胁之外,JFrog还通过自动安全扫描,为开发人员和安全团队提供了访问其软件最新相关信息的便利,包括Apache Cassandra开源库版本和相关cve的使用JFrog x光SCA工具。