关于移动应用安全,推荐看碳基体最新的总结ppt,本文是一些个人业余研究的不成体系感悟。

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

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

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

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

if-lt v0, v2, :cond_0    //表示当v0

…...    //这些是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

…...    //这些是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逻辑的最便捷方法。

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

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

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

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

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

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

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

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

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

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

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

图5:webviewCache.db

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

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

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

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

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

五、附录:个人所接触到的有关手机应用中,关于接口通讯部分的一些安全问题

(1)手机应用采取HTTP POST(甚至是HTTP GET)明文发送用户名和密码、或者通讯录、或者IMEI等唯一标识码。
案例:
(A)新浪微盘客户端漏洞造成用户密码泄漏:http://www.wooyun.org/bugs/wooyun-2010-012961
(B)网易新闻iphone端敏感信息泄露(密码明文传输):http://www.wooyun.org/bugs/wooyun-2010-07673

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

(3)手机应用留了太多的调试入口或者调试信息输出。
案例:
(A)深信服手机客户端日志信息泄露:http://www.wooyun.org/bugs/wooyun-2010-013940
(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)手机应用接口没有做频次等各种恶意行为检测和限制处理。
案例:
搜狗号码通手机客户端可被恶意攻击、以及隐私泄露问题:http://www.wooyun.org/bugs/wooyun-2012-06459

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

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

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

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

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

[via Horse_Luke]

源链接

Hacking more

...