本文讲的是Source引擎的远程代码执行漏洞,可能影响千万游戏玩家

目前多款主流游戏,如CS、绝地要塞等都在使用Source引擎,Source引擎由Valve软件公司开发,这个引擎提供关于渲染、声效、动画、消锯齿、界面、美工创意和物理模拟方面的支持。

其实Source引擎存在漏洞已经不是什么秘密了,早在去年的GeekPwn2016黑客大赛中,就有参赛队员在不接触对方设备,不知道对方账号信息的情况下,侵入了正在游戏的电脑,还通过电脑摄像头监控了游戏者的实时活动。

最近曝出的漏洞是Source SDK中出现了一个缓冲区溢出漏洞,会导致攻击者在客户端和服务器上能执行任意代码。该漏洞可以导致加载特定的躲避攻击(Ragdoll Avalanche) (比如一个玩家被射杀),目前包括CS、绝地要塞等游戏已经修复了这个漏洞。

缺少Bounds Check

BoundsChecker是一个运行时错误检测工具,它主要定位程序运行时期发生的各种错误。当函数nexttoken用于Token的一个字符串时,可以看到,只要找不到NULL字符或者分隔符sep,就会导致str这个buffer被复制到token的buffer中,压根就没有边界检查。

const char *nexttoken(char *token, const char *str, char sep)
{...while ((*str != sep) && (*str != '')){*token++ = *str++;}...
}

漏洞介绍

当以Ragdoll Avalanche处理数据时,像ParseKeyValue就会被调用。这个方法调用nexttoken来Token那些待处理的规则。通过创建一个大于256字符的collisionpair规则,缓冲区szToken就会溢出。因为szToken存储在栈上,所以ParseKeyValue的返回地址就会被覆盖。

class CRagdollCollisionRulesParse : public IVPhysicsKeyHandler
{virtual void ParseKeyValue( void *pData, const char *pKey, const char *pValue ){...else if ( !strcmpi( pKey, "collisionpair" ) )...char szToken[256];const char *pStr = nexttoken(szToken, pValue, ',');...}
}

漏洞预防

ASLR会将可执行文件加载到内存中的地址随机化,并且一个进程内所有加载到内存的可执行文件都必须开启这个功能才能起到漏洞预防的作用。

由于动态库steamclient.dll并没有开启ASLR。这意味着steamclient.dll加载到内存中的地址是可预测的,攻击者可以很方便地定位并使用可执行文件内存中的Token。

ROPgadget的使用

一个更有效的方法就是使用特定的识别gadgets的工具。举个例子,ROPgadget就是个很棒的工具,它可以被用于识别所有的gadgets。如果你能找到一系列retn指令结尾的指令,就能把ROP链的第一条指令的地址插入到栈,当函数返回地址被pop到指令寄存器时,Token就开始执行。由于x86和x64的Token不需要在内存对齐的情况下执行,所以任何地址都能作为Token。我可以把Token指针指向其中一条指令,这样就可以得到更多的指令。

Immunity Debugger插件Mona提供了查找gadget的工具。但是这个插件无法找到所有有用的gadget,如rep movs。Immunity Debugger软件专门用于加速漏洞利用程序的开发,辅助漏洞挖掘以及恶意软件分析。

启动cmd.exe

由于有效载荷的处理方式不同,NULL字符不能被使用,并且大写字符需要转化为小写字符。这意味着我的ROP gadget地址资源及有效载荷的处理方式都很有限。为了解决这个问题,我用一个gadget链来引导shellcode,以定位内存中未修改的原始缓冲区,然后将未修改的有效载荷通过rep movs gadget复制到栈。

这样,Steamclient.dll就导入了LoadLibraryA和GetProcAddressA。现在,我就能往内存中加载任意DLL了,并得到其他的导出函数。比如,导入shell32.dll以获得ShellExecuteA函数,这个函数能启动其他程序。

有效载荷的获取

Source引擎允许将自定义内容打包到地图文件中,因为这样可以在地图中添加一些额外的内容,比如声音或者文字。于是我将Ragdoll Avalanche模型文件打包到一个地图文件中,而且使用与Ragdoll Avalanche模型文件一样的路径。

总结

视频游戏很容易成为黑客进行漏洞利用的目标, 因为视频游戏通常会在用户的家中或者工作中进行,攻击者就是通过漏洞利用进入到组织的公共网络或家中的私人网络。另外,在流行的视频游戏中发现的这个远程代码执行漏洞可以用来创建僵尸网络或者传播勒索软件。

所以建议各位玩家,不要在工作中玩游戏或在不受信任的网络环境中进行游戏。

对那些Source的玩家而言,需要禁用第三方内容的下载以减少攻击。通过cl_allowdownload 0 和 cl_downloadfilter all Token就可以实现禁用第三方内容下载。

由于是在Source SDK中发现的漏洞,可以推测,在其他的第三方模块也很可能存在漏洞。但如果玩家在所有模块下都启用了ASLR,就只有泄漏的内存漏洞才能利用了,从而加大了攻击者漏洞利用的难度。

所以为了防止缓冲区溢出发生,请不要在缓冲区中存储过多的数据。nexttoken函数应该有一个token长度来作为参考,这个参数用来进行Bounds Check。

对于Source游戏的开发者来说,可以使用补丁进行修复,也可以使用chromium团队开发的checkbins.py工具来完成。

除此以外,Source游戏应该可以进行沙箱设置以限制访问并阻止新进程的启动。比如,当利用web浏览器的内存破环漏洞时经常会要用到内核利用,如果进行沙箱设置,则访问用户层的浏览器进程就要受限。

