華文網

Apache Struts2 遠端代碼執行漏洞(S2-048)技術分析與防護方案

綜述

2017年7月7日,Apache Struts發佈最新的安全公告,Apache Struts 2.3.x的strus1外掛程式存在遠端代碼執行的高危漏洞,漏洞編號為CVE-2017-9791(S2-048)。攻擊者可以構造惡意的欄位值通過Struts2的Struts1的外掛程式,遠端執行代碼。

相關連結如下:

https://cwiki.apache.org/confluence/display/WW/S2-048

威脅影響

全球分佈圖

(資料來自綠盟科技威脅情報中心NTI)

國內分佈圖

(資料來自綠盟科技威脅情報中心NTI)

全球排行

(資料來自綠盟科技威脅情報中心NTI)

國內排行

(資料來自綠盟科技威脅情報中心NTI)

防護方案

官方解決方案

臨時修復方案

開發者通過使用資源調用方式替代原始值傳遞方式給ActionMessage的方式。

如下所示:

不要使用如下的方式:

在非必要的情況下禁用struts2-struts1-plugin外掛程式。將struts2-struts1-plugin-2.3.x.jar檔從 “/WEB-INF/lib”目錄中移動到其他資料夾或者刪除。

技術防護方案

綠盟科技檢測方案

1、如果您不清楚是否受此漏洞影響,公網資產可使用綠盟雲緊急漏洞線上檢測,檢測位址如下:

https://cloud.nsfocus.com/#/krosa/views/initcdr/productandservice?page_id=12

2、內網資產可以使用綠盟科技的遠端安全評估系統(RSAS V6 )或 Web應用漏洞掃描系統(WVSS) 進行檢測。

遠端安全評估系統(RSAS V6)

Web應用漏洞掃描系統(WVSS)

通過上述連結,升級至最新版本即可進行檢測!

綠盟科技防護方案

入侵防護系統(IPS)

入侵偵測系統(IDS)

下一代防火牆系統(NF)

Web應用防護系統(WAF)

通過上述連結,升級至最新版本即可進行防護!

綠盟科技服務方案

使用綠盟科技防護類產品(IPS/IDS/NF/WAF)進行防護

◆ 入侵防護系統(IPS)

◆ 入侵偵測系統(IDS)

◆ 下一代防火牆系統(NF)

◆ Web應用防護系統(WAF)

綠盟科技提供專業的安全技術服務,

全方位的保障客戶應用系統安全,避免受此漏洞影響。

短期服務:我們可以提供應急服務,服務內容包括對客戶應用系統有針對性的提供修復建議,保障客戶系統的安全升級。

中長期服務:結合綠盟科技檢測與防護產品,提供7*24的安全運營服務,在客戶應用系統遭到安全威脅時第一時間通知客戶,並定期進行安全檢測,針對安全風險提供專業的解決方案。

技術分析

漏洞簡介

Apache Struts2.3.x系列版本中struts2-struts1-plugin存在遠端代碼執行漏洞,進而導致任意代碼執行。

漏洞分析

官方的漏洞描述如下:

從官方的漏洞描述可以知道,這個漏洞本質上是在struts2-struts1-plugin這個jar包上。這個庫是將struts1的action封裝成struts2的action以便在strut2上使用。本質問題出在struts2-struts1-plugin包Struts1Action.java檔中,Struts1Action類中的execute方法調用了getText函數,這個函數會執行ognl運算式,更為嚴重的是getText的輸入內容是攻擊者可控的。以下會基於struts2的官方示例進行分析。

Struts1Action的execute方法代碼如下,從紅框中資訊可以看出其實質是調用SaveGangsterAction.execute方法,然後再調用getText(msg.getKey….)。

在struts2-showcase的integration模組下有SaveGangsterAction類的execute方法(位於SaveGangsterAction.java檔)用於實現。具體如下:

在這個方法中就帶入有毒參數gforn.getName放到了messages結構中,gform.getName的值是從用戶端獲取的。

Gangsterform.getName的實現如下:

這裡傳入了${1+1},有毒參數已經帶入,就差ognl運算式,繼續回到Struts1Action類的execute方法下半部分,有getText的入口,能清晰看到參數已經被污染,具體如下圖:

下面進入getText的實現函數,這個調用棧比較深,首先我們給出棧圖:

從Struts1action.execute函數開始,到ActionSupport的getText方法,方法如下:

進入TextProviderSuppport.getText,調用其另一個重載類方法getText,示例如下:

進入LocalizeTextUtil.findText,繼續分析其實現:從名字上也能看出其是根據使用者的配置做一些當地語系化的操作。代碼如下:

