1. 组件安全检测
漏洞名称 | Activity 组件暴露检测 |
---|---|
威胁等级 | 中危 |
风险描述 | Activity 组件的属性 exported 被设置为 true 或是未设置 exported 值 但 IntentFilter 不为空时,activity 被认为是导出的,可通过设置相 应的 Intent 唤起 activity。黑客可能构造恶意数据针对导出 activity 组件实施越权攻击。 |
参考链接
https://developer.android.com/guide/components/activities.html
漏洞名称 | Service 组件暴露检测 |
---|---|
威胁等级 | 中危 |
检测方法 | Service 组件的属性 exported 被设置为 true 或是未设置 exported 值 但 IntentFilter 不为空时,Service 被认为是导出的,可通过设置相 应的 Intent 唤起 Service。黑客可能构造恶意数据针对导出 Service 组件实施越权攻击。 |
参考链接
https://developer.android.com/guide/components/services.html
漏洞名称 | BroadcastReceiver 组件暴露检测 |
---|---|
威胁等级 | 中危 |
检测方法 | BroadcastReceiver 组件的属性 exported 被设置为 true 或是未设置 exported 值但 IntentFilter 不为空时,BroadcastReceiver 被认为是导 出的。导出的广播可以导致数据泄漏或者是越权。 |
参考链接
https://developer.android.com/guide/topics/manifest/receiver-ele- ment.html
2. APP 漏洞检测
漏洞名称 | SSL 通信服务端检测信任 任意证书漏洞检测 |
---|---|
威胁等级 | 高危 |
漏洞危害 | 自定义 SSL x509 TrustManager,重写 checkServerTrusted 方法,方法内不 做任何服务端的证书校验。黑客可以使用中间人攻击获取加密内容。 |
参考链接
https://developer.android.com/reference/javax/net/ssl/X509TrustManag- er.html
漏洞名称 | HTTPS 关闭主机名验证漏 洞检测 |
---|---|
威胁等级 | 中危 |
检测方法 | 构造 HttpClient 时,设置 HostnameVerifier 时参数使用 ALLOW_ALL_HOSTNAME_VERIFIER 或空的 HostnameVerifier。关闭主机 名校验可以导致黑客使用中间人攻击获取加密内容。 |
[参考链接](https://developer.android.com/reference/javax/net/ssl/HostnameVerifi- er.html)
漏洞名称 | 隐式意图调用漏洞检测 |
---|---|
威胁等级 | 中危 |
检测方法 | 封装 Intent 时采用隐式设置,只设定 action,未限定具体的接收对象,导 致 Intent 可被其他应用获取并读取其中数据。Intent 隐式调用发送的意图 可能被第三方劫持,可能导致内部隐私数据泄露。 |
参考链接
[https://developer.android.com/guide/components/intents-filters.html]
漏洞名称 | 程序数据任意备份漏洞检测 |
---|---|
威胁等级 | 高危 |
检测方法 | 安卓 AndroidManifest.xml 文件中 android: allowBackup 为 true。app 数据可 以被备份导出。 |
参考链接
https://developer.android.com/guide/topics/manifest/application-elemen- t.html#allowbackup
漏洞名称 | 程序可被任意调试漏洞检测 |
---|---|
威胁等级 | 中危 |
检测方法 | 安卓 AndroidManifest.xml 文件中 android:debuggable 为 true。app 可以被 任意调试,攻击者可以发起动态调试攻击。 |
参考链接
https://developer.android.com/guide/topics/manifest/application-elemen- t.html#debug
漏洞名称 | Webview 存在本地 Java 接口 漏洞检测 |
---|---|
威胁等级 | 中危 |
检测方法 | android 的 webView 组件有一个非常特殊的接口函数 addJavascriptInter- face,能实现本地 java 与 js 之间交互。在 targetSdkVersion 小于 17 时, 攻击者利用 addJavascriptInterface 这个接口添加的函数,可以远程执行 任意代码。 |
参考链接
https://developer.android.com/reference/android/webkit/WebView.html
漏洞名称 | WebView 忽略 SSL 证 书错误漏洞检测 |
---|---|
威胁等级 | 高危 |
漏洞危害 | WebView 调用 onReceivedSslError 方法时,直接执行 handler.pro- ceed()来忽略该证书错误。忽略 SSL 证书错误可能引起中间人攻 击。 |
参考链接
https://developer.android.com/reference/android/webkit/WebView- Client.html
漏洞名称 | Intent Scheme URLs 攻击 漏洞检测 |
---|---|
威胁等级 | 低 |
检测方法 | 在 AndroidManifast.xml 设置 Scheme 协议之后,可以通过浏览器打开 对应的 Activity。攻击者通过访问浏览器构造 Intent 语法唤起 app 相应 组件,轻则引起拒绝服务,重则可能演变为提权漏洞。 |
参考链接
https://developer.android.com/guide/components/intents-filters.html
漏洞名称 | 全局文件可读写漏洞检 测 |
---|---|
威胁等级 | 中危 |
检测方法 | APP 在创建内部存储文件时,将文件设置了全局的可读权限。攻击者 恶意读取文件内容,获取敏感信息。 |
参考链接
https://developer.android.com/ reference/android/content/Context.html#MODE_WORLD_READABLE
漏洞名称 | 全局文件可读写漏洞检 测 |
---|---|
威胁等级 | 高危 |
检测方法 | APP 在创建内部存储文件时,将文件设置了全局的可写权限。攻击者 恶意写文件内容,破坏 APP 的完整性。 |
参考链接
https://developer.android.com/ reference/android/content/Context.html#MODE_WORLD_WRITEABLE
漏洞名称 | 配置文件可读可写漏洞检测 |
---|---|
威胁等级 | 中危 |
检测方法 | 使用 getSharedPreferences 打开文件时,如果将第二个参数设置为 MODE_WORLD_READABLE。当前文件可以被其他应用读取导致信息泄 漏。 |
参考链接
https://developer.android.com/reference/android/content/Context.html#g etSharedPreferences(java.lang.String, int) https://developer.android.com/reference/android/content/Context.html# MODE_WORLD_READABLE
漏洞名称 | 配置文件可读可写漏洞检测 |
---|---|
威胁等级 | 高危 |
检测方法 | 使用 getSharedPreferences 打开文件时,如果将第二个参数设置为 MODE_WORLD_WRITEABLE。当前文件可以被其他应用写入,导致文件 内容被篡改,影响应用程序的正常运行或更严重的问题。 |
参考链接
https://developer.android.com/reference/android/content/Context.html#g etSharedPreferences(java.lang.String, int) https://developer.android.com/reference/android/content/Context.html# MODE_WORLD_WRITEABLE
漏洞名称 | DEX 文件动态加载漏 洞检测 |
---|---|
威胁等级 | 中危 |
检测方法 | 使用 DexClassLoader 加载外部的 apk、jar 或 dex 文件,当外部文 件的来源无法控制时或是被篡改,此时无法保证加载的文件是否 安全。加载恶意的 dex 文件将会导致任意命令的执行。 |
参考链接
https://developer.android.com/reference/dalvik/system/DexClass- Loader.html
漏洞名称 | AES 弱加密漏洞检测 |
---|---|
威胁等级 | 中危 |
检测方法 | 在 AES 加密时,使用“AES/ECB/NoPadding”或“AES/ECB/PKCS5padding”的 模式。ECB 是将文件分块后对文件块做同一加密,破解加密只需要针 对一个文件块进行解密,降低了破解难度和文件安全性。 |
参考链接
https://developer.android.com/reference/javax/crypto/Cipher.html
漏洞名称 | Provider 文件目 录遍历漏洞检测 |
---|---|
威胁等级 | 中危 |
漏洞危害 | 当 Provider 被导出且覆写了 openFile 方法时,没有对 Content Query Uri 进行有效判断或过滤。攻击者可以利用 openFile()接口进行文件目录遍 历以达到访问任意可读文件的目的。 |
参考链接
https://developer.android.com/reference/android/content/Content- Provider.html#openFile(android.net.Uri, java.lang.String)
漏洞名称 | activity 绑定 browserable 与 自定义协议漏洞 检测 |
---|---|
威胁等级 | 低危 |
检测方法 | activity 设置“android.intent.category.BROWSABLE”属性并同时设置了自 定义的协议 android:scheme 意味着可以通过浏览器使用自定义协议打 开此 activity。可能通过浏览器对 app 进行越权调用。 |
参考链接
https://developer.android.com/reference/android/content/Intent.html#CA TEGORY_BROWSABLE
漏洞名称 | 动态注册广播漏 洞检测 |
---|---|
威胁等级 | 中危 |
检测方法 | 使用 registerReceiver 动态注册的广播在组件的生命周期里是默认导出 的。导出的广播可以导致拒绝服务、数据泄漏或是越权调用。 |
参考链接
https://developer.android.com/reference/android/content/Context.html#r egisterReceiver(android.content.BroadcastReceiver, android.content.In- tentFilter, java.lang.String, android.os.Handler)
漏洞名称 | 开放 socket 端口 漏洞检测 |
---|---|
威胁等级 | 低危 |
检测方法 | app 绑定端口进行监听,建立连接后可接收外部发送的数据。攻击者 可构造恶意数据对端口进行测试,对于绑定了 IP 0.0.0.0 的 app 可发起 远程攻击。 |
参考链接
https://developer.android.com/reference/java/net/Socket.html#Socket(ja- va.net.InetAddress, int)
漏洞名称 | Fragment 注入漏 洞检测 |
---|---|
威胁等级 | 低危 |
检测方法 | 通过导出的 PreferenceActivity 的子类,没有正确处理 Intent 的 extra 值。攻击者可绕过限制访问未授权的界面。 |
参考链接
https://developer.android.com/reference/android/preference/Preference- Activity.html#isValidFragment(java.lang.String)
漏洞名称 | Webview 启用访 问文件数据漏洞 检测 |
---|---|
威胁等级 | 高危 |
漏洞危害 | Webview 中使用 setAllowFileAccess(true),App 可通过 webview 访问私 有目录下的文件数据。在 Android 中,mWebView.setAllowFileAccess(true)为默认设置。当 setAllowFileAccess(true)时,在 File 域下,可执行任意的 JavaScript 代 码,如果绕过同源策略能够对私有目录文件进行访问,导致用户隐私 泄漏。 |
参考链接
https://developer.android.com/reference/android/webkit/WebSettings.ht ml#setAllowFileAccess(boolean)
漏洞名称 | unzip 解压缩(Zip- perDown)漏洞检 测 |
---|---|
威胁等级 | 高危 |
检测方法 | 解压 zip 文件,使用 getName()获取压缩文件名后未对名称进行校验。 攻击者可构造恶意 zip 文件,被解压的文件将会进行目录跳转被解压 到其他目录,覆盖相应文件导致任意代码执行。 |
参考链接
https://developer.android.com/reference/java/util/zip/ZipEntry.html#get- Name()
漏洞名称 | 未使用编译器堆栈保护技术漏洞检测 |
---|---|
威胁等级 | 低危 |
检测方法 | 为了检测栈中的溢出,引入了 Stack Canaries 漏洞缓解技术。在所有函 数调用发生时,向栈帧内压入一个额外的被称作 canary 的随机数,当 栈中发生溢出时,canary 将被首先覆盖,之后才是 EBP 和返回地址。 在函数返回之前,系统将执行一个额外的安全验证操作,将栈帧中原 先存放的 canary 和.data 中副本的值进行比较,如果两者不吻合,说明发生了栈溢出。不使用 Stack Canaries 栈保护技术,发生栈溢出时系统 并不会对程序进行保护。 |
修复意见 | 使用 NDK 编译 so 时,在 Android.mk 文件中添加:LOCAL_CFLAGS := -Wall -O2 -U_FORTIFY_SOURCE -fstack-protector-all |
参考链接
https://en.wikipedia.org/wiki/Stack_buffer_overflow#Stack_canaries
漏洞名称 | 未使用地址空间随机技术漏洞检测 |
---|---|
威胁等级 | 低危 |
检测方法 | PIE 全称 Position Independent Executables,是一种地址空间随机化技 术。当 so 被加载时,在内存里的地址是随机分配的。不使用 PIE,将 会使得 shellcode 的执行难度降低,攻击成功率增加。 |
参考链接
https://en.wikipedia.org/wiki/Position-independent_code#Position-inde- pendent_executables
漏洞名称 | 动态链接库中包含执行命令函数漏洞检测 |
---|---|
威胁等级 | 低危 |
检测方法 | |
在 native 程序中,有时需要执行系统命令,在接收外部传入的参数执 行命令时没有做过滤或检验。攻击者传入任意命令,导致恶意命令的 执行。 |
参考链接
http://baike.baidu.com/subview/627587/14965930.htm#2
漏洞名称 | 随机数不安全使用漏洞 |
---|---|
威胁等级 | 低低危 |
漏洞危害 | 调用 SecureRandom 类中的 setSeed 方法。生成的随机数具有确定性, 存在被破解的可能性。 |
参考链接
https://developer.android.com/reference/java/security/SecureRan- dom.html#setSeed(long)
漏洞名称 | FFmpeg 文件读取漏 洞检测 |
---|---|
威胁等级 | 低危 |
检测方法 | 使用了低版本的 FFmpeg 库进行视频解码。在 FFmpeg 的某些版本 中可能存在本地文件读取漏洞,可以通过构造恶意文件获取本地 文件内容。 |
参考链接
http://ffmpeg.org/
漏洞名称 | libupnp 栈溢出漏洞 漏洞检测 |
---|---|
威胁等级 | 低危 |
检测方法 | 使用了低于 1.6.18 版本的的 libupnp 库文件。构造恶意数据包可造 成缓冲区溢出,造成代码执行。 |
参考链接
https://sourceforge.net/projects/pupnp/files/pupnp/libUPnP %201.6.18/
漏洞名称 | Webview 组件远程代 码执行(调用 get- ClassLoader)漏洞检 |
---|---|
威胁等级 | 中危 |
漏洞危害 | 使用低于 17 的 targetSDKVersion,并且在 Context 子类中使用 add- JavascriptInterface 绑定 this 对象。通过调用 getClassLoader 可以绕 过 google 底层对 getClass 方法的限制。 |
参考链接
https://developer.android.com/reference/android/content/Contex- t.html#getClassLoader()
漏洞名称 | AES/DES 硬编码密钥 漏洞检测 |
---|---|
威胁等级 | 高危 |
检测方法 | 使用 AES 或 DES 加解密时,采用硬编码在程序中的密钥。通过反 编译拿到密钥可以轻易解密 APP 通信数据。 |
参考链接
https://developer.android.com/reference/javax/crypto/spec/Se- cretKeySpec.html#SecretKeySpec(byte[], java.lang.String)
漏洞名称 | Android 应用克隆 漏洞检测 |
---|---|
威胁等级 | 高危 |
检测方法 | 该漏洞影响使用 WebView 控件,开启 file 域访问并且未按安全策略开 发的 Android 应用 APP。检测方法为:1.检测 WebView 中是否setAllowFileAccessFromFileURLs****setAllowUniversalAccessFromFileURLs配置为 true;2.检测 WebView 是否可以直接被外部调用,并能够加载外部可控的 HTML 文件 |
参考链接
http://www.cnvd.org.cn/webinfo/show/4365
移动安全架构设计基本原则
在应用系统软件开发设计的过程中,对应用系统的总体设计应当满足如下
安全原则:
原则 | 说明 |
---|---|
最小权限原则Least Privilege | 应用软件的每个模块如进程、用户只能访问当所必需的信息或者资源。赋予每一个合法动作最小的权限,以保护数据以及功能避免受到错误或者恶意行为的破坏。 |
权限分离原则Separation of Duties | 对业务的操作、管理和审计权限应该由软件中的不同角色的用户分别承担;普通用户和管理员用户信息应该存放在不同的数据表中。 |
深度防御原则Defense in Depth | 在应用程序对业务数据进行处理的每个阶段都要考虑安全性问题,不能仅在某个阶段做安全防御,这样单点防御一旦被突破将造成安全风险。 |
容错保护原则Fail Secure | 当程序出现故障时或系统异常当系统失败时,可以进入到一个失败保护的状态。如果用户请求失败,系统仍可保障安全。 |
单点异常终止原则Single Point of Failure | 当用户提交数据超出预期时,应立即终止程序的执行,不要试图加以修正并继续执行下去。 |
外来代码安全原则Least Third Party Compo-nents | 严格控制第三方函数与插件的使用,对外来代码必须进行详细的安全测试。 |
代码重用原则Leveraging Existing Com- ponents | 尽可能的重用软件已有的模块,这样可以降低引入新的漏洞和攻击界面的可能性。 |
数据保护原则Data Protection | 对用户数据的保护功能应涵盖用户数据存储的完整性、用户数据传输保密性、数据传输的访问控制、剩余信息的保护、数据反转操作等内容;应对系统中关键数据(如用户密码等)的存储和网络传输时应采用加密保护,实用加密加密算法应该符合国际标准、国家标准和业界标准。 |
可审计原则Auditing | 在应用系统中设计审计日志记录的功能,并对应用系统产生的日志增加完备的审计功能 |
开放设计原则Open Design | 开放设计与“不开放即安全”的原则相对而 言,认为设计本身不应具有神秘感。这一原则的 具体表现可以参见应用于加密设计的 Kerchoff 定 律,“系统不应单纯依赖私密性,若落入敌人手 中则毫无优势可言”;开放设计以提高系统兼容 性和可扩展性。 |
抗抵赖原则Anti Repudiation | 对于涉及支付交易等重要的业务场景,系统设计应有效地防止通信双方抵赖,如采用电子证书签名等方式。 |
规范性Standardization | 系统设计所采用的安全技术和安全产品应符合国际标准、国家标准和业界标准,为系统的扩展升级、与其他系统的互联提供良好的基础。 |
可扩展性Scalability | 以当前业务安全需求为基础,充分考虑发展的需要,安全功能模块子系统以插件或接口方式以方便未来的扩展。 |
实用性Practicable | 安全功能设计需要尽可能的考虑投入产出比,同时尽量控制对用户体验的影响。 |
符合性Regulatory Compliance | 安全功能的设计尽可能的要符合国家规范、行业规范以及业界的通用标准,如等级保护等规范。 |