在过去的几周中,Check Point Research与CyberInt共同确认了一系列漏洞,这些漏洞一旦被攻击者利用,可能会导致全球第二大游戏公司EA Games的数百万玩家帐户被接管。同时,这些漏洞可能还会导致攻击者非法获取用户的信用卡信息,也可能导致攻击者以用户的身份购买游戏。
CyberInt和Check Point在第一时间将这些安全漏洞通知EA Games,同时利用我们的专业能力帮助EA修复这些漏洞,以保护其游戏玩家的利益。

二、关于Origin:EA游戏平台

EA Games拥有超过3亿客户,公司市值目前在50亿美元左右,是全球第二大游戏公司,拥有一系列家庭游戏,例如FIFA、Maden NFL、NBA Live、UFC、The Sims、Battlefield、Command and Conquer、Medal of Honor等。所有这些游戏都依赖于其自行开发的Origin游戏平台,该平台允许用户在计算机和移动设备上购买EA游戏并运行。
除了游戏功能之外,Origin还包含社交功能,例如个人资料管理、与朋友联网聊天或直接加入游戏、与Facebook、Xbox Live、PlayStation Network、Nintendo Network等网络站点的社区集成。

三、漏洞发现过程

与Check Point Research团队之前在另一个非常流行的游戏平台Fornite上发现的漏洞类似,在EA平台上发现的漏洞不需要用户提交任何详细信息。相反,该漏洞利用了EA Games将身份验证令牌与EA Games用户登录过程中内置的oAuth单点登录(SSO)和TRUST机制结合使用的弱点。
我们发现,EA Games大量使用了云平台,该公司在Microsoft Azure托管多个域名,包括http://ea.com和http://origin.com,以便为其遍布全球的玩家提供各种服务,例如创建新的游戏帐户、连接进入Origin社交网络、在EA的在线商店中购买更多游戏等。
视频:EA Games漏洞导致帐号泄露和身份信息窃取https://youtu.be/JMjoi60JpTY

四、技术细节

4.1 http://eaplayinvite.ea.com子域名劫持
EA Games运营多个域名,包括http://ea.com和http://origin.com,以便为其遍布全球的玩家提供各种服务,包括创建新的Apex Legend帐户、连接到Origin社交网络、在EA的在线商店购买新的游戏等。
通常,像EA Games这样依赖于云服务的公司所提供的每项服务,都会在一个唯一的子域名地址上注册,例如http://eaplayinvite.ea.com,并且具有指向特定云服务商主机的DNS指针(A记录或CNAME记录)。在我们的示例中,http://ea-invite-reg.azurewebsites.net是一个Web应用程序服务器,会在后台运行所需的服务。http://eaplayinvite.ea.com的DNS指针指向CNAME记录,即http://ea-invite-reg.azurewebsites.net:

