天天看點

Apache Struts2遠端代碼執行漏洞S2-048 CVE-2017-9791 分析和防護方案

今天,apache struts官方釋出公告,漏洞編号為s2-048 cve-2017-9791,公告稱struts2和struts1中的一個showcase插件可能導緻遠端代碼執行,并評價為高危漏洞。 綠盟科技釋出分析和防護方案,其中開放了線上檢測工具

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

通告全文如下

相關連結如下:

<a href="https://cwiki.apache.org/confluence/display/ww/s2-048">https://cwiki.apache.org/confluence/display/ww/s2-048</a>

影響版本: apache struts version: 2.3.x

不受影響的版本: apache struts version:2.5.10.1

Apache Struts2遠端代碼執行漏洞S2-048 CVE-2017-9791 分析和防護方案
Apache Struts2遠端代碼執行漏洞S2-048 CVE-2017-9791 分析和防護方案
Apache Struts2遠端代碼執行漏洞S2-048 CVE-2017-9791 分析和防護方案
Apache Struts2遠端代碼執行漏洞S2-048 CVE-2017-9791 分析和防護方案

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

官方已經釋出了版本更新,建議使用者更新到struts 2.5.10.1版本,下載下傳連結如下所示:

<a href="https://github.com/apache/struts/releases/tag/struts_2_5_10_1">https://github.com/apache/struts/releases/tag/struts_2_5_10_1</a> <a href="http://struts.apache.org/download.cgi">http://struts.apache.org/download.cg i</a>

開發者通過使用資源調用方式替代原始值傳遞方式給actionmessage的方式。 如下所示:

messages.add("msg", new actionmessage("struts1.gangsteradded", gform.getname()));

不要使用如下的方式:

messages.add("msg", new actionmessage("gangster " + gform.getname() + " was added"));

在非必要的情況下禁用struts2-struts1-plugin插件。将struts2-struts1-plugin-2.3.x.jar檔案從 “/web-inf/lib”目錄中移動到其他檔案夾或者删除。

綠盟科技檢測方案

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

内網資産可以使用綠盟科技的遠端安全評估系統(rsas v6 )或 web應用漏洞掃描系統(wvss) 進行檢測。

遠端安全評估系統(rsas v6) http://update.nsfocus.com/update/listrsasdetail/v/vulweb web應用漏洞掃描系統(wvss) http://update.nsfocus.com/update/listwvssdetail/v/6/t/plg

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

綠盟科技防護方案

使用綠盟科技防護類産品(ips/ids/nf/waf)進行防護

入侵防護系統(ips)

http://update.nsfocus.com/update/listips

入侵檢測系統(ids)

http://update.nsfocus.com/update/listids

下一代防火牆系統(nf)

http://update.nsfocus.com/update/listnf

web應用防護系統(waf)

http://update.nsfocus.com/update/wafindex

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

綠盟科技服務方案

綠盟科技提供專業的安全技術服務,全方位的保障客戶應用系統安全,避免受此漏洞影響。

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

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

官方的漏洞描述如下:

Apache Struts2遠端代碼執行漏洞S2-048 CVE-2017-9791 分析和防護方案

從官方的漏洞描述可以知道,這個漏洞本質上是在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()….)。

Apache Struts2遠端代碼執行漏洞S2-048 CVE-2017-9791 分析和防護方案

在struts2-showcase的integration子產品下有savegangsteraction類的execute方法(位于savegangsteraction.java檔案)用于實作。具體如下:

Apache Struts2遠端代碼執行漏洞S2-048 CVE-2017-9791 分析和防護方案

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

gangsterform.getname()的實作如下:

Apache Struts2遠端代碼執行漏洞S2-048 CVE-2017-9791 分析和防護方案

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

Apache Struts2遠端代碼執行漏洞S2-048 CVE-2017-9791 分析和防護方案

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

Apache Struts2遠端代碼執行漏洞S2-048 CVE-2017-9791 分析和防護方案

從struts1action.execute函數開始,到actionsupport的gettext()方法,方法如下:

Apache Struts2遠端代碼執行漏洞S2-048 CVE-2017-9791 分析和防護方案

進入textprovidersuppport.gettext,調用其另一個重載類方法gettext(),示例如下:

Apache Struts2遠端代碼執行漏洞S2-048 CVE-2017-9791 分析和防護方案

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

Apache Struts2遠端代碼執行漏洞S2-048 CVE-2017-9791 分析和防護方案

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

<a href="https://struts.apache.org/maven/struts2-core/apidocs/com/opensymphony/xwork2/util/localizedtextutil.html">https://struts.apache.org/maven/struts2-core/apidocs/com/opensymphony/xwork2/util/localizedtextutil.html</a>

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

Apache Struts2遠端代碼執行漏洞S2-048 CVE-2017-9791 分析和防護方案
Apache Struts2遠端代碼執行漏洞S2-048 CVE-2017-9791 分析和防護方案

本安全公告僅用來描述可能存在的安全問題,綠盟科技不為此安全公告提供任何保證或承諾。由于傳播、利用此安全公告所提供的資訊而造成的任何直接或者間接的後果及損失,均由使用者本人負責,綠盟科技以及安全公告作者不為此承擔任何責任。綠盟科技擁有對此安全公告的修改和解釋權。如欲轉載或傳播此安全公告,必須保證此安全公告的完整性,包括版權聲明等全部内容。未經綠盟科技允許,不得任意修改或者增減此安全公告内容,不得以任何方式将其用于商業目的。

原文釋出時間:2017年7月7日

本文由:安全加 釋出,版權歸屬于原作者

原文連結:http://toutiao.secjia.com/apache-struts2-rce-cve-2017-9791#

本文來自雲栖社群合作夥伴安全加,了解相關資訊可以關注安全加網站