当前位置:WooYun(白帽子技术社区) >> 移动通讯安全 >> 关于手机应用安全的一些个人感悟

关于手机应用安全的一些个人感悟

horseluke (微碌) | 2012-12-08 18:43

关于移动应用安全,推荐看碳基体最新的总结ppt:http://vdisk.weibo.com/s/jVB2B/1354783291  。本文是一些个人业余研究的不成体系感悟。

一、关于android应用的反编译:jdgui不是万能

反编译安卓应用中dex2jar+jdgui是最常见的用于快速了解手机应用逻辑的方法,不过不少情况下你会发现jdgui给出的代码存在明显逻辑不通的情况。比如说,怎么在还没开始运算,就return呢?怎么运算运算着,就break label呢?


pic-1.png
图1:jdgui给出的代码存在逻辑不通问题

如果结合apktool反编译出来的smail指令代码,你就会发现:jdgui的逻辑判断调整算法可能存在问题。smail指令显示并不存在else、while、for等语法,这些都是靠各种goto来完成控制。jdgui按顺序解析指令,并根据if和goto指令动态进行逻辑判断以及调整。比如如下smail指令:

======================================================
if-lt v0, v2, :cond_0    //表示当v0<v2时,跳转(goto)到“:cond_0”目标标签

…...    //这些是v0>=v1时执行的指令

:cond_0

……    //这些是跳转(goto)到“:cond_0”目标标签后要执行的指令
======================================================


jdgui会可能显示为:
======================================================
if(v0>=v1){         //和“if-lt v0, v2, :cond_0”相反
    //这些是v0>=v1时执行的指令
}
    
…… //这些是跳转(goto)到“:cond_0”目标标签后要执行的指令
======================================================



如果增加如下goto指令:
======================================================
if-lt v0, v2, :cond_0    //表示当v0<v2时,跳转(goto)到“:cond_0”目标标签

…...    //这些是v0>=v1时执行的指令

goto :target_0    //执行完毕后跳到:target_0

:cond_0

……    //这些是跳转(goto)到“:cond_0”目标标签后要执行的指令

:target_0    //:target_0目标标签

……    //执行:target_0后面的指令
======================================================

jdgui有可能显示成:
======================================================
if(v0>=v1){         //和“if-lt v0, v2, :cond_0”在执行逻辑上存在潜在相反
    ……   //这些是v0>=v1时执行的指令
}else{
    ……     //这些是跳转(goto)到“:cond_0”目标标签后要执行的指令
}

//执行target_0指令
======================================================

但也有可能显示成:
======================================================
if(v0>=v1){         //和“if-lt v0, v2, :cond_0”在执行逻辑上存在潜在相反
    ……   //这些是v0>=v1时执行的指令
}

……     //这些是跳转(goto)到“:cond_0”目标标签后要执行的指令
……    //执行target_0指令

======================================================


如果一个if指令集内出现多个不同目标标签的goto时,由于jdgui是按指令顺序进行判断和调整的,那么就有可能因为jdgui的动态调整、导致多个goto无法形成合理的闭合逻辑,这在查看的代码表现上就是和原逻辑相反、或者执行顺序上对不上等各种不符合逻辑的怪事。如果原代码逻辑存在while、for等循环的情况下,这个问题会更加明显。


遇到这种情况,应对方法有二:
(1)不看反编译出来的java代码,直接看smail。难度颇高,但却是成为大神的必备之路。

(2)用XJad反编译jar。它就不会调整逻辑,只是“按原样”解析,这是jdgui动态调整失效、但又想看java逻辑的最便捷方法。

pic-2.png

图2:XJad按原样解析给出的代码

附上根据XJad的代码进行修改,最终调通的java代码。可以见到,实际逻辑和反编译出来的还是存在相当大的差别。

pic-3.png

图3:修改后可调通的代码


二、关于android应用的日志调试:了解应用运行的有效手段

