北京時間2018年8月22日,Apache官方發布通告公布了Struts2中一個遠程代碼執行漏洞(CVE-2018-11776,CNVD-2018-15894,CNNVD-201808-740)。該漏洞在兩種情況下存在,第一,當xml配置中未設置namespace 值,且上層動作配置(action(s) configurations)中未設置或使用通配符namespace值時,可能導致遠程代碼執行漏洞的發生。第二,使用未設置 value和action值的url標簽,且上層動作配置中未設置或使用通配符namespace值,同樣可能導致遠程代碼執行。
受影響版本
不受影響版本
技術防護方案
通過配置文件檢測
此漏洞產生于低版本的Struts組件,當應用系統引入相關組件時,將存在被攻擊者遠程攻擊的風險。建議由應用開發人員排查引入組件的版本是否處于受影響范圍之內。
查看Maven配置文件pom.xml中關于組件的版本。如:
<dependency><groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId> <version> 2.5.13 </version> </dependency> |
若紅字所示版本在受影響范圍內,則請用戶盡快升級Struts2至最新版本,以保證長期有效的防護。
通過組件名檢測
Linux系統下可使用以下命令查找當前使用的struts2-core包,通過查看其文件名,判斷當前版本。
find / -name struts2-core-*.jar |
若紅框處版本號在受影響范圍內,則請用戶盡快升級至最新版本。
官方已在最新版本中修復了此漏洞,請用戶盡快將Struts升級至官方修復版本,2.3.*的用戶請升級至2.3.35;2.5.*的用戶請升級至2.5.17。下載鏈接如下所示:
Struts2.3.35:
http://mirrors.hust.edu.cn/apache/struts/2.3.35/struts-2.3.35-all.zip
Struts2.5.17:
http://mirrors.hust.edu.cn/apache/struts/2.5.17/struts-2.5.17-all.zip
排查所有Struts 2的配置文件,如struts.xml,為沒有定義namespace命名空間的package節點添加命名空間配置。
<package name=”user” namespace=”/user” extends=”struts-default”><action name=”login”>
</action> </package> |
綠盟科技防護建議
手機端訪問地址:
https://cloud.nsfocus.com/megi/holes/hole_struts2_2018_8_23.html
PC端訪問地址:
https://cloud.nsfocus.com/#/krosa/views/initcdr/productandservice?service_id=1026
2、內網資產可以使用綠盟科技的入侵檢測系統(IDS),遠程安全評估系統(RSAS V5、V6)和Web應用漏洞掃描系統(WVSS)進行檢測。
http://update.nsfocus.com/update/listIds
http://update.nsfocus.com/update/listAurora/v/5
http://update.nsfocus.com/update/listRsasDetail/v/vulweb
通過上述鏈接,升級至最新版本即可進行檢測!
使用綠盟科技防護類產品進行防護
http://update.nsfocus.com/update/listIps
http://update.nsfocus.com/update/listNf
http://update.nsfocus.com/update/wafIndex
通過上述鏈接,升級至最新版本即可進行防護!
檢測產品 |
升級包 / 規則版本號 |
IDS | 5.6.7.732、5.6.8.732、5.6.9.18479、5.6.10.18479 |
RSAS V5 web 插件包 | V051758 |
RSAS V6 web 插件包 | V6.0R02F00.1004 |
WVSS V6 web 插件包 | V6.0R03F00.113 |
防護產品 |
升級包 / 規則版本號 |
IPS | 5.6.7.732、5.6.8.732、5.6.9.18479、5.6.10.18479 |
NF | 5.6.7.732、6.0.1.732 |
WAF | v6.0.5.1.39591、v6.0.7.0.39590、v6.0.6.1.39589 |
具體配置詳見附錄
技術分析
如圖所示,補丁主要添加了cleanNamespaceName方法,該方法通過白名單的方式來驗證namespace是否合法,從官方描述和漏洞修復方式來看,該漏洞應該是一個Ognl的表達式注入漏洞。
漏洞發布幾個小時之后,漏洞發現作者公布了整個發現過程,并且詳細分析了一種漏洞情形: https://lgtm.com/blog/apache_struts_CVE-2018-11776 。按照該博客的說法,拉取struts2-showcase項目作為示例,修改struts-actionchaining.xml,具體如下:
在這種情況下,所有到actionChain1.action的請求的返回結果都會指向register2,并且執行鏈會到ServletActionRedirectResult.execute方法中,具體如下:
從上圖可以看出,通過namespace字段,污染了tmpLocation字典,并且設置為了預期的執行的PoC,這也是補丁中為什么要凈化namespace的原因,繼續跟蹤namespace的去向,執行鏈會到ServletActionRedirectResult的父類的父類StrutsResultSupport.execute方法中,具體如下圖:
這里有個conditionParse方法,這個方式就是使用Ognl表達式來計算數據值,在系統中用得非常多,而且在一些歷史漏洞中,也應該由它來背鍋,當然最大的鍋還是struts官方,每次漏洞出在哪就修在哪,典型的頭痛醫頭,腳痛醫腳。方法實現如下圖所示:
在這個方法中會使用到TextParseUtil.translateVariables方法,繼續跟蹤,調用棧進入OgnlTextParser中的evaluate方法,首先會判斷傳入的表達式是否合法,比如是否能找到${}或者%{}對,接著調用evaluator.evaluate求值,求值過程非常復雜,總得來說就是鏈式執行過程,具體如下調用棧:
從上圖也可以看出最頂層就是通過反射的方式來調用ProcessBuilder的構造函數,中間部分就是鏈式執行過程中牽涉到一些操作。
我們可以看下求值過程中參數的一些情況。來查看Ognl安全加固的一些變化,具體如下圖:
主要是黑名單上又添加了一些類,分別是:
class ognl.DefaultMemberAccess
class com.opensymphony.xwork2.ognl.SecurityMemberAccess
class java.lang.ProcessBuilder
分析就結束了,計算器還是要彈的,如下圖:
相關鏈接如下:
https://cwiki.apache.org/confluence/display/WW/S2-057
完整版防護方案下載