Azure是由Microsoft提供支持的云服务提供商解决方案,允许公司注册新的服务(例如:Web应用程序、REST API、虚拟机、数据库等),以便向全球的在线客户提供这些服务。
每个Azure用户帐户都可以请求注册特定服务名称(服务名称.http://azurewebsites.net),该名称将在Azure子域名验证过程中验证其CNAME记录,并连接到组织特定的域名或子域名。
然而,根据CyberInt进行的研究,他们发现http://ea-invite-reg.azurewebsites.net服务在Azure云服务中不再使用,但唯一的子域名http://eaplayinvite.ea.com仍然使用CNAME配置重定向到该域名。http://eaplayinvite.ea.com的CNAME重定向允许我们在自己的Azure帐户中创建新的成功注册请求,并将http://ea-invite-reg.azurewebsites.net注册为我们新的Web应用程序服务。这样一来,我们基本上就劫持了http://eaplayinvite.ea.com的子域名,并且能够监控EA合法用户的请求。
将“eaplayinvite.ea.com”的CNAME重定向更改为我们自己的Azure帐户中托管的“ea-invite-reg.azurewebsites.net”:

4.2 oAuth无效重定向导致帐户接管
在控制了http://eaplayinvite.ea.com子域名之后,我们的团队找到了一个新的目标,即研究如何滥用TRUST机制。TRUST机制存在于http://ea.com和http://Origin.com域名及其子域名之间。如果能成功滥用该机制,那么我们就能够操纵oAuth协议的实施方式,并利用该漏洞实现完全的帐户接管。
我们首先需要确定EA Games是如何配置oAuth协议并为其用户提供单点登录(SSO)机制。SSO机制通过唯一的SSO令牌(SSO Token)交换用户凭据(用户名和密码),然后使用该令牌对EA网络的任何平台(例如:http://accounts.origin.com)进行身份验证,而无需再次输入其凭据。
在分析EA Games的oAuth SSO在几个EA服务(例如:http://answers.ea.com、http://help.ea.com、http://accounts.ea.com)中具体实现的过程中,我们对EA的身份验证流程进行了研究,并掌握了有关目前实施的TURST机制的更多信息。
作为使用EA全局服务通过http://answers.ea.com成功进行身份验证过程的一部分,oAuth HTTP请求将发送到http://accounts.ea.com以获取新的用户SSO令牌,然后应用程序应通过http://signin.ea.com将其重定向到名为http://answers.ea.com的最终EA服务以识别用户。
使用http://answers.ea.com进行身份验证的oAuth SSO请求:

但是,由于EA的服务器端还具有一些限制,所以仅仅生成上述请求,将生成的SSO令牌重定向到我们这边还并不足够。
下面,我们将分析EA引入的限制,并逐一说明我们如何成功绕过这些限制,从而使我们的攻击过程武器化。

五、突破EA最后的防线

5.1 限制1:缺少有效的引用
为了攻陷EA帐户,研究团队需要将上文提到的请求发送到http://accounts.ea.com,其中也包括修改后的参数,该参数将伪装成受害用户的身份。
但是,http://accounts.ea.com的后端服务器会通过检查HTTP Referer头部的方式来验证请求是否最初是来自受信任的Origin域名。

一、概述在过去的几周中,Check Point Research与CyberInt共同确认了一系列漏洞,这些漏洞一旦被攻击者利用,可能会导致全球第二大游戏公司EA Games的数百万玩家帐户被接管。同时,这些漏洞可能还会导致攻击者非法获取用户的信用卡信息,也可能导致攻击者以用户的身份购买游戏。CyberInt和Check Point在第一时间将这些安全漏洞通知EA Games,同时利用我们的专业能... PostMessage A PostMessage 是Windows API(应用程序接口) 中的一个常用函数,用于将一条消息放入到消息队列中。消息队列里的消息通过调用GetMessage和PeekMessage取得。 折叠参数说明 hWnd:其 窗口 程序接收消息的 窗口 的句柄。可取有特定含义的两个值: HWND_BROADCAST:消息被寄送到系统的所有顶层 窗口 ,包括 无效 或不可见的非自..
postcss-pxtorem是一款基于PostCSS插件,用于将像素单位生成rem单位。 这款插件能够让开发人员直接按照设计图的尺寸开发,并且能自动将像素单位编译转换成rem。 前端开发还原设计稿的重要性毋庸置疑,目前应用的单位最多还是rem,然而每次在制作过程中需要自己计算rem值,非常不便。接下来介绍一下postcss-pxtorem的使用。 一、postcss-pxtorem 配置步骤 1. 安装postcss-pxtorem依赖 cnpm install postcss-pxtorem --s.
钩子(Hook),是Windows消息处理机制的一个平台,用用程序可以在上面设置子程以监视指定 窗口 的某种消息,而且所监视的 窗口 可以是其他进程所创建的(我始终认为用hook去钩当前自己的进程没多大意义,去钩别的进程才比较实在)。当消息到达后,在目标 窗口 处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。   钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。
Python: PostMessage 后台发送鼠标消息给模拟器 无效 的解决办法问题过程解决 在使用自己写的 Python开发 游戏 自动化后台脚本过程中,发现其对安卓模拟器这种Qt5QWindowIcon类名的 窗口 不起作用,下面是解决办法 首先通过spy++确定了需要发送消息的 窗口 不是最上层的Qt5QWindowIcon类,而是第四级RenderWindowWindow,Qt5QWindowIcon这一 窗口 其次通过监视其鼠标消息,发现实际用鼠标点击的消息队列如下: 并且需要注意的是在WM_LBUTTO
这段 CSS 代码看起来是合理的。它定义了一个选择器 cnblogs_post_body .language-js,表示选择所有 class 为 language-js 的元素,并将这些元素的文本颜色设为黑色(颜色值 000 表示黑色)。 但是,这段代码可能存在一些问题。首先,cnblogs_post_body 是什么元素?如果它是一个 class,那么这段代码的意思是选择所有 class 为 language-js 的元素,并且这些元素是 cnblogs_post_body 的子元素。如果 cnblogs_post_body 是一个 id,那么这段代码的意思是选择 id 为 cnblogs_post_body 的元素的所有 class 为 language-js 的子元素。因此,如果你想确保这段代码的正确性,需要确定 cnblogs_post_body 是 class 还是 id。 其次,如果你想让这段代码生效,需要确保你的 HTML 文档中有 class 为 language-js 的元素。否则,这段代码就没有任何作用。 总的来说,这段代码看起来是合理的,但是在使用之前,你需要确保 cnblogs_post_body 的类型以及 HTML 文档中是否存在 class 为 language-js 的元素。