如果在反编译代码无法得出有用信息的情况下,那么寻找甚至插入日志调试代码是另一个很有效的手段。从开发的角度来看,日志调试和记录是必需的编码手段,而其控制手段无非靠某个配置、变量或者常量。android源于java,其面向对象的特性会导致许多日志类并不会剔除,这就为通过修改smail指令获取调试内容创造了条件。比如某应用采用日志类常量控制手段,所以反编译修改其常量后,logcat就将整个通讯过程打印出来了:

pic-4.png

图4:修改某应用日志类常量获取应用运行信息。

如果要了解的逻辑并没有日志输出,或者应用将日志类内的所有方法逻辑去掉,此时的方法就只能通过插入smail指令方法来恢复日志功能。而插入的地方和指令内容需要紧密联系应用逻辑,所以并无通用插入法则。


三、关于安卓webview的数据库存储:可作为判定应用是否钓鱼的一种辅助手段

安卓应用调用webview时,会往应用的私有存储位置(/data/data/[应用标识]/databases)建立webview.db和webviewCache.db。这两个数据库存储了该应用调用webview的历史访问路径、密码记录(明文)、cookies等等。有些应用伪造页面、用webview打开之,妄图通过隐藏url以实现钓鱼,这种情况下,可以通过检查这两个数据库存储的webview数据,就可以使其暴露。

但恶意开发者也可以不伪造页面,通过监控webview,也能完成用户输入数据等各种敏感数据的获取。所以说,这方法存在很大局限性。

另外一个问题是,在root状态下的任何一个应用,是可以读取任意地方的数据的;而且如果要清除应用的webview信息,只能通过应用管理下的“清除数据”完成。所以恶意开发者通过这里窃取信息,并非不可能。

pic-5.png

图5:webviewCache.db

pic-6.png

图6:webview.db中的cookies。SUS是个httponly cookies,而android并不支持


四、关于手机安全研究的困惑

年初,曾放言要进入Windows Phone 7的编程研究中;但要少花钱的当下,最终还是跟随了最便宜的安卓平台,并且圈定在和工作最相关的后端api接口通讯设计研究中。

时光已经到了年底,越研究却只有各种困惑。手机api接口的数据纯粹和丰富性让恶意采集者欢呼雀跃,而针对手机api接口的攻击又无法采取web常见的辅助手段来防御,再加上安卓等操作系统的易于反编译性、考虑服务器负载导致通讯过程不加密或加密算法易被猜测,这一切都使得普通应用的接口防御设计无从入手;而对我来讲,所有的“破坏式”研究根本无法转化为有益的实际开发设计经验,这样的情况可谓始料不及。当提交搜狗号码通缺陷却无法提出防御建议时,心里曾问自己:研究了这么久,有啥用?

破坏容易建设难,末日过后,该往何处去?


五、附录:个人所接触到的有关手机应用中,关于接口通讯部分的一些安全问题
(1)手机应用采取HTTP POST(甚至是HTTP GET)明文发送用户名和密码、或者通讯录、或者IMEI等唯一标识码。
案例:
(A)新浪微盘客户端漏洞造成用户密码泄漏:WooYun: 新浪微盘客户端漏洞造成用户密码泄漏
(B)网易新闻iphone端敏感信息泄露(密码明文传输):WooYun: 网易新闻iphone端敏感信息泄露(密码明文传输)

(2)手机应用加密算法不健壮导致容易被破解或者模拟;或者太健壮导致通讯服务器撑不住高并发和高流量。

(3)手机应用留了太多的调试入口或者调试信息输出。
案例:
(A)深信服手机客户端日志信息泄露:WooYun: 深信服手机客户端日志信息泄露
(B)SECURITY remove lock pattern from being logged:
https://github.com/CyanogenMod/android_frameworks_base/commit/56c014f289e04c0fd769af55c861b6e7bf7b4280
(关联:zone讨论)CyanogenMod被发现居然将用户设置的锁屏手势记录在日志中:
http://zone.wooyun.org/content/1426

(4)手机应用接口输出数据过于丰富,导致敏感信息泄露。
案例:
交委开发软件 泄露的哥隐私:http://gcontent.oeeee.com/b/7d/b7da6c184018c1c0/Blog/379/7fc1ff.html

