歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

Weblogic IIOP反序列化漏洞(CVE-2020-2551) 漏洞分析

來源:本站整理 作者:佚名 時間:2020-01-31 TAG: 我要投稿

2020年1月15日, Oracle官方發布了CVE-2020-2551的漏洞通告,漏洞等級為高危,CVVS評分為9.8分,漏洞利用難度低。影響范圍為10.3.6.0.0, 12.1.3.0.0, 12.2.1.3.0, 12.2.1.4.0。
 
0x01 漏洞分析
從Oracle 官方的CPU公告中可以看出該漏洞存在于weblogic核心組件,影響的協議為IIOP。其實經過分析發現,該漏洞原理上類似于RMI反序列化漏洞(CVE-2017-3241),和之前的T3協議所引發的一系列反序列化漏洞也很相似,都是由于調用遠程對象的實現存在缺陷,導致序列化對象可以任意構造,并沒有進行安全檢查所導致的。
為了更好的理解這個漏洞,有必要先介紹一下相關的概念:
RMI: RMI英文全稱為Remote Method Invocation,字面的意思就是遠程方法調用,其實本質上是RPC服務的JAVA實現,底層實現是JRMP協議,TCP/IP作為傳輸層。通過RMI可以方便調用遠程對象就像在本地調用一樣方便。使用的主要場景是分布式系統。
CORBA: Common Object Request Broker Architecture(公共對象請求代理體系結構)是由OMG(Object Management Group)組織制定的一種標準分布式對象結構。使用平臺無關的語言IDL(interface definition language)描述連接到遠程對象的接口,然后將其映射到制定的語言實現。
IIOP: CORBA對象之間交流的協議,傳輸層為TCP/IP。它提供了CORBA客戶端和服務端之間通信的標準。
那么什么是RMI-IIOP呢,以往程序員如果想要開發分布式系統服務,必須在RMI和CORBA/IIOP之間做選擇,但是現在有了RMI-IIOP,稍微修改代碼即可實現RMI客戶端使用IIOP協議操作服務端CORBA對象,這樣就綜合了RMI操作的便利性和IIOP的跨語言性的優勢。
在weblogic中RMI-IIOP的實現模型如下:

Weblogic的文檔把這個實現叫做RMI over IIOP。
理解了以上的概念,通過下邊的例子(完整代碼請參考文檔)來幫助理解RMI-IIOP吧:
首先定義一個接口類HelloInterface,注意必須實現Remote接口,實現的方法必須拋出java.rmi.RemoteException的異常:
public interface HelloInterface extends java.rmi.Remote {
    public void sayHello( String from ) throws java.rmi.RemoteException;
}
接著定義一個實現該接口的方法,然后定義一個服務端,并將該服務進行綁定,然后暴露在1050端口。接下來是客戶端代碼:
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import java.util.Hashtable;
public class HelloClient {
    public static void  main( String args[] ) {
        Context ic;
        Object objref;
        HelloInterface hi;
        try {
            Hashtable env = new Hashtable();
            env.put("java.naming.factory.initial", "com.sun.jndi.cosnaming.CNCtxFactory");
            env.put("java.naming.provider.url", "iiop://127.0.0.1:1050");
            ic = new InitialContext(env);
            // STEP 1: Get the Object reference from the Name Service
            // using JNDI call.
            objref = ic.lookup("HelloService");
            System.out.println("Client: Obtained a ref. to Hello server.");
            // STEP 2: Narrow the object reference to the concrete type and
            // invoke the method.
            hi = (HelloInterface) PortableRemoteObject.narrow(
                    objref, HelloInterface.class);
            hi.sayHello( " MARS " );
        } catch( Exception e ) {
            System.err.println( "Exception " + e + "Caught" );
            e.printStackTrace( );
            return;
        }
    }
}
可以看到客戶端通過JNDI查找的方式獲取到遠程的Reference對象,然后調用執行該對象的方法:

這個調用的過程和普通的RMI方法調用很相似,因此很容易想到RMI的反序列化漏洞(CVE-2017-3241),通過bind方法中發送序列化對象到服務端,服務端在讀取的時候進行反序列化操作,從而觸發漏洞。

[1] [2]  下一頁

【聲明】:黑吧安全網(http://www.650547.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        安徽快3自由的百科 赛车pk10开奖数据 浙江20选5开奖官网 黑龙江36选七开奖结果 实时股票情况 天津快乐10分技巧 a股是什么股票 全天上海时时乐计划 黑龙江快乐十分规律 在线股票配资黑马配资网 体彩排三走势图带连线