专栏首页腾讯玄武实验室的专栏一个 PC上的 “ WormHole ” 漏洞
原创

一个 PC上的 “ WormHole ” 漏洞

作者:韦伟

1. 前言

最近安全界关注的焦点WormHole实际是一类不安全的开发习惯所导致的,在PC上类似问题也毫不罕见,只不过很多风险被微软默认自带的防火墙缓解了。

我们前几个月发现了一个联想电脑的漏洞,和WormHole非常类似:影响上亿用户、访问一个端口发送一条指令就可以让目标系统下载一个程序并执行。

联想公司已于2015年9月29日修复了该漏洞。玄武实验室和电脑管家合作,也向用户推送了相关安全更新。在修复前,该漏洞存在于所有使用预装Windows系统的ThinkPad、ThinkCentre、ThinkStation以及Lenovo V/B/K/E系列电脑。

2. 背景

联想ThinkVantage System Update软件用于帮助用户从联想的服务器中直接下载并安装软件、驱动、BIOS的更新,极大的简化了用户更新系统的难度和工作量。其被默认预装在联想的多款产品中。

Lenovo System Update可根据不同的网络环境及配置通过多种方式下载软件及更新,其中一种方式为通过文件共享下载,而UNCServer.exe则是完成此功能的主程序, UNCServer.exe随System Update主程序启动,并建立本地服务端等待主程序连接。在早期版本中,甚至System Update主程序退出后,UNCServer.exe也仍然保持运行状态。

3. 问题描述

在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);

4. 修复

联想在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);

5. 小结

Remoting作为上一代的.NET分布式处理技术,由于设计时的安全缺陷早已被微软的WCF技术取代。如果应用程序仍在使用Remoting技术进行分布式处理或通信,应意识到其潜在的安全问题,稍有不当则可能引入安全漏洞。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 架构设计与安全:代码未写,漏洞已出。

    来自 MIG 玄武实验室总监、专家工程师于旸,就基架构和设计的安全,给大家进行了关于安全问题的成因分享。

    腾讯玄武实验室
  • IE 沙箱拖拽安全策略解析

    在本文中,笔者将以一个攻击者的视角,尝试各种途径来突破 IE 沙箱的这一安全策略,通过分析所遇到的障碍,达到对IE沙箱拖拽安全策略进行详细解析的目的。

    腾讯玄武实验室
  • 异常中的异常:借助系统异常处理特例实现匪夷所思的漏洞利用

    内存的读、写、执行属性是系统安全最重要的机制之一。通常,如果要改写内存中的数据,必须先确保这块内存具有可写属性,如果要执行一块内存中的代码,必须先确保这块内存具...

    腾讯玄武实验室
  • react native中的聊天气泡及timer封装成的发送验证码倒计时

    1.goBack的跨页面跳转,又两种方法,一可以像兔哥那样修改navigation源码,二可以用navigationActions

    砸漏
  • 【译】感谢你的Code Review

    这意味着我需要发出大量的代码审查。在一次修改中通常会涉及到从UI到数据库的所有部分。

    Jackeyzhe
  • RT-Thread面向对象编程思路浅析

    在写这篇文章前,我们需要理解面向对象与面向过程的思想。面向过程就是遇到一个问题,将这个问题解决办法一步一步的列出来,就想下棋一样,一步一步走,根据具体情况调整思...

    bigmagic
  • 详述 IntelliJ IDEA 中恢复代码的方法「进阶篇」

    在博文“ 详述 IntelliJ IDEA 中恢复代码的方法 ”中,咱们已经了解了如何将代码恢复至某一版本,但是通过Local History恢复代码有的时候并...

    CG国斌
  • JS-简单地匀速运动框架

    xing.org1^
  • MacBook PyCharm永久激活

    点击链接 https://pan.baidu.com/s/16ALpz_BCXjsRkpS_PtD23A 或阅读原文下载补丁文件 jetbrains-agent...

    测试小兵
  • EXTJS7 自定义日期时间选择输入框

    路过君

扫码关注云+社区

领取腾讯云代金券