原文发布时间为:2017年7月25日
本文作者:xiaohui
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。
原文链接

Source引擎的远程代码执行漏洞,可能影响千万游戏玩家相关推荐

  1. cve-2019-7609 Kibana远程代码执行漏洞攻击方法和漏洞原理分析

    目录 0x00 前言 0x01 漏洞简介 0x02 环境搭建 0x03 漏洞利用 0x04 漏洞机理 1.POC验证 ​2.漏洞产生原理和攻击思路 3.payload构建 0x05 危害分析和处理建议 ...

  2. Kibana远程代码执行漏洞攻击方法和漏洞原理分析

    漏洞简介 Kibana存在远程代码执行漏洞,影响版本为5.6.15和6.6.0之前的所有版本.拥有Kibana的Timelion模块访问权限的人可以以Kibana的运行权限执行任意代码,包括反弹she ...

  3. 代码审计之CVE-2017-6920 Drupal远程代码执行漏洞学习

     1.背景介绍: CVE-2017-6920是Drupal Core的YAML解析器处理不当所导致的一个远程代码执行漏洞,影响8.x的Drupal Core. Drupal介绍:Drupal 是一个由 ...

  4. 【安全风险通告】Spring Framework远程代码执行漏洞(CVE-2022-22965)安全风险通告第二次更新...

    奇安信CERT 致力于第一时间为企业级用户提供安全风险通告和有效解决方案. 安全通告 近日,奇安信CERT监测到Spring Framework存在远程代码执行漏洞(CVE-2022-22965),在 ...

  5. Word MSDT代码执行漏洞,影响用户多范围广(CVE-2022-30190)

    CVE-2022-30190 漏洞,Word 程序使用 URL 协议调用 MSDT 时存在远程代码执行漏洞.影响用户多,影响范围广,建议用户按照官方教程禁用 MSDT URL 协议. 编号      ...

  6. c++获取一段代码的执行时间_微软IE浏览器JScript脚本引擎远程代码执行漏洞通告...

    文档信息 编号 QiAnXinTI-SV-2019-0022 关键字 IE JScript RCE 远程命令执行CVE-2019-1367 发布日期 2019年09月24日 更新日期 2019年09月 ...

  7. ElasticSearch Groovy脚本远程代码执行漏洞

    什么是ElasticSearch? 它是一种分布式的.实时性的.由JAVA开发的搜索和分析引擎. 2014年,曾经被曝出过一个远程代码执行漏洞(CVE-2014-3120),漏洞出现在脚本查询模块,由 ...

  8. sqlite 0转换为bit_Cisco Talos在SQLite中发现了一个远程代码执行漏洞

    思科Talos的研究人员在SQLite中发现了一个use-after-free() 的漏洞,攻击者可利用该漏洞在受影响设备上远程执行代码. 攻击者可以通过向受影响的SQLite安装发送恶意SQL命令来 ...

  9. Office 远程代码执行漏洞复现过程

    本文来自作者肖志华在 GitChat 上分享 「Office 远程代码执行漏洞复现过程」,「阅读原文」查看交流实录. 编辑 | 天津饭 直接贴本地复现过程,至于怎么利用还请自己思考. 2017年11月 ...

最新文章

  1. HTTP客户端连接,选择HttpClient还是OkHttp?
  2. php虚拟内存设置,虚拟内存有什么用
  3. mysql服务器配置优化
  4. 2012 MUTC 7 总结
  5. asp实现批量录入数据
  6. 【小白学PyTorch】6.模型的构建访问遍历存储(附代码)
  7. matlab生成均匀部分散点图,应用halton序列生成均匀散点图
  8. JavaScript对数组的常见操作
  9. C++中两个类中互相包含对方对象的指针问题
  10. [ZJOI2007][BZOJ1059] 矩阵游戏|二分图匹配|匈牙利算法
  11. 解决iPhone、iPad 或 iPod touch 无法连接Wi-Fi网络问题
  12. 开涛传–记京东“首席”架构师张开涛
  13. 不想荒废你的大学生活吧?看看牛人是怎样成为电子学霸的!
  14. pb 数据窗口设置操作
  15. 2009年的MACBOOK苹果电脑重装MAC OS 10.8.5系统
  16. 目标检测(object detection)—— RCNN总结
  17. java 根据经纬度换算距离
  18. 享受知识饕餮盛宴,尽在2014年课程
  19. AudioStreamBasicDescription: 2 ch, 44100 Hz, ‘lpcm’ (0x00000C2C) 8.24-bit little
  20. 年度发布|华为云2021应用构建技术实践精选集,免费下载

热门文章

  1. python把光标定义到指定的位置并删除之前的字符_python 批量修改预定字符串并将修改后的字符串插入文件指定位置...
  2. js里父页面与子页面的相互调用
  3. rpmbuild打包mysql5.7_用rpmbuild打包mysql
  4. c语言class运行错误,win32 C RegisterClass失败,该如何处理
  5. java十进制小数转化为二进制小数代码 乘二取整法_(四)改掉这些坏习惯,还怕写不出健壮的代码?...
  6. 2021年人工神经网络第一次作业:参考答案-1
  7. 第十七届全国大学智能车竞赛STC芯片申请方法
  8. 第十六届智能车竞赛参赛队员提问与回答 |2021年7月12
  9. 2021年春季学期-信号与系统-第十一次作业参考答案-第二小题
  10. 任艳频老师关于信息与大数据课题组的讨论材料的意见