应用市场部分launcher类应用短信消息提示漏洞分析

部分Launcher应用,未读短信提示漏洞分析

简介:

最近在分析样本的时候,发现部分launcher类 和notification类app的存在短信消息提示存在未验证短信来源,使得有写短信权限(android.permission.WRITE_SMS)的第三方应用写入数据库的短信会被在桌面明显标识为未读数字。这在某些情境下,有可能被利用来伪造短信,达成钓鱼或诈骗的目的,对用户造成危害。

原理:

我们知道,android 系统在收到正常的短信后,会在通知栏弹出通知框,根据用户的设置,震动或响铃提醒等,同时桌面短信图标指示未读短信数量加一,在这个过程中,我们注意到:

第一,通知栏弹出的通知时间很短,提示框不会一直存在,通知结束后要用户主动拉出通知栏才能看到。

需要注意的是,第三方应用写入的短信不会直接出现在通知栏,但是当系统收到一条正常短信后,系统会检查收件箱中未读短信的数量和内容,并提示给用户(部分定制rom多条未读信息则只提示未读消息数量),这个时候同样没有验证短信来源,会将第三方写入的短信认为是正常的未读短信进行提示。

截图1

第二,响铃,震动等情况取决于用户的设置,会存在不同的情况(如静音,只响铃,或只震动,或都有等),除非设置了一直提示,否则也不会一直通知用户。

最终能够在全部情况下提示用户短信未读信息的也只有短信图标上的未读消息数字提示。而取得写短信权限(android.permission.WRITE_SMS)的第三方应用直接向收件箱中写入的短信,却不会触发上述提醒用户的情况,只会在收件箱中突兀的多出一条未读短信。

部分launcher应用,完全覆盖了系统桌面,用户会在这些内容更加丰富、图标更加漂亮、功能更加实用的桌面上处理各种消息。这时候如果launcher不验证短信的来源,简单的从系统收件箱获取未读短信的数量并在桌面短信图标上做出未读信息的数字提醒的话,在一些场景下就会对用户做出误导。

launcher 提示未读信息截图:

2

QQ截图3

 

上图中写入短信后,右下角的未读信息图标直接就会有提示

部分Launcher应用实现短信未读消息提示的方法:

这些Launcher通常使用自己制作的桌面取代了系统桌面,在短信消息提醒模块,通常采用ContentObserver监控数据库状态变化,并查询数据库中的未读短信,获取到未读数量,下面是某个launcher应用的notification模块的部分实现代码:

截图5

截图6

 

当然,第三方应用在launcher桌面下向数据库写入短信,依然无法自行触发通知栏的弹窗提醒,和铃声,震动等提示而只是会在桌面短信图标的未读数字上加一,这在用户正在使用手机的时候会显得很突兀,危害并不大。但是在如下情境下:

会议后(开会的时候手机通常关机或设置静音),晚上睡觉(不关机的用户),驾车行驶,运动等各种用户不会完全留意手机界面和状态的时候(攻击者可以监控手机是否锁屏,可在手机锁屏的时候向收件箱写入构造的短信),用户随后使用手机的时候看到短信未读消息图标上的数字提示通常就会认为收到了一条正常的信息(只有极少用户会主动在通知栏中去确认),更糟糕的是如果这个过程中用户收到了一条正常短信,那么即使用户在通知栏中去确认,也将得到糟糕的结果,通知栏同样会将第三方写入的短信当作未读提示给用户,这时用户已经完全无法区分短信是否正常了,攻击者也就达到了目的。

以下是在android 4.4.2 的nexus虚拟机中系统通知栏下拉菜单内容的截图:

截图7

显然上图中的的这几个号码和内容是伪造的,但是却会被提示出来,再结合launcher应用的未读信息图标上的数字提示,结果……

解决方案:

对用户:

这个问题事实上重点在于第三方应用对短信数据库的可写操作,幸好谷歌在android 4.4系统及5.0上都已经限制了应用的短信操作权限,攻击者已经很难直接向收件箱写入短信。但是这个问题在android4.4 以下版本以及一些厂商的定制rom中依然存在。下面在源码中看看android 4.4和android4.3两个版本android系统对权限的控制:

  1. 在Android4.3中,Google加入了AppOps模块,用来对应用权限进行控制。在4.3版本中,每一项权限默认都是AppOpsManager.MODE_ALLOWED;

截图8

所以在Android4.3中,虽然添加了AppOps模块,但是对各项权限没有主动限制。

  1. 在Android4.4中,AppOps的代码进行了一些改动。

截图9

每项操作的默认权限由opToDefaultMode()决定。

截图10

在opToDefaultMode中使用了sOpDefaultMode数组来描述权限。

所以关键就是sOpDefaultMode数组的内容,决定了默认权限的设置。

sOpDefaultMode的内容如下:

截图11

图中红框部分表明,当操作是OP_WRITE_SMS时,结果是MODE_IGNORED,也就是说,当需要写短信的权限时,默认会失败。

通过上面的对比,相信大家可以看出android4,4及以上版本对短信写入权限的限制更加的严格,这可以在极大程度上降低手机受到本地短信伪造攻击的风险,因此强烈建议用户升级自己手机的操作系统版本到4.4以上,更糟的是在第三方应用可以写入短信的系统上(如4.3及以下版本),实际上系统短信提示本身也存在一定问题,比如,第三方应用写入的短信在收件箱中标识为未读,却不会被系统提示,但是如果随后收到了一条正常短信,那么第三方应用写入的伪造的短信跟系统收到的正常短信都会在通知栏被提示,并且在收件箱上提示未读短信数字,普通用户同样难以区分。

另外,请用户注意,一些定制的rom,以及部分安全软件会监控应用的权限,如果你的手机或安全软件提示你某个应用申请对短信数据库的写入权限,请千万慎重。

对launcher:

首先建议开发商尽量不要完全替代系统的短信箱,因为android的系统,是在短信写入收件箱之前,做出一些列通知动作,告知用户收到短信状态的,而不是仅仅通过短信数据库的状态变化来做通知,这样可以在当前条件下最大程度避免错误的未读短信消息提示。

在launcher中验证短信来源,这里想到的一种方案是:在短消息提示组件中限制在接收到系统的短信广播后再进行未读消息统计,未收到系统广播就不去做未读信息提示,在用户读取短信前,未读短信提示的条目数就是拦截到的短信系统广播数:

截图12

当然,这样做也会存在申请权限过高(有广播接收权限同时就具有了终止广播的权限,不明白谷歌为啥不分开),广播接收成功与否的问题等。

能力所限也就想到这么多了。

总结:

这不是一个多么高深的漏洞,这只是一个数字提示的小问题,只不过可能造成比较糟糕的结果。短信操作权限的控制已经在android 4.4以后得到解决,但是目前还有大量的早期版本仍在使用中,从系统角度彻底解决这个问题比较困难。但是我们毕竟不能把甄别短信真伪的责任完全推给用户,那样用户就太悲剧了!

此条目发表在安全分类目录。将固定链接加入收藏夹。

应用市场部分launcher类应用短信消息提示漏洞分析》有 1 条评论

  1. 路西说:

    感觉中标了

评论功能已关闭。