在趨勢科技最近發布的漏洞報告中,研究團隊的Guy Lederfein和Dusan Stevanovic詳細介紹了Sophos防火牆最近打過補丁的代碼注入漏洞。該漏洞是由於對發送到Controller終端的“JSON”參數中提交的JSON key進行了不正確的驗證。成功利用此漏洞可能導致以根用戶的權限執行遠程代碼。以下是關於CVE-2022-3236的介紹。
Sophos最近修復了Sophos Firewall v19.0 MR1(19.0.1)及以前版本中的代碼注入漏洞。此漏洞是由於對發送到Controller終端的“JSON”參數中提交的JSON key進行了不正確的驗證。未經身份驗證的遠程攻擊者可以通過向受影響的服務器發送精心編寫的請求來利用此漏洞。成功利用此漏洞可能導致使用根用戶的權限進行遠程代碼執行。
漏洞利用Sophos Firewall是一種網絡安全解決方案,它可以部署在專門構建的設備、云網絡(AWS/Azure)、虛擬設備或x86 Intel硬件上的軟件設備上。防火牆應用支持多種網絡安全特性,包括應用感知路由、TLS檢測、深層包檢測、遠程接入VPN、日誌、報表等。 Sophos Firewall公開了一個web管理控制台,用於通過TCP端口4444上的HTTPS管理設備的配置。此外,Sophos Firewall公開了一個用戶門戶,用於更新用戶的詳細信息或通過TCP端口443上的HTTPS下載身份驗證客戶端。
HTTP是RFC 7230-7237和其他RFC中描述的請求/響應協議。客戶端向服務器發送請求,服務器又將響應發送回客戶端。 HTTP請求由請求行、各種標題、空行和可選消息正文組成:
其中CRLF表示新行序列回車(CR),後跟換行(LF)。根據使用的方法和Content-Type標頭,參數可以在RequestURI或消息正文中作為名稱-值對從客戶端傳遞到服務器。例如,使用GET方法傳遞一個名為“param”、值為“1”的參數的簡單HTTP請求可能如下所示:
使用POST方法的相應HTTP請求可能如下所示:
JavaScript對象表示法(JSON)是一種數據交換格式,用於創建設備可解析、人類可讀的輸出。 JSON對象具有以下語法:
1.對像用花括號{}括起來。
2.對象由逗號(“,”)字符分隔的零個或多個項目組成。
3.項目由秘鑰和值組成。秘鑰的值由冒號(“:”)字符分隔。
4.秘鑰必須是用引號括起來的字符串。
5.值必須是有效的類型。 JSON定義了7種值類型:字符串、數字、對象、數組、true、false和null。
6.數組是用方括號[]括起來的對象。
7.數組由零個或多個字符串、數字、JSON對象、數組、布爾值或由逗號(“,”)字符分隔的空類型對象組成。
JSON對象示例如下: {“name”:”bob”, “age”:30}。
由Sophos Firewall公開的web管理和用戶門戶web界面都運行在Apache httpd服務器後面的Jetty服務器上。通過這些接口發出的配置和診斷請求通過請求提交給Controller servlet。這個servlet基於模式HTTP請求參數檢索適當的EventBean對象。例如,如果模式HTTP請求參數設置為151或451,則分別調用WebAdminAuth或UserPortalAuth類來處理請求。在每個類中,都會調用CSCClient類的generateAndSendAjaxEvent()方法。
該方法解析json HTTP請求參數,並修改解析對像中的特定字段。然後調用send()方法,該方法反過來調用_send(),後者根據相關EventBean對象的模式添加模式JSON參數。然後,它將創建的JSON對像作為字符串(包括適當的標頭)通過TCP或UDP端口299發送到本地CSC服務器。
當CSC服務器接收到Jetty服務器提交的JSON對象時,它會驗證通過Perl腳本CyberAPIArch.pm中的validateJSON()方法提交的JSON對象。如果JSON對象包含一個名為_discriminator的項,則調用getValidationHash()方法。該方法遍歷_discriminator Perl哈希的每個秘鑰,表示字段名。每個字段名都與一個描述字段值和對象名之間映射的JSON對象相關聯。解析收到的JSON對象時解析的一些Perl對象(natrule、securitypolicy、hotspot等)包含一個帶有_discriminator項的模板,其中包含字段值及其關聯對象之間特定字段名的映射。該方法遍歷字段值,以檢查提交的JSON對像是否包含具有引用名稱和值的字段。如果是,它將檢索關聯的對象名,並嘗試使用eval函數將其解析為一個對象。
Sophos防火牆存在代碼注入漏洞,此漏洞是由於對發送到Controller終端的“JSON”參數中提交的JSON key進行了不正確的驗證。可以在HTTP請求中設置_discriminator項,經過一些修改後,這個JSON對像被發送到CSC服務器。但是,_discriminator項目集是未經修改發送的。一旦使用Perl腳本CyberAPIArch.pm的validateJSON() 方法被調用時,它將檢測這個項並調用getValidationHash()。 Perl方法遍歷$hashObj哈希對象,該對象包含一個名為_discriminator的項,其值是一個嵌套的哈希,其中的值項設置為發送的原始請求中的_discriminator項的值。
此值項被視為包含映射到對象名稱的字段值的嵌套哈希。因此,如果最初提交的JSON對象包含一個名為value的項,其值設置為這個嵌套哈希中的一個值,則將使用eval函數解析關聯的對象名稱。由於原始請求中的_discriminator項可以設置為帶有值和對象名稱之間的任意映射的JSON對象,因此可以提交惡意對象並將其連接到eval函數中,從而導致代碼注入。
Sophos嘗試使用RequestCheckFilter Java對像對請求參數(包括JSON對象)執行輸入驗證。該過濾器檢測帶有非ASCII可打印字符的請求參數和JSON key。但是,仍然可以提交包含ASCII可打印字符的任意請求參數和JSON key,包括_discriminator項。
未經身份驗證的遠程攻擊者可以通過向目標服務器發送精心編寫的請求來利用此漏洞。成功利用此漏洞可能導致在服務器上運行任意Perl命令,從而導致以root用戶的權限執行遠程代碼。
源代碼下面的代碼片段摘自Sophos Firewall 19.0.1版本,並由趨勢科技添加了額外的註釋。
來自反編譯的Java類cyberoam.sessionmanagement.RequestCheckFilter:
來自Perl腳本CyberAPIArch.pm:
檢測攻擊為了檢測試圖利用該漏洞的攻擊,檢測設備必須監視並解析端口443/TCP和4444/TCP上的流量。請注意,流量是用SSL/TLS加密的。在繼續進行下一步驟之前,檢測設備必須對流量進行解密。
基於被監視的TCP端口,檢測設備必須對包含以下字符串的Request- URI的HTTP GET和POST請求進行檢測:
對Webadmin Controller終端(TCP端口4444)的請求可以使用多部分/表單數據編碼。
Multipart/form-data 由多個部分組成,每個部分都包含一個Content Disposition標頭。每個部分由一串字符分隔。分隔部分的字符串由Content-Type標題行上的boundary關鍵字定義,它被設置為' multipart/form-data '。 Content-Disposition標頭包含一個名稱參數,描述要返回的表單元素。每個部分中可能會出現額外的標題行。每一行由一個新的行序列分隔。標頭文件以兩個連續的新行結束。下面是表單元素的數據,如果對像被分離並存儲在一個單獨的文件中,則filename參數提供要使用的建議文件名。下面是一個文件項的Content-Disposition標頭示例,其中boundary關鍵字是' TMSR ':
如果發現對上述終端的請求,檢測設備必鬚根據Content-Type標頭中描述的編碼解析其參數,並蒐索json參數。如果發現,檢測設備必須使用以下任何合適的方法檢查json參數值。
方法1:如果檢測設備能夠解析JSON,它必須將JSON參數解析為JSON對象。檢測設備必須解析密鑰為字符串“_discriminator”的任何項(可能嵌套)。如果被發現,應該認為該流量是惡意的,因為利用該漏洞的攻擊很可能正在進行中。
方法2:如果檢測設備不具備解析JSON的能力,則必須將JSON參數作為字符串進行檢查,並檢查其是否包含字符串“_discriminator”。如果被發現,應該認為該流量是惡意的,因為利用該漏洞的攻擊很可能正在進行中。
需要注意的其他事項:
1.參數名稱和值可能是URL編碼的,必須在應用上述檢測之前進行解碼;
2.URI和參數名稱(“json”)和值(“_discriminator”)的字符串匹配必須以區分大小寫的方式執行;
3.HTTP標頭名稱(即“Content-Type”)和值(即“multipart/form data”)的字符串匹配必須以不區分大小寫的方式執行。
Recommended Comments