(5)手机应用接口没有做频次等各种恶意行为检测和限制处理。
案例:
搜狗号码通手机客户端可被恶意攻击、以及隐私泄露问题:WooYun: 搜狗号码通手机客户端可被恶意攻击、以及隐私泄露问题

(6)手机应用接口没有检查传入参数,仅依赖加密手段,导致出现SQL注入等web应用常见的问题。
案例:
(A)蚂蜂窝手机应用背后的HTTP API接口存在SQL注入漏洞:WooYun: 蚂蜂窝手机应用背后的HTTP API接口存在SQL注入漏洞
(B)“魂斗罗”手机应用程序SQL注入(仅靠简要描述归入此类):WooYun: “魂斗罗”手机应用程序SQL注入

(7)手机应用在演示期没做好保密工作,出现应用安装包泄露,导致演示服务器、或演示服务器所在的可连通内外网的C段ip集体暴露。

(8)手机应用数据交由云端处理时出现逻辑错误,导致信息泄露等问题。
案例:
UC云端加速引擎存在非正常泄露referer问题:WooYun: UC云端加速引擎存在非正常泄露referer问题

(9)手机应用配置文件和证书等容易被修改,从而导致可被“打包党”替换配置,以进行钓鱼。
案例:
建设银行android客户端设计逻辑缺陷导致用户被钓鱼:WooYun: 建设银行android客户端设计逻辑缺陷导致用户被钓鱼

(10)手机应用使用webview(此时无法看到url地址),容易被“打包党”替换配置、或者被恶意开发者仿造网页页面、或者被开发者监控webview等,以进行帐号等钓鱼。
案例:
某应用开发商开发的恶意手机应用以盗取微博账号(可惜微博被删,找不到了)

分享到:
  1. 1#
    回复此人 感谢
    斯文的鸡蛋 (顿时我就傻逼了) | 2012-12-08 18:56

    所以现在用智能手机时我都是下意识的排斥

  2. 2#
    回复此人 感谢
    xsser (十根阳具有长短!!) | 2012-12-08 19:07

    安全是以数据为中心的,移动安全末学以为关键在云

  3. 3#
    回复此人 感谢
    xsser (十根阳具有长短!!) | 2012-12-08 19:09

    另外攻击是以获利为前提的 目前看安装个软件到你手机后获利方式完全不需要钓鱼啊 成本高啊

  4. 4# 感谢(1)
    回复此人 感谢
    huliang | 2012-12-14 21:39

    太棒了!这方面我有一点自己的实战经验,要逆向某客户端软件,在很难分析出其协议加密方式时,通过其 手机客户端,很快速的就能找到一些思路。 还有比如支付宝的手机客户端,wp7下的可以更直接的逆向出C#代码,比android逆向出的逻辑更准确,几乎可以直接编译! 这些都对手机应用安全造成非常大的困扰。

  5. 5#
    回复此人 感谢
    huliang | 2012-12-14 21:40

    @xsser 另外问一下,为什么登录状态下和非登录状态下,显示的帖子列表不一样呢?

  6. 6#
    回复此人 感谢
    xsser (十根阳具有长短!!) | 2012-12-14 22:32

    @huliang 社区是封闭的,非登陆情况下的帖子都是社区里的对外的精华帖子

  7. 7#
    回复此人 感谢
    Defa | 2013-12-18 10:56

    本来想点喜欢,结果点成了不喜欢,想取消 不喜欢不行了,想再点击 喜欢也不行了,@xsser 这。。。。

  8. 8#
    回复此人 感谢
    hqdvista (...) | 2013-12-18 11:56

    买个JEB做反编译,绝对牛逼

  9. 9#
    回复此人 感谢
    Mr.leo | 2013-12-19 12:41

    收藏先,谢谢分享。

  10. 10#
    回复此人 感谢
    国士无双 (我来找快乐。) | 2013-12-19 13:21

    收藏,非常给力!

添加新回复

登录 后才能参与评论.

WooYun(白帽子技术社区)

网络安全资讯、讨论,跨站师,渗透师,结界师聚集之地

登录

其它内容

  • 暂无