Apache SkyWalking SQL注入漏洞復現分析 (CVE-2020-9483)


轉載自: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加入如下調試命令並運行。

 

1.png

 

下載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。至此,遠程調試環境搭建完成。

 

 

2.png

 

3、漏洞分析

 

由於openwall上對該漏洞描述很簡單,我們還是到github上尋找最近的issue。經過尋找我們發現了下面的pull request

(https://github.com/apache/skywalking/pull/4639/commits /2b6aae3b733f9dbeae1d6eff4f1975c723e1e7d1),

作者為wu-sheng和openwall上漏洞作者相印證,基本確定該處文件修改為漏洞成因。

 

修改涉及getLinearIntValues、getMultipleLinearIntValues、getThermodynamic等多個方法但修復手法類似,本文以getLinearIntValues為例進行分析。

 

3.png

 

可以看到ids參數由原先的直接拼接sql改為利用”?”進行占位預編譯,這是典型的SQL注入修復方法。我們向上搜索getLinearIntValues方法在哪里調用,

找到了org/apache/skywalking/oap/server/core/query/MetricQueryService.java的getLinearIntValues方法。

 

4.png

 

繼續向上追蹤getLinearIntValues,在org/apache/skywalking/oap/query/graphql/resolver /MetricQuery.java有了發現,並且MetricQuery類實現了GraphQLQueryResolver接口。

 

5.png

 

查詢文檔可知,支持GraphQL的查詢服務要實現GraphQLQueryResolver接口,該接口僅僅是一個聲明接口,沒有任何方法。同時,在schema配置文件metric.graphqls中,我們發現getLinearIntValues方法的查詢配置。

 

6.png

 

對GraphQL語法不熟悉的師傅可以通過如下例子進行熟悉:

 

7.png

 

HeroNameAndFriends是操作名稱,可用可不用,方便回溯查詢記錄。

 

$episode聲明一個變量,它的類型是Episode,默認值為JEDI。$withFriends同理。變量在后面通過JSON傳遞值。

 

firsthero是別名。為了避免沖突,可以取別名。

 

hero后面的(episode: $episode)表示參數,可以限定查詢的條件,參數的值可以為常量。

 

...on Droid和...on Human在整個查詢中,我們查詢的主題是hero(主角),而根據Query定義,hero返回的值由getHero函數和傳入參數episode決定,該函數返回一個對象,對象的type可能是Human或者Droid。這部分語法就是根據查詢返回對象的不同類型而輸出不同的結果。

 

通過上述知識我們可以構造如下請求,通過Union注入獲取當前用戶。

8.png

 

 

通過Debug發現ids參數引入惡意語句直接拼接到SQL語句中。同樣的,漏洞不僅僅只是存在getLinearIntValues方法,有多個方法可被利用,並且由於GraphQL接口默認是未授權的,漏洞危害較大建議用戶及時修復。

 

9.png

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM