Android安全问题--漏洞及解决方案

前几天给笔记本加了个固态硬盘,悲剧的格式化了一个硬盘(误认为是SSD),然后我的很多资料都丢了(包括之前收集的所有的安全问题及解决方案和一些通用的解决方案),不过都不重要,都在脑袋里~~~本文列出的是360网站搜罗的内容

  1. 部分漏洞描述一样,但是漏洞名不一样(并不是写错了,这个可以看作是一个问题的两面性)
  2. 在参考链接中有很多都是Android的官方文档中的,但是在国内一般是访问不到的,给大家介绍一下本地文档地址:把链接中的https://developer.android.com/换为:file:///C:/Android/android-sdk-windows/docs/(一般本地是不带docs的,如何下载,看下一条)
  3. 打开SDK Manager,选中Documentation for Android SDK下载,点击ok,弹出下载界面,如果你的网不错,那等着就ok了,否则的话,在下载界面中复制下载链接到迅雷下载即可。

1. 程序可被任意调试

2. 程序数据任意备份

3. Activity组件暴露

  • 风险描述

    Activity组件的属性exported被设置为true或是未设置exported值但IntentFilter不为空时,activity被认为是导出的,可通过设置相应的Intent唤起activity。

  • 危害描述

    黑客可能构造恶意数据针对导出activity组件实施越权攻击。

  • 修复建议

    如果组件不需要与其他app共享数据或交互,请将AndroidManifest.xml 配置文件中设置该组件为exported = “False”。如果组件需要与其他app共享数据或交互, 请对组件进行权限控制和参数校验。

  • 参考链接

    https://developer.android.com/guide/components/activities.html

4. Service组件暴露

  • 风险描述

    Service组件的属性exported被设置为true或是未设置exported值但IntentFilter不为空时,Service被认为是导出的,可通过设置相应的Intent唤起Service。

  • 危害描述

    黑客可能构造恶意数据针对导出Service组件实施越权攻击。

  • 修复建议

    如果组件不需要与其他app共享数据或交互,请将AndroidManifest.xml 配置文件中设置该组件为exported = “False”。如果组件需要与其他app共享数据或交互, 请对组件进行权限控制和参数校验。

  • 参考链接

    https://developer.android.com/guide/components/services.html

5. ContentProvider组件暴露

  • 风险描述

    Content Provider组件的属性exported被设置为true或是Android API<=16时,Content Provider被认为是导出的。

  • 危害描述

    黑客可能访问到应用本身不想共享的数据或文件。

  • 修复建议

    如果组件不需要与其他app共享数据或交互,请将AndroidManifest.xml 配置文件中设置该组件为exported = “False”。如果组件需要与其他app共享数据或交互, 请对组件进行权限控制和参数校验。

  • 参考链接

    https://developer.android.com/guide/topics/providers/content-providers.html

6. BroadcastReceiver组件暴露

  • 风险描述

    BroadcastReceiver组件的属性exported被设置为true或是未设置exported值但IntentFilter不为空时,BroadcastReceiver被认为是导出的。

  • 危害描述

    导出的广播可以导致数据泄漏或者是越权。

  • 修复建议

    如果组件不需要与其他app共享数据或交互,请将AndroidManifest.xml 配置文件中设置该组件为exported = “False”。如果组件需要与其他app共享数据或交互, 请对组件进行权限控制和参数校验。

  • 参考链接

    https://developer.android.com/guide/topics/manifest/receiver-element.html

7. Webview存在本地Java接口

  • 风险描述

    android的webView组件有一个非常特殊的接口函数addJavascriptInterface,能实现本地java与js之间交互。

  • 危害描述

    在targetSdkVersion小于17时,攻击者利用 addJavascriptInterface这个接口添加的函数,可以远程执行任意代码。

  • 修复建议

    建议开发者不要使用addJavascriptInterface,使用注入javascript和第三方协议的替代方案。

  • 参考链接

    https://developer.android.com/reference/android/webkit/WebView.html

