由SteamCN的坛友转载,来源于Reddit的新鲜漏洞。

Steam Windows客户端存在0day漏洞?

steamcn.com

这个漏洞的威胁如何?利用难度如何?作为普通玩家有没有切实可行的办法去防这个漏洞?


刚读完 Vasily Kravets 的漏洞分析,随手答一下好了。

先上总结:这次 Steam 客户端爆出的漏洞是一个许可权提升类的漏洞,相当于在你的系统里提前开好了后门。本来木马病毒在你的电脑上可能什么许可权都没有,利用了这个漏洞之后就能直接窃取到最高许可权,算是一个比较严重的漏洞。

利用难度嘛,十到十五分钟,取决于黑客打字速度有多快了。如果有提前写好的攻击脚本的话,那就是一秒不到。不过漏洞利用的前提是黑客有权在你的电脑上执行代码,所以对于普通用户来说,只要你不去下载一些可疑的软体、不去点击一些可疑的链接,那应该就不会受到攻击。如果你一定要下载可疑软体的话,最好使用虚拟机,或者干脆卸载掉 Steam、禁用Steam的后台服务。

好,解答完吃瓜网友最关心的问题之后,我要开始吐槽了。

在这次 Steam 事件中,这个安全漏洞根本不是最严重的问题,最严重的问题是 Steam 运营公司 Valve 惊人的愚蠢,双倍的愚蠢。

首先蠢的是这个漏洞的成因。Steam的后台服务不知道为什么,会把注册表中「HKLMSoftwareWow6432NodeValveSteamApps」项下的子项全部设置成「所有用户可读可写」。黑客在这个项下创建一个软连接,把连接指向注册表中的任何一处位置,就能借助Steam把这处位置改成可读可写,然后改注册表提权就可以了。

这个蠢到让人发指的设计揭示出一个惊人的事实:虽然 Valve 的程序员对自己改注册表的本事很自信,抬手就是什么「All User Full Control」,但他们可能连软连接这个基本概念都没听过,不然他们决然写不出这种逻辑来。

其次蠢的是 Valve 公司的应对。对于这样一个板上钉钉的提权漏洞,连攻击代码都已经被人发在网上了,Valve 公司居然还能死鸭子嘴硬,一边嚷嚷著什么「这个漏洞没有威胁,黑客根本攻击不了」,一边威胁 Vasily Kravets 不许公布漏洞。

既然这个漏洞攻击不了,公布就公布了呗,您搁那害怕什么呢?

归根结底,Valve 根本不在乎用户的电脑安全,也不想解决问题,他们只想解决提出问题的人。如果 Valve 坚持用这种态度做产品,我相信他们一定能够成为世界最大的电脑病毒发行平台,让上亿用户足不出户就能享受到「高投入、高质量、高回报」的3A级病毒大作。


补充:听说 Steam 的 Beta 版已经在修复漏洞了,戳这里可以看到另一个匿名答主写的升级教程和禁用服务教程。


Valve的态度么,还是一如既往的傲慢……

批判的话,上面大佬说完了,我们想想该怎么做吧,今天在新闻大量爆出后,Valve已经开始在beta版的客户端中修复这一漏洞了:

1.你在steam设置中开启,加入Steam Bete测试

2. 你若不想使用Beta客户端(毕竟这货可以一天更新三次),那么你可以手动禁用steam client service

方式:打开控制面板-管理工具-组件服务-服务(本地),找到steam client service,右键属性,启动类型改为禁用

当然,禁用服务存在一定的影响性,可能导致部分联机游戏无法进行联网

其实,说时候现阶段影响不是特别大(不随意添加奇怪的游戏/激活CDK),但是有点搞不懂正式版客户端(截止8.12)为什么还及时跟进Beta呢?


我更新一下这个漏洞事件的后续:

正如高票 @Gh0u1L5 所说Beta版修复了Kravets公开的提权漏洞。很快正式版也修复了这个漏洞。我看了Kravets写的write-up之后,决定自己找一下能不能绕过修复。一找果然能轻易绕过。

Valve的修复是不再调用RegSetKeySecurity设置「HKLMSoftwareWow6432NodeValveSteamApps」的子键为Users可读写。但是使用Process Monitor,我发现Steam Client Service在启动是会复制C:Program Files (x86)SteaminSteamService.dll和C:Program Files (x86)SteaminSteamService.exe到C:Program Files (x86)Common FilesSteam下,替换掉原本的SteamService.dll和SteamService.exe。

而C:Program Files (x86)Steamin是可以被Users写入的。所以思路是用旧版带漏洞的SteamService.dll/.exe替换掉已更新的SteamService.dll/.exe。然后启动Steam Client Service。这样它启动时使用的就是有漏洞的版本,接下来我们就又能用原来的PoC提权了。

由于Valve根本不关心本地提权漏洞,所以我发现绕过之后没有提交,并且直接公开细节在了GitHub上:

Bypassing the Fix for Steam Reg-symlink Privilege Escalation Vulnerability?

xiaoyinl.github.io图标

Kravets帮我给这个漏洞申请了一个CVE:CVE-2019-15315

随后Kravets又发现了新的Steam提权0day(CVE-2019-15316):

One more Steam Windows Client Local Privilege Escalation 0day?

amonitoring.ru图标

终于Valve决定修复这些提权0day啦:

https://steamcommunity.com/groups/SteamClientBeta#announcements/detail/1599262071399843693?

steamcommunity.com

Beta版已经修复了所有公开的0day,建议用户按 @Neko Fox 说的方法更新Beta版。

Valve后来承认了自己忽略Kravets的漏洞是错误的。同时修改了HackerOne上的漏洞项目规则,明确规定本地提权是有效漏洞。

Valve - Bug Bounty Program | HackerOne?

hackerone.com图标

Attacks that involve the user running malware that then places or modifies content on the target machine, which Steam could later run as the local user. However, any case that allows malware or compromised software to perform a privilege escalation through Steam, without providing administrative credentials or confirming a UAC dialog, is in scope. Any unauthorized modification of the privileged Steam Client Service is also in scope.

总结:虽然Valve之前对于提权漏洞的处理非常不负责任,但是鉴于他们现在承认了错误,我还是比较开心的。本次事件再次证明了,对于厂商错误忽略的漏洞,公开是最好的方法,这样厂商迫于压力也要迅速解决漏洞。如果当初Kravets没有公开漏洞,修复遥遥无期。


客户端的RCE漏洞一直都不少见,但是并不是都好利用,但 Steam 有自己的社区会导致这类攻击变得可行,可传播。


我在 ValveSoftware/steam-for-linux 给网页版提过一个issue(当然和这个漏洞没有关系),几个月了没人管,只加了个tag。翻一下还有人16年提的最近才close的。反馈效率低得可怕


推荐阅读:
相关文章