文章作者: Danny_Wei@腾讯玄武实验室
参考来源: http://drops.wooyun.org/papers/10231
原文标题: 一个PC上的 "WormHole" 漏洞
### 前言
---
最近安全界关注的焦点 WormHole 是一类不安全的开发习惯所导致的,在 PC 上类似问题也毫不罕见,只不过很多风险被微软默认自带的防火墙缓解了。希望本文和众多关于 WormHole 的讨论能获多或少地提高一些开发人员的安全意识。
下面要介绍的问题可导致的后果和 WormHole 非常类似:影响上亿用户、访问一个端口发送一条指令就可以让目标系统下载一个程序并执行。
> 该问题已于2015年9月29日被修复。在修复前,存在于所有使用预装 Windows 系统的 ThinkPad、ThinkCentre、ThinkStation 以及 Lenovo V/B/K/E 系列电脑。
### 背景
---
联想 ThinkVantage System Update 软件用于帮助用户从联想的服务器中直接下载并安装软件、驱动、BIOS 的更新,极大的简化了用户更新系统的难度和工作量。其被默认预装在联想的多款产品中。
> Lenovo System Update 可根据不同的网络环境及配置通过多种方式下载软件及更新,其中一种方式为通过文件共享下载,而UNCServer.exe 则是完成此功能的主程序,UNCServer.exe 随 System Update 主程序启动,并建立本地服务端等待主程序连接。在早期版本中,甚至 System Update 主程序退出后,UNCServer.exe 也仍然保持运行状态。
### 问题描述
---
在 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);
```
#### 总结
Remoting作为上一代的.NET分布式处理技术,由于设计时的安全缺陷早已被微软的WCF技术取代。如果应用程序仍在使用Remoting技术进行分布式处理或通信,应意识到其潜在的安全问题,稍有不当则可能引入安全漏洞。
暂无评论