8. SSL通信服务端检测信任任意证书

  • 风险描述

    自定义SSL x509 TrustManager,重写checkServerTrusted方法,方法内不做任何服务端的证书校验。

  • 危害描述

    黑客可以使用中间人攻击获取加密内容。

  • 修复建议

    严格判断服务端和客户端证书校验,对于异常事件禁止return 空或者null。

  • 参考链接

    https://developer.android.com/reference/javax/net/ssl/X509TrustManager.html

9. 隐式意图调用

  • 风险描述

    封装Intent时采用隐式设置,只设定action,未限定具体的接收对象,导致Intent可被其他应用获取并读取其中数据。

  • 危害描述

    Intent隐式调用发送的意图可能被第三方劫持,可能导致内部隐私数据泄露。

  • 修复建议

    将隐式调用改为显式调用。

  • 参考链接

    https://developer.android.com/guide/components/intents-filters.html

10. WebView忽略SSL证书错误

  • 风险描述

    WebView调用onReceivedSslError方法时,直接执行handler.proceed()来忽略该证书错误。

  • 危害描述

    忽略SSL证书错误可能引起中间人攻击。

  • 修复建议

    不要重写onReceivedSslError方法, 或者对于SSL证书错误问题按照业务场景判断,避免造成数据明文传输情况。

  • 参考链接

    https://developer.android.com/reference/android/webkit/WebViewClient.html

11.HTTPS关闭主机名验证

  • 风险描述

    构造HttpClient时,设置HostnameVerifier时参数使用ALLOW_ALL_HOSTNAME_VERIFIER或空的HostnameVerifier。

  • 危害描述

    关闭主机名校验可以导致黑客使用中间人攻击获取加密内容。

  • 修复建议

    APP在使用SSL时没有对证书的主机名进行校验,信任任意主机名下的合法的证书,导致加密通信可被还原成明文通信,加密传输遭到破坏。

  • 参考链接

    https://developer.android.com/reference/javax/net/ssl/HostnameVerifier.html

12. Intent Scheme URLs攻击

  • 风险描述

    在AndroidManifast.xml设置Scheme协议之后,可以通过浏览器打开对应的Activity。

  • 危害描述

    攻击者通过访问浏览器构造Intent语法唤起app相应组件,轻则引起拒绝服务,重则可能演变为提权漏洞。

  • 修复建议

    配置category filter, 添加android.intent.category.BROWSABLE方式规避风险

  • 参考链接

    https://developer.android.com/guide/components/intents-filters.html

13. 全局文件可读

14. 全局文件可写

15. 全局文件可读可写

16. SSL通信客户端检测信任任意证书

  • 风险描述

    自定义SSL x509 TrustManager,重写checkClientTrusted方法,方法内不做任何服务端的证书校验。

  • 危害描述

    黑客可以使用中间人攻击获取加密内容。

  • 修复建议

    严格判断服务端和客户端证书校验,对于异常事件禁止return 空或者null。

  • 参考链接

    https://developer.android.com/reference/javax/net/ssl/X509TrustManager.html

17.配置文件可读

18. 配置文件可写

19. 配置文件可读可写

20. DEX文件动态加载

  • 风险描述

    使用DexClassLoader加载外部的 apk、jar 或 dex文件,当外部文件的来源无法控制时或是被篡改,此时无法保证加载的文件是否安全。

  • 危害描述

    加载恶意的dex文件将会导致任意命令的执行。

  • 修复建议

    加载外部文件前,必须使用校验签名或MD5等方式确认外部文件的安全性。

  • 参考链接

    https://developer.android.com/reference/dalvik/system/DexClassLoader.html

21. AES弱加密

  • 风险描述

    在AES加密时,使用“AES/ECB/NoPadding”或“AES/ECB/PKCS5padding”的模式。

  • 危害描述

    ECB是将文件分块后对文件块做同一加密,**加密只需要针对一个文件块进行解密,降低了**难度和文件安全性。

  • 修复建议

    禁止使用AES加密的ECB模式,显式指定加密算法为:CBC或CFB模式,可带上PKCS5Padding填充。AES**长度最少是128位,推荐使用256位。

  • 参考链接

    https://developer.android.com/reference/javax/crypto/Cipher.html

