QQ游戏Android客户端漏洞导致任意代码执行和密码泄漏

2012-8-21 10:33:58 来源:网络转载 浏览:320
QQ最新漏洞公布:QQ游戏Android客户端漏洞导致任意代码执行和密码泄漏。

简要描述:
如题,可以导致攻击者的任意代码被自动执行,可以进一步进行欺诈或者其他恶意行为,或者获取用户账号和密码。

详细说明:
QQ游戏Android客户端采用模块化设计,部分游戏以APK的行为下载到手机SD卡中,然后通过ClassLoader动态加载其中的classes.dex文件执行,从而运行不同的游戏。在这个设计中,存在两个问题:
1. 保存在SD卡的文件可以被其他任意应用软件读写;
2. 在动态加载存储在SD卡上的classes.dex文件之前,没有对其完整性做验证。
因此,攻击者可以替换已经下载的游戏文件,替换后的代码将在用户启动该游戏时得以执行。特别的,如果攻击者对这些文件采用重打包技巧植入恶意代码或者对用户进行欺诈,可以展开进一步攻击,例如获得用户密码或者搜集本地隐私数据等。

漏洞证明:
1. 关于SD卡文件可以任意读写,不再用代码证明,引用一下官方文档。
在下列链接中:
http://developer.android.com/guide/practices/security.html
有提到:
Files created on external storage, such as SD Cards, are globally readable and writable. Since external storage can be removed by the user and also modified by any application, applications should not store sensitive information using external storage.
We strongly recommend that applications not store executables or class files on external storage prior to dynamic loading.
We have seen many instances of applications attempting to load code from insecure locations, such as downloaded from the network over unencrypted protocols or from world writable locations such as external storage. These locations could allow someone on the network to modify the content in transit, or another application on a users device to modify the content, respectively.
2. 关于修改后的代码会被QQ游戏不验证就执行,说明如下:
以五子棋游戏为例,其下载的APK文件位于:
/sdcard/.QQGame/8/qqfive1.0_androidwvga_build0015.apk
下载后,该文件被解压缩到同目录。
拷出这个文件,用apktool解包,可以看到只有一个入口点为com.tencent.qqgame.client.QQGameActivity。
在这个类的onCreate方法中,插入一段smali代码如下:

QQ游戏Android客户端任意代码执行及密码泄漏

即只插入一条Log.d指令。
使用apktool重新打包,并签名,得到新的qqfive1.0_androidwvga_build0015.apk文件,并将其解压缩。将得到的这些文件覆盖掉原来/sdcard/.QQGame/8/目录下的软件,在QQ游戏中运行五子棋,Logcat记录如下:

QQ游戏Android客户端任意代码执行及密码泄漏

可以看到,上述Log.d语句已经顺利被执行。
本例说明QQ游戏在动态加载其位于SD卡上的可执行程序时,并未对其完整性进行验证,就直接加载运行。因此,攻击者有两种方法实施攻击:
1. 实现一个以com.tencent.qqgame.client.QQGameActivity为入口点的恶意代码放到这些目录下;
2. 重打包原来的五子棋软件,在QQGameActivity中加入对恶意代码的调用。
其中,第二种方法不影响用户正常运行五子棋游戏。

通过这个漏洞,攻击者可以修改五子棋等游戏的代码,使得弹出虚假的界面诱使用户输入账号密码,也可以在用户正常输入账号密码登陆时记录下来并并回传,还可以搜集用户手机上的其他隐私数据并回传。

修复方案:
根据官方文档,If an application does retrieve executable files from external storage they should be signed and cryptographically verified prior to dynamic loading.
即:在加载并执行SD卡上的软件之前,对其进行完整性验证。最佳的方案是签名和加密,最快的解决方案是做完整性验证。
其实我很奇怪,你们都在数据库里记下了这些要下载软件的哈希值,在加载前怎么都不验证一下。

(0)
(0)