最新消息:图 床

從一個補了三次的漏洞看WCF的安全編程

COOL IAM 164浏览 0评论

作者:Danny_Wei@騰訊玄武實驗室

背景

筆者在2016年11月發現並報告了 HP Support Assistant (HPSA) 的權限提升漏洞,HP Product Security Response Team (HP PSRT) 響應迅速,但卻以此漏洞可以通過軟件的自動更新功能自動修復為由拒絕為其發布安全公告和 CVE。4月份想起這件事後,筆者又分析了一遍修補后的 HPSA,發現 HP 的開發人員在修補中犯了更為低級的錯誤,導致補丁可以被繞過重新實現權限提升。在隨後與 HP PSRT 的溝通與合作中,再一次利用其它技巧繞過了其後續修補,最終筆者協助 HP PSRT 完成了漏洞的修補。

本文將分析此漏洞的成因及多次補丁繞過,希望能以此為案例提高開發人員對安全的認識和理解,以減少由於對所用技術理解不到位和安全編程意識匱乏而導致的安全漏洞。

問題描述

HPSA 是惠普推出的系統管理軟件,被默認安裝在惠普的所有 PC 中。其用於維護系統及打印機,並提供自動更新等功能。HPSA 使用.Net開發,其系統服務 HPSupportSolutionsFrameworkService 使用 WCF 與客戶端通信,完成系統更新、管理等高權限敏感操作。雖然 HPSA 使用了較新的分佈式處理技術WCF,然而在 Server 與 Client 通信過程中,卻採用了不正確的認證方式。導致攻擊者可以繞過認證,最終利用其敏感服務接口的缺陷,實現 everyone 到 system 的權限提升。

本文將從 WCF 技術背景、漏洞發現、漏洞利用、補丁實現和兩次繞過幾個方面進行分析。

WCF技術背景

WCF(Windows Communication Foundation) 是用於面向服務應用程序的編程框架,基於WCF的服務可以有兩種形式:1). 通過 IIS 寄宿的方式將服務寄宿於IIS中; 2). 通過自我寄宿(Self-Hosting)的方式將服務寄宿於普通應用程序、windows 服務之中。

WCF 使用 Endpoint 的概念,在服務 Endpoint 和客戶 Endpoint 之間傳輸異步消息。 Endpoint 用來描述消息發往什麼地方,如何被發送等行為。一個服務端 Endpoint 主要由三部分構成:

1). Addrsss

唯一標識endpoint,是描述服務接口的URI,可以是相對地址(相對於ServiceHost(Type, Uri[])的URI),也可以是絕對地址。

2). Binding

指定綁定在endpoint上的接口類型,描述endpoint間通信時使用的協議、消息編碼方式、安全設置等。
WCF支持:HttpBindingBase, MsmqBindingBase, NetNamedPipeBinding, NetPeerTcpBinding, NetTcpBinding, UdpBinding, WebHttpBinding, WSDualHttpBinding, WSHttpBindingBase, CustomBinding多種綁定類型。

3). Contract

契約指定並設置綁定到當前 endpoint 上的服務接口,即哪些方法被導出給客戶端,方法的授權情況、消息格式等。

漏洞成因

HPSA 的系統服務 HPSupportSolutionsFrameworkService 具有 SYSTEM 權限,並開啟了多個允許 everyone 賬戶讀寫的 NamePipe。這一敏感行為引起了筆者的注意,因此dump下安裝包進一步分析。

反混淆反編譯後進行代碼審計,發現HPSA的系統服務使用WCF與Client進行交互。它創建了一個綁定在NetNamedPipeBinding(URI:”net.pipe://localhost/HPSupportSolutionsFramework/HPSA”)上的Endpoint,並允許Client調用多個綁定在此Endpoint上的服務接口:HP.SupportFramework.ServiceManager.Interfaces::IServiceInterface

HPSA 在連接建立時對 Client 進行了認證,以阻止敏感接口被惡意程序調用。Server 與 Client 的交互過程如下表所示:

转载请注明:IAMCOOL » 從一個補了三次的漏洞看WCF的安全編程

0 0 vote
Article Rating
Subscribe
Notify of
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x