到這裡就能發現這就是一個很典型的ognl運算式入口,先是得到一個valueStack,再繼續遞迴得到ognl運算式的值。官方參考連結:

https://struts.apache.org/maven/struts2-core/apidocs/com/opensymphony/xwork2/util/LocalizedTextUtil.html

最後附上一個簡單的測試用例圖:

聲明

本安全公告僅用來描述可能存在的安全問題,綠盟科技不為此安全公告提供任何保證或承諾。

由於傳播、利用此安全公告所提供的資訊而造成的任何直接或者間接的後果及損失,均由使用者本人負責,綠盟科技以及安全公告作者不為此承擔任何責任。

綠盟科技擁有對此安全公告的修改和解釋權。

如欲轉載或傳播此安全公告,必須保證此安全公告的完整性,包括版權聲明等全部內容。未經綠盟科技允許,不得任意修改或者增減此安全公告內容,不得以任何方式將其用於商業目的。

關於綠盟科技

北京神州綠盟資訊安全科技股份有限公司(簡稱綠盟科技)成立於2000年4月,總部位於北京。在國內外設有30多個分支機搆,為政府、運營商、金融、能源、互聯網以及教育、醫療等行業用戶,提供具有核心競爭力的安全產品及解決方案,説明客戶實現業務的安全順暢運行。

基於多年的安全攻防研究,綠盟科技在網路及終端安全、互聯網基礎安全、合規及安全管理等領域,為客戶提供入侵偵測/防護、抗拒絕服務攻擊、遠端安全評估以及Web安全防護等產品以及專業安全服務。

北京神州綠盟資訊安全科技股份有限公司於2014年1月29日起在深圳證券交易所創業板上市交易,股票簡稱:綠盟科技,股票代碼:300369。

請點擊螢幕右上方“…”

NSFOCUS-weixin

從紅框中資訊可以看出其實質是調用SaveGangsterAction.execute方法,然後再調用getText(msg.getKey….)。

在struts2-showcase的integration模組下有SaveGangsterAction類的execute方法(位於SaveGangsterAction.java檔)用於實現。具體如下:

在這個方法中就帶入有毒參數gforn.getName放到了messages結構中,gform.getName的值是從用戶端獲取的。

Gangsterform.getName的實現如下:

這裡傳入了${1+1},有毒參數已經帶入,就差ognl運算式,繼續回到Struts1Action類的execute方法下半部分,有getText的入口,能清晰看到參數已經被污染,具體如下圖:

下面進入getText的實現函數,這個調用棧比較深,首先我們給出棧圖:

從Struts1action.execute函數開始,到ActionSupport的getText方法,方法如下:

進入TextProviderSuppport.getText,調用其另一個重載類方法getText,示例如下:

進入LocalizeTextUtil.findText,繼續分析其實現:從名字上也能看出其是根據使用者的配置做一些當地語系化的操作。代碼如下:

到這裡就能發現這就是一個很典型的ognl運算式入口,先是得到一個valueStack,再繼續遞迴得到ognl運算式的值。官方參考連結:

https://struts.apache.org/maven/struts2-core/apidocs/com/opensymphony/xwork2/util/LocalizedTextUtil.html

最後附上一個簡單的測試用例圖:

聲明

本安全公告僅用來描述可能存在的安全問題,綠盟科技不為此安全公告提供任何保證或承諾。

由於傳播、利用此安全公告所提供的資訊而造成的任何直接或者間接的後果及損失,均由使用者本人負責,綠盟科技以及安全公告作者不為此承擔任何責任。

綠盟科技擁有對此安全公告的修改和解釋權。

如欲轉載或傳播此安全公告,必須保證此安全公告的完整性,包括版權聲明等全部內容。未經綠盟科技允許,不得任意修改或者增減此安全公告內容,不得以任何方式將其用於商業目的。

關於綠盟科技

北京神州綠盟資訊安全科技股份有限公司(簡稱綠盟科技)成立於2000年4月,總部位於北京。在國內外設有30多個分支機搆,為政府、運營商、金融、能源、互聯網以及教育、醫療等行業用戶,提供具有核心競爭力的安全產品及解決方案,説明客戶實現業務的安全順暢運行。

基於多年的安全攻防研究,綠盟科技在網路及終端安全、互聯網基礎安全、合規及安全管理等領域,為客戶提供入侵偵測/防護、抗拒絕服務攻擊、遠端安全評估以及Web安全防護等產品以及專業安全服務。

北京神州綠盟資訊安全科技股份有限公司於2014年1月29日起在深圳證券交易所創業板上市交易,股票簡稱:綠盟科技,股票代碼:300369。

請點擊螢幕右上方“…”

NSFOCUS-weixin