作者:
xlab
·
2015/11/05 12:38
[email protected]
0x00 前言
最近安全界關注的焦點WormHole是一類不安全的開發習慣所導致的,在PC上類似問題也毫不罕見,只不過很多風險被微軟預設自帶的防火牆緩解了。希望本文和眾多關於WormHole的討論能獲多或少地提高一些開發人員的安全意識。
下面要介紹的問題可導致的後果和WormHole非常類似:影響上億使用者、訪問一個埠傳送一條指令就可以讓目標系統下載一個程式並執行。
該問題已於2015年9月29日被修復。在修復前,存在於所有使用預裝Windows系統的ThinkPad、ThinkCentre、ThinkStation以及Lenovo V/B/K/E系列電腦。
0x01 背景
聯想ThinkVantage System Update軟體用於幫助使用者從聯想的伺服器中直接下載並安裝軟體、驅動、BIOS的更新,極大的簡化了使用者更新系統的難度和工作量。其被預設預裝在聯想的多款產品中。
Lenovo System Update可根據不同的網路環境及配置透過多種方式下載軟體及更新,其中一種方式為透過檔案共享下載,而UNCServer.exe則是完成此功能的主程式,UNCServer.exe隨System Update主程式啟動,並建立本地服務端等待主程式連線。在早期版本中,甚至System Update主程式退出後,UNCServer.exe也仍然保持執行狀態。
0x02 問題描述
在System Update的5.6.0.34版本中,UNCServer.exe透過.NET的Remoting機制,透過TCP伺服器提供多種功能。
.NET Remoting發展自DCOM,是一項比較老的.NET分散式處理技術。它序列化服務端的物件和資料並匯出,客戶端透過HTTP、TCP、IPC通道跨越程式邊界實現對服務端物件的引用。然而Remoting的序列化機制會隱式匯出物件所有的方法和屬性,客戶端一旦獲得服務端匯出的物件引用,即可呼叫服務端物件提供的所有方法。因此Remoting機制容易引入安全漏洞,且不建議將Remoting服務終端匯出給不受信任的客戶端。
UNCServer匯出的Connector物件提供Connect、DownloadBean、IsFileExist、IsFolderExist、GetFilesInFolder、GetSubFolder、QueryFile、LaunchIE功能。客戶端可以連線並獲取其引出物件,進行檔案下載、應用程式執行等操作。
其中LaunchIE並未對引數進行任何驗證,可以用來啟動任意程式,其實現程式碼如下:
case UNCAction.LaunchIE:
string fileName = (string) eventObj;
try{
Process.Start(fileName);
}
catch{
}
this.connector.Current = (object) true;
break;
同時,雖然System Update在防火牆策略中只新增了UNCServer的出站規則,但由於UNCServer缺少必要的配置,使其繫結在0.0.0.0:20050上。因此在缺乏防火牆保護的情況下,任何機器都可與其建立連線,最終使用其提供的DownloadBean和LaunchIE功能實現遠端下載程式並執行。
UNCServer建立服務端通道並匯出物件的程式碼如下:
IDictionary properties = (IDictionary) new Hashtable();
properties[(object) "name"] = (object) "tvsuuncchannel";
properties[(object) "priority"] = (object) 2;
properties[(object) "port"] = (object) 20050;
this.channel = new TcpServerChannel(properties, (IServerChannelSinkProvider) new BinaryServerFormatterSinkProvider());
ChannelServices.RegisterChannel((IChannel) this.channel, false);
this.status = new object();
this.connector = new Connector();
RemotingServices.Marshal((MarshalByRefObject) this.connector, "Connector");
this.connector.UNCEvent += new Connector.UNCEventHandler(this.connector_UNCEvent);
0x03 修復
聯想在2015/9/29日放出的System Update 5.7.0.13修復了包括此問題在內的多個漏洞。其重新實現了LaunchIE、LaunchHelp功能,對其建立程式的引數進行了驗證。並加強了服務端的配置,使其繫結在127.0.0.1:20050,阻止了遠端請求。修復後的部分程式碼如下:
case UNCAction.LaunchIE:
try{
tring str = (string) eventObj;
Uri result;
if (Uri.TryCreate(str, UriKind.Absolute, out result) && (result.Scheme == Uri.UriSchemeHttp || result.Scheme == Uri.UriSchemeHttps))
Process.Start(str);
}
catch{
}
this.connector.Current = (object) true;
break;
IDictionary properties = (IDictionary) new Hashtable();
properties[(object) "name"] = (object) "tvsuuncchannel";
properties[(object) "priority"] = (object) 2;
properties[(object) "port"] = (object) 20050;
properties[(object) "rejectRemoteRequests"] = (object) true;
properties[(object) "bindTo"] = (object) "127.0.0.1";
this.channel = new TcpServerChannel(properties, (IServerChannelSinkProvider) new BinaryServerFormatterSinkProvider());
ChannelServices.RegisterChannel((IChannel) this.channel, false);
this.status = new object();
this.connector = new Connector();
RemotingServices.Marshal((MarshalByRefObject) this.connector, "Connector");
this.connector.UNCEvent += new Connector.UNCEventHandler(this.connector_UNCEvent);
0x04 小結
Remoting作為上一代的.NET分散式處理技術,由於設計時的安全缺陷早已被微軟的WCF技術取代。如果應用程式仍在使用Remoting技術進行分散式處理或通訊,應意識到其潛在的安全問題,稍有不當則可能引入安全漏洞。
本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!