轉載自:https://anquan.baidu.com/article/1097
1、前言
Apache SkyWalking 是一款開源的應用性能監控系統,包括指標監控,分布式追蹤,分布式系統性能診斷等。近日,百度雲安全團隊監測到國內某廠商發布了Apache SkyWalking SQL注入漏洞的風險通告,漏洞編號為CVE-2020-9483。當SkyWalking使用H2、MySQL或者TiDB作為存儲方案時,攻擊者可通過默認未授權的GraphQL接口構造惡意請求,從而獲取敏感數據。本文主要由github上的漏洞補丁分析而來,若有不正確的地方還請及時指正。
2、調試環境搭建
漏洞影響6.0.0-6.6.0、7.0.0版本,根據github上項目文檔,直接利用IDEA調試需要先進行編譯。本文為了簡單使用遠程調試的方式,在官網下載編譯好的6.5.0版本
(https://www.apache.org/dyn/closer.cgi/skywalking/6.5.0/apache-skywalking-apm-6.5.0.tar.gz),
編輯oapServ ice.sh加入如下調試命令並運行。
下載6.5.0源碼
(https://www.apache.org/dyn/closer.cgi/skywalking/6.5.0/apache-skywalking -apm-6.5.0-src.tgz)
導入IDEA,添加Remote Configuration,並設置module classpath為oap-server。至此,遠程調試環境搭建完成。
3、漏洞分析
由於openwall上對該漏洞描述很簡單,我們還是到github上尋找最近的issue。經過尋找我們發現了下面的pull request
(https://github.com/apache/skywalking/pull/4639/commits /2b6aae3b733f9dbeae1d6eff4f1975c723e1e7d1),
作者為wu-sheng和openwall上漏洞作者相印證,基本確定該處文件修改為漏洞成因。
修改涉及getLinearIntValues、getMultipleLinearIntValues、getThermodynamic等多個方法但修復手法類似,本文以getLinearIntValues為例進行分析。
可以看到ids參數由原先的直接拼接sql改為利用”?”進行占位預編譯,這是典型的SQL注入修復方法。我們向上搜索getLinearIntValues方法在哪里調用,
找到了org/apache/skywalking/oap/server/core/query/MetricQueryService.java的getLinearIntValues方法。
繼續向上追蹤getLinearIntValues,在org/apache/skywalking/oap/query/graphql/resolver /MetricQuery.java有了發現,並且MetricQuery類實現了GraphQLQueryResolver接口。
查詢文檔可知,支持GraphQL的查詢服務要實現GraphQLQueryResolver接口,該接口僅僅是一個聲明接口,沒有任何方法。同時,在schema配置文件metric.graphqls中,我們發現getLinearIntValues方法的查詢配置。
對GraphQL語法不熟悉的師傅可以通過如下例子進行熟悉:
HeroNameAndFriends是操作名稱,可用可不用,方便回溯查詢記錄。
$episode聲明一個變量,它的類型是Episode,默認值為JEDI。$withFriends同理。變量在后面通過JSON傳遞值。
firsthero是別名。為了避免沖突,可以取別名。
hero后面的(episode: $episode)表示參數,可以限定查詢的條件,參數的值可以為常量。
...on Droid和...on Human在整個查詢中,我們查詢的主題是hero(主角),而根據Query定義,hero返回的值由getHero函數和傳入參數episode決定,該函數返回一個對象,對象的type可能是Human或者Droid。這部分語法就是根據查詢返回對象的不同類型而輸出不同的結果。
通過上述知識我們可以構造如下請求,通過Union注入獲取當前用戶。
通過Debug發現ids參數引入惡意語句直接拼接到SQL語句中。同樣的,漏洞不僅僅只是存在getLinearIntValues方法,有多個方法可被利用,並且由於GraphQL接口默認是未授權的,漏洞危害較大建議用戶及時修復。
4、安全產品解決方案
百度安全智能一體化產品已支持CVE-2020-9483檢測和攔截,有需要的用戶可以訪問anquan.baidu.com聯系我們。
參考鏈接:
https://github.com/apache/skywalking/commit/4ce2e9e87398efcee4b646af1143f4dc2ae10dc7
https://www.openwall.com/lists/oss-security/2020/06/15/1