作者:xxhzz@星闌科技PortalLab
原文鏈接:https://mp.weixin.qq.com/s/ajggDNF__M4pC_pCf5eTsw

漏洞描述

7月18號,Apache發布安全公告,修復了一個Apache Spark中存在的命令注入漏洞。漏洞編號:CVE-2022-33891,漏洞威脅等級:高危。Apache Spark UI提供了通過配置選項Spark .acl .enable啟用acl的可能性。使用身份驗證過濾器,這將檢查用戶是否具有查看或修改應用程序的訪問權限。如果啟用了acl, HttpSecurityFilter中的代碼路徑可以允許某人通過提供任意用戶名來執行模擬。 惡意用戶可能能夠訪問權限檢查功能,該功能最終將根據他們的輸入構建一個 Unix shell 命令并執行它。這將導致任意 shell 命令執行。

相關介紹

Apache Spark是美國阿帕奇(Apache)軟件基金會的一款支持非循環數據流和內存計算的大規模數據處理引擎。Spark優點在于能更好地適用于數據挖掘與機器學習等需要迭代的MapReduce的算法。

利用范圍

Spark Core - Apache <=3.0.3

3.1.1 <= Spark Core - Apache <=3.1.2

3.2.0 <= Spark Core - Apache <=3.2.1

漏洞分析

環境搭建

在官網(https://archive.apache.org/dist/spark)下載Apache Spark 3.2.1版本進行漏洞復現分析。

漏洞觸發的關鍵在于是否啟用ACL,使用身份驗證過濾器。

啟用ACL的兩種方式:

1、通過設置選項 spark.acls.enable 啟用 。

2、運行spark-shell時,通過-c參數啟動。

為更好分析漏洞,在運行spark-shell前,需在其中進行遠程調試配置

export SPARK_SUBMIT_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"

配置完成后運行spark-shell,并開啟ACL

./spark-shell --conf spark.acls.enable=true

漏洞原理

根據diff(https://github.com/apache/spark/pull/36315/files)分析。

如上所示,使用命令拼接且沒有做任何處理,而在修復的版本中直接刪除了ShellBasedGroupsMappingProvider函數中對bash的調用。

動態分析

了解漏洞原理之后,就該考慮如何觸發漏洞。

在Apache spark啟用ACL后,會通過HttpSecurityFilter這個filter進行權限的校驗。

首先將斷點打在org.apache.spark.ui.HttpSecurityFilter#doFilter函數處。

在進入doFilter函數之后,首先會提取參數“doAs”的值,然后賦值給effectiveUser,進入org.apache.spark.SecurityManager#checkUIViewPermissions函數。

后續跟進一系列函數進行處理。

進入org.apache.spark.security.ShellBasedGroupsMappingProvider#getGroups函數時,username為傳入參數。

隨后進入org.apache.spark.security.ShellBasedGroupsMappingProvider#getUnixGroups函數。

在這里username進行了拼接處理,因為我們傳入的username參數可控,便形成了命令注入。

后續將通過executeAndGetOutput函數直接觸發傳入的命令,造成命令執行。

漏洞復現

通過反單引號和參數“doAs”成功命令注入。

修復建議

建議受影響的用戶升級到安全版本:Apache Spark 3.1.3、3.2.2 或 3.3.0 或更高版本。

參考材料

1.https://lists.apache.org/thread/p847l3kopoo5bjtmxrcwk21xp6tjxqlc

2.https://archive.apache.org/dist/spark/

3.https://github.com/apache/spark/pull/36315/files


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/2000/