谷歌近期对外公布了12月份的安全公告,其中包含腾讯安全平台部终端安全团队提交的语音信箱伪造漏洞(cve-2016-6771),该漏洞可导致恶意应用进行伪造语音信箱攻击。目前谷歌已经发布补丁,本文将对该漏洞进行分析。
漏洞概述

phone应用中存在一处未受保护的暴露组件com.android.phone.vvm.omtp.sms.omtpmessagereceiver,该组件接收来自外部的intent,解析承载的vvm协议,构造语音信箱。该漏洞可以被本地恶意应用触发,进行伪造语音信箱攻击。该漏洞属于比较常规的暴露组件问题。
漏洞详情
在对aosp中系统应用进行分析时,发现系统应用teleservice.apk(com.android.phone)存在一处暴露组件,该组件为com.android.phone.vvm.omtp.sms.omtpmessagereceiver。根据组件名字应该是处理某类消息的组件,回想起以前谷歌出现的短信伪造漏洞,于是决定尝试进行分析,看是否存在该类漏洞。
由于该组件是一个广播接收者,于是分析onreceive回调函数处理逻辑,代码如下:
1.当intent承载的额外数据phone为存在的phoneaccount且isvisualvoicemailenabled的时候,会进入vvm协议的解析流程;
2.解析流程中首先通过telephony$sms$intents.getmessagesfromintent,把intent里承载的额外数据构造成smsmessage,通过查看对应处理方法,可以知道intent承载的额外数据可以是3gpp短信消息结构;
3.从短信消息结构中提取出body部分,交由omtpsmsparser.parse解析,流程如下:
通过分析解析流程,可以知道vvm协议由//vvm:status或者//vvm:sync开头,后面有多个字段,由“;”分号作为分割,“=”等号作为键值对,通过分析statusmessage(v4),syncmessage(v4)的构造函数
可以知道,程序要解析vvm协议如下:
//vvm:status:st=xxx;rc=0;rs=xxx;srv=xxx;tui=xxx;dn=xxx;ipt=xxx;u=xxx;pw=xxx;spt=xxx;smtp_u=xxx;smtp_pw=xxx
//vvm:sync:ev=xxx;id=xxx;l=xxx;t=xxx;s=xxx;c=xxx;dt=xxx;srv=xxx;ipt=xxx;u=xxx;pw=xxx
4.根据vvm协议,构造不同的数据结构,最后根据不同的协议执行不同的流程。
5.在测试过程中,发现//vvm:sync可以指定来源,伪造任意号码。而如果要在进入可视化语音邮箱界面,点击播放语音时能够产生语音的下载,需要事先有//vvm:status协议,这样在点击播放时才会去对应的服务器进行账号登录,获取数据(具体的测试本人并深入去测试,如有错误望大家指正),相关vvm协议可以参考资料[1]和[2]。
poc如下 :
构造一个短信消息结构,其中body为符合相关解析流程的//vvm协议,就可以让omtpmessagereceiver根据外部intent承载的额外数据构造伪造的语音信箱。其中,较早版本的android系统曾经出现过伪造短信的漏洞,直接利用那段代码[3],构造短信消息可以。
实际效果
可以伪造语音信箱来源为12345678,欺骗用户
修复方案
谷歌的修复方案是设置该组件为不导出