漏洞分析

0

高危漏洞

6

中危漏洞

3

低危漏洞

5

警告

文件名 sltApp.apk
上传者 admin
文件大小 6.6372213363647MB
MD5 afca9afe208fcedc3b8f2c6e05f9e08b
包名 cn.haike.com.slt
Main Activity cn.haike.com.slt.MainActivity
Min SDK 7
Target SDK 10

权限列表

# 名称 说明 提示
0 android.permission.ACCESS_COARSE_LOCATION 访问大概的位置源(例如蜂窝网络数据库)以确定手机的大概位置(如果可以)。恶意应用程序可借此确定您所处的大概位置。 注意
1 android.permission.ACCESS_FINE_LOCATION 访问精准的位置源,例如手机上的全球定位系统(如果有)。恶意应用程序可能会借此确定您所处的位置,并可能消耗额外的电池电量。 注意
2 android.permission.ACCESS_LOCATION_EXTRA_COMMANDS 访问额外的位置信息提供程序命令。恶意应用程序可借此干扰GPS或其他位置源的正常工作。 注意
3 android.permission.BLUETOOTH 允许应用程序查看本地蓝牙手机的配置,以及建立或接受与配对设备的连接。 注意
4 android.permission.BROADCAST_STICKY 允许应用程序发送顽固广播,这些广播在结束后仍会保留。恶意应用程序可能会借此使手机耗用太多内存,从而降低其速度或稳定性。 注意
5 android.permission.GET_TASKS 允许应用程序检索有关当前和最近运行的任务的信息。恶意应用程序可借此发现有关其他应用程序的保密信息。 注意
6 android.permission.READ_CONTACTS 允许应用程序读取您手机上存储的所有联系人(地址)数据。恶意应用程序可借此将您的数据发送给其他人。 注意
7 android.permission.READ_PHONE_STATE 允许应用程序访问设备的手机功能。有此权限的应用程序可确定此手机的号码和序列号,是否正在通话,以及对方的号码等。 注意
8 android.permission.RECEIVE_SMS 允许应用程序接收和处理短信。恶意应用程序可借此监视您的信息,或者将信息删除而不向您显示。 注意
9 android.permission.RECORD_AUDIO 允许应用程序访问录音路径。 注意
10 android.permission.REORDER_TASKS 允许应用程序将任务移至前端和后台。恶意应用程序可借此强行进入前端,而不受您的控制。 注意
11 android.permission.WRITE_CONTACTS 允许应用程序修改您手机上存储的联系人(地址)数据。恶意应用程序可借此清除或修改您的联系人数据。 注意
12 android.permission.ACCESS_NETWORK_STATE 允许应用程序查看所有网络的状态。 提示
13 android.permission.ACCESS_WIFI_STATE 允许应用程序查看有关WLAN状态的信息。 提示
14 android.permission.CAMERA 允许应用程序使用相机拍照,这样应用程序可随时收集进入相机镜头的图像。 提示
15 android.permission.CHANGE_NETWORK_STATE 允许应用程序更改网络连接的状态。 提示
16 android.permission.CHANGE_WIFI_STATE 允许应用程序连接到WLAN接入点以及与WLAN接入点断开连接,并对配置的WLAN网络进行更改。 提示
17 android.permission.GET_ACCOUNTS 允许应用程序获取手机已知的帐户列表。 提示
18 android.permission.INTERNET 允许程序访问网络. 提示
19 android.permission.MODIFY_AUDIO_SETTINGS 允许应用程序修改整个系统的音频设置,如音量和路由。 提示
20 android.permission.MOUNT_UNMOUNT_FILESYSTEMS 允许应用程序装载和卸载可移动存储器的文件系统。 提示
21 android.permission.VIBRATE 允许应用程序控制振动器。 提示
22 android.permission.WRITE_EXTERNAL_STORAGE 允许应用程序写入SD卡。 提示

四大组件

组件名称