22. Provider文件目录遍历

  • 风险描述

    当Provider被导出且覆写了openFile方法时,没有对Content Query Uri进行有效判断或过滤。

  • 危害描述

    攻击者可以利用openFile()接口进行文件目录遍历以达到访问任意可读文件的目的。

  • 修复建议

    一般情况下无需覆写openFile方法,如果必要,对提交的参数进行“../”目录跳转符或其他安全校验。

  • 参考链接

    https://developer.android.com/reference/android/content/ContentProvider.html#openFile(android.net.Uri, java.lang.String)

23. activity绑定browserable与自定义协议

  • 风险描述

    activity设置“android.intent.category.BROWSABLE”属性并同时设置了自定义的协议android:scheme意味着可以通过浏览器使用自定义协议打开此activity。

  • 危害描述

    可能通过浏览器对app进行越权调用。

  • 修复建议

    app对外部调用过程和传输数据进行安全检查或检验。

  • 参考链接

    https://developer.android.com/reference/android/content/Intent.html#CATEGORY_BROWSABLE

24. 动态注册广播

25. 开放socket端口

26. Fragment注入

27. webview明文存储密码

28. unzip解压缩

  • 风险描述

    解压 zip文件,使用getName()获取压缩文件名后未对名称进行校验。

  • 危害描述

    攻击者可构造恶意zip文件,被解压的文件将会进行目录跳转被解压到其他目录,覆盖相应文件导致任意代码执行。

  • 修复建议

    解压文件时,判断文件名是否有../特殊字符。

  • 参考链接

    https://developer.android.com/reference/java/util/zip/ZipEntry.html#getName()

29. 未使用编译器堆栈保护技术

  • 风险描述

    为了检测栈中的溢出,引入了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

30.未使用地址空间随机化技术

  • 风险描述

    PIE全称Position Independent Executables,是一种地址空间随机化技术。当so被加载时,在内存里的地址是随机分配的。

  • 危害描述

    不使用PIE,将会使得shellcode的执行难度降低,攻击成功率增加。

  • 修复建议

    NDK编译so时,加入LOCAL_CFLAGS := -fpie -pie开启对PIE的支持。

  • 参考链接

    https://en.wikipedia.org/wiki/Position-independent_code#Position-independent_executables

31. 动态链接库中包含执行命令函数

  • 风险描述

    在native程序中,有时需要执行系统命令,在接收外部传入的参数执行命令时没有做过滤或检验。

  • 危害描述

    攻击者传入任意命令,导致恶意命令的执行。

  • 修复建议

    对传入的参数进行严格的过滤。

  • 参考链接

    http://baike.baidu.com/subview/627587/14965930.htm#2

32. 随机数不安全使用

33. FFmpeg文件读取

  • 风险描述

    使用了低版本的FFmpeg库进行视频解码。

  • 危害描述

    在FFmpeg的某些版本中可能存在本地文件读取漏洞,可以通过构造恶意文件获取本地文件内容。

  • 修复建议

    升级FFmpeg库到最新版。

  • 参考链接

    http://ffmpeg.org/

34. libupnp栈溢出漏洞

35. Webview组件远程代码执行(调用getClassLoader)

36. AES/DES硬编码**

附录

下载docs文档:打开SDK Manager,选中Documentation for Android SDK下载,如果你的网不错,那等着就ok了,否则的话,接着刚才的那个界面中复制下载链接到迅雷下载即可。

打开SDK Manager,选中Documentation for Android SDK下载:

Android安全问题--漏洞及解决方案

到安装界面复制下载链接:

Android安全问题--漏洞及解决方案

打开浏览器的脱机浏览:(火狐)

把链接https://developer.android.com/guide/topics/manifest/application-element.html#debug中的 https://developer.android.com/换为:file:///C:/Android/android-sdk-windows/docs/
Android安全问题--漏洞及解决方案