<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    OPC UA .NET Standard Stack 資源耗盡漏洞分析-05-26

    VSole2023-05-30 09:12:14

    漏洞概述

    OPC UA .NET Standard Stack是OPC Foundation(OPC基金會)官方維護的OPC UA協議棧的參考實現。該協議棧以.NET語言開發,包含了可移植的OPC UA協議棧和核心庫(包含客戶端、服務端、配置、復雜類型支持庫等),服務端和客戶端的參考實現以及客戶端和服務端的X.509證書認證等實現。

    OPC UA協議是工業控制領域中的一種十分流行的通訊協議。啟明星辰ADLab研究員在工控漏洞情報跟蹤中發現了OPC UA .NET Standard Reference Server中存在內存資源耗盡漏洞(編號為CVE-2023-27321),并對該漏洞進行了深入分析和驗證。

    漏洞分析

    該漏洞存在于OPC UA .NET Standard Server Stack代碼庫中。根據官方漏洞公告,遠程攻擊者可通過發送惡意的請求來耗盡服務器所有可用內存。

    圖 1、OPC Foundation Security Bulletin關于CVE-2023-27321概述【1】

    由官方漏洞公告的描述可以看出,該漏洞存在于OPC UA .NET Standard Reference Server對OPC UA Client請求的處理代碼中。OPC UA .NET Standard處理客戶端請求的關鍵代碼類位于協議棧代碼Stack\Opc.Ua.Core\Stack\Tcp目錄下。如下圖所示:

    圖 2、OPC UA .NET Standard處理TCP連接核心代碼文件

    其中創建OPC UA Server Service的核心入口位于TCPServiceHost類函數CreateServiceHost中。

    該函數首先通過Create函數創建一個TCPTransportListener,隨后調用ServerBase類函數CreateServiceHostEndpoint啟動該監聽器:

    圖 3、TcpServiceHost類成員函數CreateServiceHost調用Create方法創建Tcp監聽器

    圖 4、ServerBase類函數CreateServiceHostEndpoint調用Open方法啟動Tcp監聽器

    CreateServiceHostEndpoint函數調用TCPTransportListener的Open方法啟動監聽器。在Open函數中,首先通過ChannelQuotas類對OPC UA連接的通道參數進行了一些列的配置,例如MaxBufferSize、MaxMessageSize等。并且實例化了一個用于管理Socket buffer的BufferManager類。然后調用Start函數運行Listener。

    圖 5、TcpTransportListener類Open函數主要代碼

    在Start函數中,完成Server Socket的創建工作,同時指定了OnAccept函數來處理OPC UA Client連接:

    圖 6、TcpServerListener類函數Start創建Server socket

    OnAccept函數則建立了一個TcpServerChannel來管理客戶端連接。同時設置該channel的各種消息處理回調函數。并調用Attach函數將該TcpServerChannel與Client socket進行關聯。

    圖 7、TcpTransportListener類OnAccept函數創建TcpServerChannel關聯Client socket

    隨后在Attach函數中創建了TcpMessageSocket實例來處理客戶端請求數據,使用TcpMessageSocket類的ReadNextMessage方法來處理客戶端請求數據。

    圖 8、TcpServerChannel類函數Attach創建TcpMessageSocket實例處理客戶端請求數據

    以上便是OPC UA .NET Standard創建Server,接受Client連接和處理Client請求的過程。下面我們著重分析ReadNextMessage()函數,該函數負責處理客戶端的請求數據。該函數的實現代碼如下所示:

    圖 9、ReadNextMessage函數代碼

    該函數是一個雙重循環,第一重循環首先通過BufferManager申請一塊內存,然后設置m_bytesToReceive為TcpMessageLimits.MessageTypeAndSize(值為8)大小,然后調用ReadNextBlock讀取Message數據。

    在ReadNextBlock函數中,使用ReceiveAsync函數異步方式接受客戶端的請求數據,在ReceiveAsync的接收回調函數OnReadComplete中,通過調用DoReadComplete函數,完整讀取一個Message消息的所有內容。然后通過ReadNext函數重新進入ReadNextMessage循環,不斷的處理客戶端的請求消息。

    圖 10、ReadNextBlock調用ReceiveAsync異步接收客戶端數據

    圖 11、OnReadComplete通過readState狀態確定客戶端一個Message是否讀取完畢

    DoReadComplete函數中首先確保讀取到了8字節的Message頭部,其中包含了4字節的MessageSize,然后通過該MessageSize大小讀取剩余Message消息數據。如果完成一個Message的讀取,再通過觸發OnMessageReceived函數來處理消息的內容。

    圖 12、DoReadComplete讀取Messsage消息過程

    OnMessageReceive函數最終是通過HandleInComingMessage來具體處客戶端請求消息內容。在HandleInComingMessage函數中通過判斷MessageType來確定不同的Message處理函數(包括ProcessRequestMessage、ProcessHelloMessage、ProcessOpenSecureChannelRequest等)。

    圖 13、HandleInComingMessage函數處理流程

    在消息的具體處理函數ProcessXXX中解析和處理完消息數據后,便會釋放存儲消息的內存。如下是ProcessRequestMessage函數中釋放Message內存的代碼:

    圖 14、ProcessRequestMessage函數釋放內存代碼

    在Server端收到客戶端消息時,會根據創建TcpServerChannel時設置的回調函數(參見圖7),對客戶端進行回復。例如處理客戶端request的回調函數是TcpTransportListener類中的OnRequestReceived函數。該函數設置了消息處理完畢的回調函數OnProcessRequestComplete函數,并在此函數中調用SendReponse對客戶端消息進行回復。

    圖 15、客戶端Request消息處理的回調函數設置

    SendResponse函數則通過WriteSymmetricMessage函數生成Response消息并調用BeginWriteMessage發送給OPC UA Client。

    圖 16、SendResponse函數關鍵代碼

    這里WriteSymmetricMessage函數中依然會通過BufferManager來申請一塊內存來存儲回復消息數據。申請的內存大小為SendBufferSize。

    圖 17、WriteSymmetricMessage內存分配關鍵代碼

    從上述OPC UA .NET Standard Server處理Client請求的過程可以看出,無論是在接收Client Message消息階段還是發送Response消息階段,Server都會申請一塊內存來臨時存儲數據。對于接收階段,在ReadNextMessage函數中為每個Message申請的內存的大小為m_receiveBufferSize,該變量在TcpServerChannel類中初始化TcpMessageSocket時指定為Quotas.MaxBufferSize(參見圖8)。而Quotas.MaxBufferSize是在TcpTransportListener類的Open函數中賦值的(參見圖5),其最終來源為ServerBase類函數CreateServiceHostEndpoint中的參數ApplicationConfiguration。對于OPC UA Reference Server應用來說,就是其配置文件(Quickstarts.ReferenceServer.Config.xml)的MaxBufferSize參數,默認值為65535。

    圖 18、Reference Server配置文件中關于TransportQuotas的參數配置

    同樣回溯WriteSymmetricMessage函數中SendBufferSize的賦值過程發現,其初始大小也是MaxBufferSize。

    圖 19、UaSCBinaryChannel類構造函數中對sendBufferSize的初始化

    也就是說,對于客戶端發送的每個TCP請求,OPC UA Reference Server都會通過BufferManager申請64K的內存來存放Request數據,然后處理完畢后再申請64KB的內存來存放Response數據。

    根據BufferManager的實現可知,該類是通過ArrayPool來進行動態內存管理的。

    圖 20、BufferManager構造函數代碼

    ArrayPool是.NET框架中的一個類,用于管理和重用數組內存緩沖區。它旨在幫助減少在高性能應用程序中頻繁分配和釋放大量相同大小的數組時產生的垃圾回收壓力。在傳統的.NET內存管理中,每次使用new關鍵字創建數組時,都會在堆上分配一塊內存。當這些數組不再使用時,垃圾回收器會負責回收這些內存。這種頻繁的內存分配和垃圾回收操作可能會對性能產生負面影響。ArrayPool通過維護一個內部的緩沖區池來解決這個問題。當需要分配一個數組時,可以從池中獲取一個可用的數組,而不是每次都分配新的內存。使用完畢后,可以將數組返回到池中以供重用,而不是立即釋放內存。

    ArrayPool的使用雖然提高了系統進行內存分配和釋放的性能,但是對ArrayPool不加限制的不當使用,會導致系統資源被耗盡。

    漏洞復現

    復現環境

    lOPC UA Vulnerable Server

    OPC UA .NET Standard Reference Server(Version: UA-.NETStandard-1.4.371.60)

    復現過程

    首先按照默認配置編譯OPC UA .NET Standard Reference Server。然后啟動該OPC UA Server。

    圖 21、OPC UA .NET Standard Reference Server啟動界面

    運行PoC腳本,腳本中OPC Client連接Reference Server之后將發送大量請求,最終可消耗Reference Server所在主機的所有可用內存。如下圖所示:

    圖 22、OPC UA .NET Standard Reference Server消耗大量內存

    下圖展示了在調試環境中通過插樁內存分析代碼得到的ArrayPool內存占用情況和程序實際內存占用的情況。

    補丁分析

    根據OPC UA的官方漏洞公告,該漏洞在OPC UA .NET Standard 1.4.371.86版本【2】中修復。通過對該版本代碼的分析,我們發現實際上該漏洞在Github庫UA-.NET Standard的Commit 67fd91ca993c01c38712a61f0342dfdf3c02f4c5中【3】已被修復。

    主要修復的方式如下:

    1.限制了服務端RequestQueue隊列的大小。

    圖 23、漏洞補丁(部分)-限制Server端RequestQueue大小

    2.增加了判斷Client和Server通信的通道是否已滿的函數ChannelFull,該函數限制了在一個Channel會話中能保持活躍的最大WriteRequest數量為100。當客戶端不再從Server讀取數據后,關閉當前Client連接的channel。

    圖 24、漏洞補丁(部分)-判斷Server端Channel WriteRequest數量

    上述修復方式的核心是:限制OPC UA Server所能占用的托管內存大小,避免在ArrayPool中分配過多的內存資源。

    安全建議

    鑒于該漏洞無需認證便可從網絡側發動針對OPC UA服務器的拒絕服務攻擊,我們建議使用了OPC UA .NET Standard代碼的相關OPC UA產品及時更新OPC UA .NET Standard代碼到版本1.4.371.86, 或者將引用的代碼版本更新到修復了該漏洞的commit版本。

    函數調用opc
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    OPC UA協議是工業控制領域中的一種十分流行的通訊協議。漏洞分析該漏洞存在于OPC UA .NET Standard Server Stack代碼庫中。根據官方漏洞公告,遠程攻擊者可通過發送惡意的請求來耗盡服務器所有可用內存。同時設置該channel的各種消息處理回調函數。并調用Attach函數將該TcpServerChannel與Client socket進行關聯。圖 12、DoReadComplete讀取Messsage消息過程OnMessageReceive函數最終是通過HandleInComingMessage來具體處客戶端請求消息內容。
    1 賽題回顧 2 最終排名(部分) 3 啟發與思路 4 算法與模型 函數名(CG圖) 復賽模型融合 Section信息 字符匹配 Yara匹配 Opcode 4. 其他布爾信息 灰度圖 直方圖 PE靜態特征模型 特征工程 5 結果與改進 復...
    莫過于去花之后替換進apk中,依然正常運行,這對匯編功底無疑是一種挑戰。今天就獻丑拿某流量第一的APK樣本做一下IDA腳本一鍵去花指令分析。◆上IDA腳本,此代碼為片段代碼ARM64是ARM架構的64位版本。ARM64的調用約定定義了函數如何傳遞參數和返回結果。前八個浮點型參數通過寄存器V0至V7傳遞。這意味著如果函數修改了這些寄存器的值,那么它需要在返回前恢復它們的原始值。
    靜態分析法是在不執行代碼文件的情形下,對代碼進行靜態分析的一種方法。靜態分析時并不執行代碼,而是觀察代碼文件的外部特征,獲取文件的類型(EXE、DLI、DOC、ZIP等)、大小、PE頭信息、Import/ExportAPI內部字符串、是否運行時解壓縮、注冊信息、調試信息、數字證書等多種信息。
    MTCTF-2022 部分WriteUp
    2022-11-23 09:35:37
    MTCTF 本次比賽主力輸出選手Article&Messa&Oolongcode,累計解題3Web,2Pwn,1Re,1CryptoWeb★easypickle題目給出源碼:。import base64import picklefrom flask import Flask, sessionimport osimport random. @app.route('/')def hello_world(): if not session.get: session['user'] = ''.join return 'Hello {}!\x93作用同c,但是將從stack中出棧兩元素分別導入的模塊名和屬性名:此外對于藍帽杯WP還存在一個小問題,原題采用_loads函數加載pickle數據但本題是loads,在opcodes處理上會有些微不通具體來說就是用loads加載時會報錯誤如下:對著把傳入參數換成元組就行,最終的payload如下
    2008年在安全社區中所知道的windows惡意可執行軟件大約有1000多萬個,2013年這個數字達到了1億,2020年安全社區已知的windows惡意可執行軟件數量已經超過5億[1],這個數字還在持續增長。
    VMPWN的入門系列-2
    2023-08-03 09:29:42
    解釋器是一種計算機程序,用于解釋和執行源代碼。與編譯器不同,解釋器不會將源代碼轉換為機器語言,而是直接執行源代碼。即,這個程序接收一定的解釋器語言,然后按照一定的規則對其進行解析,完成相應的功能,從本質上來看依然是一個虛擬機。總的來說,如果輸入字符數小于0x10,string類的大概成員應該如下struct?
    假如想在x86平臺運行arm程序,稱arm為source ISA, 而x86為target ISA, 在虛擬化的角度來說arm就是Guest, x86為Host。這種問題被稱為Code-Discovery Problem。每個體系結構對應的helper函數在target/xxx/helper.h頭文件中定義。
    虛擬機檢測技術整理
    2023-05-11 09:15:35
    第一次嘗試惡意代碼分析就遇到了虛擬機檢測,于是就想著先學習一下檢測的技術然后再嘗試繞過。學習后最終發現,似乎最好的方法不應該是去patch所有檢測方法,而是直接調試并定位檢測函數再繞過。但既然已經研究了兩天,索性將收集到的資料整理一下,方便后人查找。惡意軟件可以搜索這些文件、目錄或進程的存在。VMware 虛擬機中可能會有如下的文件列表:C:\Program Files\VMware\
    Webshell 檢測綜述
    2022-12-15 09:45:32
    通過Webshell,攻擊者可以在目標服務器上執行一些命令從而完成信息嗅探、數據竊取或篡改等非法操作,對Web服務器造成巨大危害。Webshell惡意軟件是一種長期存在的普遍威脅,能夠繞過很多安全工具的檢測。許多研究人員在Webshell檢測領域進行了深入研究,并提出了一些卓有成效的方法。本文以PHP Webshell為例。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类