cn.haike.com.slt.MainActivity
com.sangfor.activity.EasyappUtil
com.sangfor.activity.EasyappUtilNonTransparent
com.sangfor.activity.CertManageActivity
com.sangfor.activity.ImportCertActivity
com.sangfor.activity.RandCodeActivity
com.sangfor.activity.NextPassAuthActivity
com.sangfor.activitylock.LockActivity
com.sangfor.activity.SSOVerifyCodeActivity
com.sangfor.activitylock.LockActivityForWork
com.sangfor.sec.share.ChooserActivity
com.sangfor.sec.share.ResolverActivity
com.sangfor.work.WorkLoginActivity
com.sangfor.activity.PasswordPolicyActivity

com.sangfor.receiver.PolicyUpdateReceiver

com.sangfor.provider.SecureOperationProvider

第三方库

# 库名 介绍
0 org.apache.cordova Mobile apps with HTML, CSS & JSTarget multiple platforms with one code base

静态扫描发现风险点

风险等级 风险名称

中危

检测到当前标志被设置成true或没设置,这会导致adb调试备份允许恶意攻击者复制应用程序数据,造成数据泄露。

中危

检测到4处证书弱校验漏洞。

位置: classes.dex
com.sangfor.ssl.vpn.utils.network.d;
com.sangfor.ssl.vpn.utils.network.f;
com.sangfor.d.a.b;
org.apache.cordova.FileTransfer$3;

当移动App客户端使用https或ssl/tls进行通信时,如果不校验证书的可信性,将存在中间人攻击漏洞,可导致信息泄露,传输数据被篡改,甚至通过中间人劫持将原有信息替换成恶意链接或恶意代码程序,以达到远程控制等攻击意图。建议:
对SSL证书进行强校验,包括签名CA是否合法、证书是否是自签名、主机域名是否匹配、证书是否过期等。

参考案例:
www.wooyun.org/bugs/wooyun-2014-079358

参考资料:
http://drops.wooyun.org/tips/3296
http://wolfeye.baidu.com/blog/webview-ignore-ssl-error/
https://jaq.alibaba.com/blog.htm?id=60

中危

该app需要移除大部分日志打印代码。
经扫描该包仍存在大量打日志代码,共发现31处打日志代码.(此处扫描的日志打印代码,是指调用android.util.Log.* 打印的.)
详情如下:

位置: classes.dex
com.sangfor.support.multidex.a;->a(Landroid/content/Context;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.phonegap.plugins.childBrowser.ChildBrowser;->openLocalFiles(Ljava/lang/String;)Ljava/lang/String;==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.phonegap.plugins.childBrowser.ChildBrowser;->openExternal(Ljava/lang/String; Z)Ljava/lang/String;==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.support.multidex.e;->d(Ljava/io/File;)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.support.multidex.a;->a(Ljava/io/File;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.phonegap.plugins.childBrowser.ChildBrowser$1$1;->onDismiss(Landroid/content/DialogInterface;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.support.multidex.e;->a(Ljava/io/File;)Z==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.support.multidex.a;->a(Ljava/io/File; Ljava/io/File;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.bugreport.logger.Log;->a(Landroid/content/Context;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.support.multidex.e;->a(Ljava/util/zip/ZipFile; Ljava/util/zip/ZipEntry; Ljava/io/File; Ljava/lang/String;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.support.multidex.a;->a(Landroid/content/Context;)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.support.multidex.e;->a(Landroid/content/Context; Ljava/io/File; Ljava/io/File;)Ljava/util/List;==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.test.EmptyActivity;->a()V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
cn.haike.com.slt.MainActivity;->onCreate(Landroid/os/Bundle;)V==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.support.multidex.a;->c(Landroid/content/Context;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.support.multidex.e;->a(Ljava/io/File; Ljava/io/File;)Ljava/util/List;==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
cn.haike.common.utils.ADHttpClient;->execute(Lorg/apache/http/client/methods/HttpUriRequest; Lorg/apache/http/protocol/HttpContext;)Lorg/apache/http/HttpEntity;==>android.util.Log;->e(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.bugreport.a;->()V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.support.multidex.e;->a(Ljava/io/File; Ljava/lang/String;)V==>android.util.Log;->w(Ljava/lang/String; Ljava/lang/String;)I
com.phonegap.plugins.childBrowser.ChildBrowser$ChildBrowserClient;->onPageStarted(Landroid/webkit/WebView; Ljava/lang/String; Landroid/graphics/Bitmap;)V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.bugreport.a;->a()V==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.support.multidex.a;->c(Landroid/content/Context;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.support.multidex.a;->a(Landroid/content/Context;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.support.multidex.e;->a(Ljava/io/File; Ljava/lang/String;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.test.EmptyActivity;->onCreate(Landroid/os/Bundle;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.support.multidex.a;->a(Ljava/io/File;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.phonegap.plugins.childBrowser.ChildBrowser;->getOpenFileIntent(Ljava/lang/String;)Landroid/content/Intent;==>android.util.Log;->d(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.ssl.vpn.common.ai;->a(I Ljava/lang/String;)V==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.support.multidex.e;->a(Ljava/io/File; Ljava/io/File;)Ljava/util/List;==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.support.multidex.e;->a(Landroid/content/Context; Landroid/content/pm/ApplicationInfo; Ljava/io/File; Z)Ljava/util/List;==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I
com.sangfor.support.multidex.a;->a(Ljava/lang/String;)Z==>android.util.Log;->i(Ljava/lang/String; Ljava/lang/String;)I

中危

检测到21条敏感明文信息,建议移除。

位置: classes.dex
'file:///android_asset/' used in: Lorg/apache/cordova/IceCreamCordovaWebViewClient;->generateWebResourceResponse(Ljava/lang/String;)Landroid/webkit/WebResourceResponse;
'file:///android_asset/www/index.html' used in: Lcn/haike/com/slt/MainActivity;->onCreate(Landroid/os/Bundle;)V
'file:///android_asset/www/index.html' used in: Lorg/apache/cordova/StandAlone;->onCreate(Landroid/os/Bundle;)V
'http://10.41.7.20:8080/slt/sltApp.apk' used in: Lcn/haike/common/entry/UpdateManager;->checkAppUpdate(Landroid/content/Context; Ljava/lang/String; Ljava/lang/String;)V
'http://10.41.7.20:8080/slt/sltApp.apk' used in: Lcn/haike/common/entry/UpdateManager;->checkAppUpdate(Landroid/content/Context; Ljava/lang/String; Ljava/lang/String;)V
'http://10.41.7.20:8080/slt/version.bin' used in: Lcn/haike/com/slt/CheckAppVersion;->checkVersion(Landroid/content/Context;)V
'http://10.41.7.20:8080/slt/version.bin' used in: Lcn/haike/com/slt/CheckAppVersion_zd;->checkVersion_zd(Landroid/content/Context;)V
'http://10.41.7.20:8080/slt/version.bin' used in: Lcn/haike/com/slt/CheckAppVersion;->checkVersion(Landroid/content/Context;)V
'http://10.41.7.20:8080/slt/version.bin' used in: Lcn/haike/com/slt/CheckAppVersion_zd;->checkVersion_zd(Landroid/content/Context;)V
'http://cdv_exec/' used in: Lorg/apache/cordova/CordovaWebViewClient;->handleExecUrl(Ljava/lang/String;)V
'https://git-wip-us.apache.org/repos/asf?p=incubator-cordova-android.git;a=blob;f=framework/res/xml/plugins.xml' used in: Lorg/apache/cordova/api/PluginManager;->pluginConfigurationMissing()V
"javascript:cordova.fireDocumentEvent('backbutton');" used in: Lorg/apache/cordova/CordovaWebView;->onKeyUp(I Landroid/view/KeyEvent;)Z
"javascript:cordova.fireDocumentEvent('menubutton');" used in: Lorg/apache/cordova/CordovaWebView;->onKeyUp(I Landroid/view/KeyEvent;)Z
"javascript:cordova.fireDocumentEvent('searchbutton');" used in: Lorg/apache/cordova/CordovaWebView;->onKeyUp(I Landroid/view/KeyEvent;)Z
"javascript:cordova.fireDocumentEvent('volumedownbutton');" used in: Lorg/apache/cordova/CordovaWebView;->onKeyDown(I Landroid/view/KeyEvent;)Z
"javascript:cordova.fireDocumentEvent('volumeupbutton');" used in: Lorg/apache/cordova/CordovaWebView;->onKeyDown(I Landroid/view/KeyEvent;)Z
'javascript:if(hasInject===1){console.log(\'observerDom this page has inject sangfor js!!!\');if(myexception){console.log(\'myexception\');}}\nvar hasInject = 1;\nvar hasRegisterMutationObserver = 0;\nvar MutationObserver = window.MutationObserver ||\n window.WebKitMutationObserver ||\n window.MozMutationObserver;\n\nvar mutationObserverSupport = !!MutationObserver;\n\nconsole.log("mutationObserverSupport=" + mutationObserverSupport);\n\nvar observer = new MutationObserver(function(mutations,handler) {\n console.log(\'onchange....0 handler=\' + handler);\n mutations.forEach(function(mutation) {\n console.log(\'onchange Mutation type: \'+ mutation.type + \', target: \' + mutation.target.nodeName);\n });\n var now = new Date();\n sangforGetHTMLHierarchy(\'\' + now.getMilliseconds());\n});\n\nfunction observerDom()\n{\nif(hasRegisterMutationObserver){console.log(\'observerDom..has observer ,no need do it !\');return;}\n console.log(\'observerDom....s observer=\' + observer);\n var target = document.documentElement;\n var config = {childList: true,subtree:true };\n observer.observe(target, config);\n console.log(\'observerDom....e\');\n hasRegisterMutationObserver = 1;}\nfunction stopObserverDom()\n{\n console.log(\'stopObserverDom....1\');\n observer.disconnect();\n console.log(\'stopObserverDom....2\');\n hasRegisterMutationObserver = 0;}\n\nfunction sangforGetHTMLHierarchy(id)\n{\n try{\n console.log(\'sangforGetHTMLHierarchy...s sangforSsoJs=\' + window.sangforSsoJs);\n if(!window.sangforSsoJs){\n console.log(\'sangforGetHTMLHierarchy...no sso js\');\n }\n window.sangforSsoJs.print(\'get HTML Hierarchy.....s\');\n var start = \'{\\"id\\":\\"\'+ id + \'\\",\\"url\\":\\"\' + document.URL + \'\\",\';\n var data = start + \'\\"document\\":\'+\'[\'+getHierarchyByElement(document.all[0], \'0\')+\']}\' ;\n window.sangforSsoJs.print(\'get HTML Hierarchy.....e\');\n\n window.sangforSsoJs.notifyHtmlHierarchyStart(id);\n\n window.sangforSsoJs.notifyHtmlHierarchy(id,data);\n\n window.sangforSsoJs.notifyHtmlHierarchyEnd(id);\n }catch(ignored){\n console.log(\'sangforGetHTMLHierarchy....failed\');\n }\n console.log(\'sangforGetHTMLHierarchy...e\');\n}\n\nfunction getHierarchyByElement(element, id) {\n if (!element || !id ) {\n return \'\';\n }\n var childNodes, childNodesCount, attributes, hierarchyString, attrString;\n childNodes = element.children;\n childNodesCount = element.childElementCount;\n hierarchyString = \'\';\n attributes = getCustomAttributesByElement(element);\n attributes[\'coded_id\'] = id;\n if(!element.coded_id){\n element.init_coded_id = id;\n }\n attributes[\'init_coded_id\'] = element.init_coded_id;\n element.coded_id = id;\n if(element.init_coded_id != element.coded_id){\n window.sangforSsoJs.print(\'position changed!!.....\' + element.init_coded_id + \'--->\' + element.coded_id);\n }\n if (element.type == \'text\' || element.type == \'password\' || element.type == \'number\' || element.type == \'search\' || element.type == \'tel\'|| element.type == \'color\'|| element.type == \'date\' || element.type == \'month\' || element.type == \'week\'|| element.type == \'time\'|| element.type == \'datetime\'|| element.type == \'datetime-local\' || element.type == \'email\' || element.type == \'range\' || element.type == \'url\') {\n var json = element.attributes2;\n if(!json || !json[\'coded_id\']){\n window.sangforSsoJs.print(\'add listener\');\n element.addEventListener(\'focusout\', function(){\n\t\t\twindow.sangforSsoJs.notifyDataChange(this.coded_id,this.init_coded_id,this.id, this.tagName,this.type,this.value);\n window.sangforSsoJs.print(\'on focusout:\' + this.coded_id + \',value=\' + this.value);\n });\n }\n }\n element.attributes2 = attributes;\n attrString = JSON.stringify(attributes);\n hierarchyString += attrString ;\n for (var i = 0; i < childNodesCount; i++) {\n elementID = id + \'-\' + i;\n hierarchyString += \',\';\n hierarchyString += getHierarchyByElement(childNodes[i], elementID);\n };\n\n return hierarchyString;\n}\n\nfunction clickWithCodeId(id)\n{\n\n for (var key in document.all)\n {\n var element = document.all[key];\n var json = element.attributes2;\n if(json[\'coded_id\'] === id)\n {\n triggerMouseEvent(\'click\',element,0,0); break;\n }\n }\n}\n\n\nfunction triggerMouseEvent(type, ele, x, y) {\n var clickEvent = document.createEvent("MouseEvents");\n clickEvent.initMouseEvent(type, true, true, document.defaultView, 1, 0, 0, x, y, false, false, false, false, 0, null);\n clickEvent.isIonicTap = true;\n ele.dispatchEvent(clickEvent);\n ele.focus && ele.focus();\n}function selectCheckbox(id,val)\n{\n for (var key in document.all)\n {\n var element = document.all[key];\n var json = element.attributes2;\n if(json[\'coded_id\'] === id)\n {\n\n element.focus();\n element.checked = val ;\n\n break;\n }\n }\n}\n\n\nfunction getValWithCodeId(id)\n{\n for (var key in document.all)\n {\n var element = document.all[key];\n var json = element.attributes2;\n if(json[\'coded_id\'] === id)\n {\n return \'gzoom-get-val:\'+element.value;\n }\n }\n}\n\n\nfunction getValWithElementId(id)\n{\n var element = document.getElementById(id);\n return \'gzoom-get-val:\'+element.value;\n}\n\n\nfunction setValuedWithCodeId(id,mvals) {\n window.sangforSsoJs.print(\'setValuedWithCodeId...s coded_id:\' + id);\n for (var key in document.all)\n {\n var element = document.all[key];\n var json = element.attributes2;\n if(json && json[\'coded_id\'] === id)\n {\n window.sangforSsoJs.print(\'setValuedWithCodeId...e!coded_id:\' + id);\n element.selected = true;\n element.value = mvals;\n break;\n }\n }\n}function getCustomAttributesByElement(element)\n{\n if (!element) {\n return;\n };\n var tagID = element.id;\n var tagName = element.tagName;\n var tagType = element.type;\n var tagChildElementCount = element.childElementCount;\n var tagPosition = getElementPosition(element);\n var text = element.innerText;\n var visibility = element.style.visibility; if(!visibility || visibility==""){\n visibility = document.defaultView.getComputedStyle(element)[\'visibility\'];\n } var tn =\'\';\n if(tagName) {tn = tagName.toLowerCase();}\n if(tn==\'script\' || tn==\'html\' ||tn==\'head\'){text = \'\';}\n var customInfo = {\'tagName\':tagName,\'tagType\':tagType, \'tagChildElementCount\':tagChildElementCount,\'visibility\':visibility,\'tagPosition\':tagPosition, \'tagID\':tagID,\'text\':text};\n for (var i = 0; i < element.attributes.length; i++) {\n var key = element.attributes[i].name;\n var value = element.attributes[i].value;\n customInfo[key]=value;\n }\n return customInfo;\n}\nfunction getElementPosition(el) {\n if (!el) {\n return \'\';\n };\n var rect = el.getBoundingClientRect();\n var left = rect.left;\n var top = rect.top;\n var width = rect.width;\n var height = rect.height;\n return \'{{\' + left + \',\' + top + \'},{\' + width + \',\' + height + \'}}\';\n};\n\nfunction clickButtonWithOutId(index) {\n var element = document.all[index];\n element.click();\n}\nfunction setCheckBoxStateWithOutID(index)\n{\n var element = document.all[index];\n if(element.checked==true)\n {\n element.checked=false;\n }else{\n element.checked=true;\n }\n}\n\nfunction typeTextInElement(element, text){\n element.value = text;\n}\nfunction clickOnInElement(element){\n element.click();\n}\nfunction finished(){\n}' used in: Lcom/sangfor/sso/web/x;->run()V
"javascript:try{ cordova.require('cordova/channel').onNativeReady.fire();}catch(e){_nativeReady = true;}" used in: Lorg/apache/cordova/CordovaWebViewClient;->onPageFinished(Landroid/webkit/WebView; Ljava/lang/String;)V
"javascript:try{cordova.fireDocumentEvent('pause');}catch(e){console.log('exception firing pause event from native');};" used in: Lorg/apache/cordova/CordovaWebView;->handlePause(Z)V
"javascript:try{cordova.fireDocumentEvent('resume');}catch(e){console.log('exception firing resume event from native');};" used in: Lorg/apache/cordova/CordovaWebView;->handleResume(Z Z)V
"javascript:try{cordova.require('cordova/channel').onDestroy.fire();}catch(e){console.log('exception firing destroy event from native');};" used in: Lorg/apache/cordova/CordovaWebView;->handleDestroy()V

中危

检测到3处setSavePassword密码明文存储漏洞。

位置: classes.dex
com.sangfor.sso.web.v;
com.phonegap.plugins.childBrowser.ChildBrowser$1;
com.sangfor.sso.web.x;

webview的保存密码功能默认设置为true。Webview会明文保存网站上的密码到本地私有文件”databases/webview.db”中。对于可以被root的系统环境或者配合其他漏洞(如webview的同源绕过漏洞),攻击者可以获取到用户密码。
建议:显示设置webView.getSetting().setSavePassword(false)。

参考案例:
www.wooyun.org/bugs/wooyun-2010-021420
www.wooyun.org/bugs/wooyun-2013-020246

参考资料:
http://wolfeye.baidu.com/blog/
www.claudxiao.net/2013/03/android-webview-cache/

中危

检测到1使用全局可读写操作文件。

位置: classes.dex
com.sangfor.support.multidex.e;->a(Landroid.content.Context;)Landroid.content.SharedPreferences;===>getSharedPreferences

在使用getDir、getSharedPreferences(SharedPreference)或openFileOutput时,如果设置了全局的可读权限,攻击者恶意读取文件内容,获取敏感信息。在设置文件属性时如果设置全局可写,攻击者可能会篡改、伪造内容,可以能会进行诈骗等行为,造成用户财产损失。建议:
(1)使用MODE_PRIVATE模式创建内部存储文件。
(2)加密存储敏感数据。
(3)避免在文件中存储明文和敏感信息。

参考案例:
http://wooyun.org/bugs/wooyun-2010-047172
http://wooyun.org/bugs/wooyun-2010-054438
http://wooyun.org/bugs/wooyun-2010-0151270

参考资料:
https://jaq.alibaba.com/blog.htm?id=56
https://jaq.alibaba.com/blog.htm?id=58
http://wolfeye.baidu.com/blog/global-rw-of-file
http://wolfeye.baidu.com/blog/global-rw-of-sharepreference/

低危

检测到2个WebView系统隐藏接口未移除。

位置: classes.dex
com.sangfor.sso.web.x;->run()V
com.phonegap.plugins.childBrowser.ChildBrowser$1;->run()V

android webview组件包含3个隐藏的系统接口:searchBoxJavaBridge_,accessibilityTraversal以及accessibility,恶意程序可以利用它们实现远程代码执行。
如果使用了WebView,那么使用WebView.removeJavascriptInterface(String name) API,显示的移除searchBoxJavaBridge_、accessibility、accessibilityTraversal这三个接口。

参考资料:
http://wolfeye.baidu.com/blog/android-webview/
http://blog.csdn.net/u013107656/article/details/51729398
http://wolfeye.baidu.com/blog/android-webview-cve-2014-7224/

低危

非debug包,需要通过打包平台proguard脚本,移除大部分系统输出代码。
经扫描该包仍存在大量系统输出代码,共发现10处系统输出代码.(此处扫描的系统输出代码,是指调用System.out.print*输出的,本应在打包平台移除的系统输出代码.)
各个bundle系统输出代码详情如下:

位置: classes.dex
cn.haike.common.entry.UpdateManager$2;
com.phonegap.plugins.childBrowser.ChildBrowser;
cn.haike.com.slt.MainActivity;
cn.haike.common.utils.ADHttpClient;
cn.haike.com.slt.CheckAppVersion;
cn.haike.common.entry.VersionControlEntity;
cn.haike.common.utils.DeviceInfo;
cn.haike.common.utils.SIMCardInfo;
com.sangfor.ssl.vpn.common.g;
cn.haike.com.slt.CheckAppVersion_zd;

低危

检测到3处主机名弱校验检测漏洞。

位置: classes.dex
com.sangfor.d.a.c;->verify(Ljava.lang.String; Ljavax.net.ssl.SSLSession;)Z
com.sangfor.ssl.vpn.utils.network.c;->verify(Ljava.lang.String; Ljavax.net.ssl.SSLSession;)Z
org.apache.cordova.FileTransfer$2;->verify(Ljava.lang.String; Ljavax.net.ssl.SSLSession;)Z

自定义HostnameVerifier类,却不实现其verify方法验证域名直接返回true,直接接受任意域名。建议:
对SSL证书进行强校验,包括签名CA是否合法、证书是否是自签名、主机域名是否匹配、证书是否过期等。

参考资料:
http://drops.wooyun.org/tips/3296
https://www.91ri.org/12534.html

警告

检测到20处addFlags使用Intent.FLAG_ACTIVITY_NEW_TASK。

位置: classes.dex
cn.haike.common.utils.OpenFiles;->getExcelFileIntent
cn.haike.common.utils.OpenFiles;->getImageFileIntent
cn.haike.common.utils.OpenFiles;->getApkFileIntent
com.sangfor.sec.b.p;->d
cn.haike.common.OpenFiles;->getWordFileIntent
com.sangfor.work.i;->b
cn.haike.common.OpenFiles;->getImageFileIntent
cn.haike.common.utils.OpenFiles;->getPdfFileIntent
cn.haike.common.utils.OpenFiles;->getCebxFileIntent
cn.haike.common.utils.OpenFiles;->getPPTFileIntent
com.sangfor.work.c;->b
cn.haike.common.utils.OpenFiles;->getChmFileIntent
cn.haike.common.utils.OpenFiles;->getTextFileIntent
cn.haike.common.utils.OpenFiles;->getWordFileIntent
cn.haike.common.OpenFiles;->getExcelFileIntent
cn.haike.common.OpenFiles;->getApkFileIntent
cn.haike.common.OpenFiles;->getChmFileIntent
cn.haike.common.OpenFiles;->getTextFileIntent
cn.haike.common.OpenFiles;->getPdfFileIntent
cn.haike.common.OpenFiles;->getPPTFileIntent

APP创建Intent传递数据到其他Activity,如果创建的Activity不是在同一个Task中打开,就很可能被其他的Activity劫持读取到Intent内容,跨Task的Activity通过Intent传递敏感信息是不安全的。建议:
尽量避免使用包含FLAG_ACTIVITY_NEW_TASK标志的Intent来传递敏感信息。

参考资料:
http://wolfeye.baidu.com/blog/intent-data-leak

警告

检测到1个导出的组件接收其他app的消息,这些组件会被其他app引用并导致dos攻击。

receiver com.sangfor.receiver.PolicyUpdateReceiver

建议:
(1)最小化组件暴露。对不会参与跨应用调用的组件建议显示添加android:exported="false"属性。
(2)设置组件访问权限。对provider设置权限,同时将权限的protectionLevel设置为"signature"或"signatureOrSystem"。
(3)组件传输数据验证。对组件之间,特别是跨应用的组件之间的数据传入与返回做验证和增加异常处理,防止恶意调试数据传入,更要防止敏感数据返回。

参考案例:
http://www.wooyun.org/bugs/wooyun-2010-0169746
http://www.wooyun.org/bugs/wooyun-2010-0104965

参考资料:
http://jaq.alibaba.com/blog.htm?spm=0.0.0.0.Wz4OeC&id=55
《Android安全技术解密与防范》

警告

检测到1潜在的XSS漏洞。

位置: classes.dex
com.sangfor.sso.web.x;->run()V

允许WebView执行JavaScript(setJavaScriptEnabled),有可能导致XSS攻击。建议尽量避免使用。
(1)API等于高高于17的Android系统。出于安全考虑,为了防止Java层的函数被随意调用,Google在4.2版本之后,规定允许被调用的函数必须以@JavascriptInterface进行注解。
(2)API等于高高于17的Android系统。建议不要使用addJavascriptInterface接口,以免带来不必要的安全隐患,如果一定要使用该接口,建议使用证书校验。
u(3)使用removeJavascriptInterface移除Android系统内部的默认内置接口:searchBoxJavaBridge_、accessibility、accessibilityTraversal。

参考案例:
www.wooyun.org/bugs/wooyun-2015-0140708
www.wooyun.org/bugs/wooyun-2016-0188252

参考资料:
http://jaq.alibaba.com/blog.htm?id=48
http://blog.nsfocus.net/android-webview-remote-code-execution-vulnerability-analysis

警告

检测到1处IvParameterSpec的使用。

位置: classes.dex
com.sangfor.ssl.vpn.common.Crypto;->a(Ljavax.crypto.SecretKey;)V

使用IVParameterSpec函数,如果使用了固定的初始化向量,那么密码文本可预测性高得多,容易受到字典攻击等。建议禁止使用常量初始化矢量构造IVParameterSpec,使用聚安全提供的安全组件。

参考资料:
http://drops.wooyun.org/tips/15870
https://developer.android.com/training/articles/keystore.html
http://wolfeye.baidu.com/blog/weak-encryption/
http://www.freebuf.com/articles/terminal/99868.html

警告

检测到1处使用了加解密算法。密钥处理不当可能会导致信息泄露。

位置: classes.dex
com.sangfor.ssl.vpn.common.Crypto;->(Ljava.lang.String;)V

参考案例:
http://www.wooyun.org/bugs/wooyun-2010-0105766
http://www.wooyun.org/bugs/wooyun-2015-0162907
http://www.wooyun.org/bugs/wooyun-2010-0187287

参考资料:
http://drops.wooyun.org/tips/15870
https://developer.android.com/training/articles/keystore.html


动态扫描发现风险点

风险等级 风险名称

服务端分析

风险等级 风险名称

警告

检测到?处XSS漏洞。
开发中...

警告

检测到?处XSS跨站漏洞。
开发中...

应用证书