Android安全问题

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

关键字: 漏洞 解决方案 Android 安全 问题

1. 程序可被任意调试

风险描述

安卓AndroidManifest.xml文件中android:debuggable为true。

危害描述

app可以被任意调试。

修复建议

AndroidManifest.xml 配置文件中中设置为android:Debugable=”false”。

参考链接

https://developer.android.com/guide/topics/manifest/application-element.html#debug

2. 程序数据任意备份

风险描述

安卓AndroidManifest.xml文件中android: allowBackup为true。

危害描述

app数据可以被备份导出。

修复建议

AndroidManifest.xml 配置文件中中设置为android:allowBackup=”false”。

参考链接

https://developer.android.com/guide/topics/manifest/application-element.html#allowbackup

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. 全局文件可读

风险描述

APP在创建内部存储文件时,将文件设置了全局的可读权限。

危害描述

攻击者恶意读取文件内容,获取敏感信息。

修复建议

请开发者确认该文件是否存储敏感数据,如存在相关数据,请去掉文件全局可读属性。

参考链接

https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE

14. 全局文件可写

风险描述

APP在创建内部存储文件时,将文件设置了全局的可写权限。

危害描述

攻击者恶意写文件内容,破坏APP的完整性。

修复建议

请开发者确认该文件是否存储敏感数据,如存在相关数据,请去掉文件全局可写属性。

参考链接

https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_WRITEABLE

15. 全局文件可读可写

风险描述

APP在创建内部存储文件时,将文件设置了全局的可读写权限。

危害描述

攻击者恶意写文件内容或者,破坏APP的完整性,或者是攻击者恶意读取文件内容,获取敏感信息。。

修复建议

请开发者确认该文件是否存储敏感数据,如存在相关数据,请去掉文件全局可写、写属性。

参考链接

https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_WRITEABLE https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE

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

风险描述

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

危害描述

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

修复建议

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

参考链接

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

17.配置文件可读

风险描述

使用getSharedPreferences打开文件,第二个参数设置为MODE_WORLD_READABLE。

危害描述

当前文件可以被其他应用读取,导致信息泄漏。

修复建议

使用getSharedPreferences时第二个参数设置为MODE_PRIVATE;如果必须设置为全局可读模式供其他程序使用,请保证存储的数据非隐私数据或是加密后存储。

参考链接

https://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String, int) https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE

18. 配置文件可写

风险描述

使用getSharedPreferences打开文件,第二个参数设置为MODE_WORLD_WRITEABLE。

危害描述

当前文件可以被其他应用写入,导致文件内容被篡改,可能导致影响应用程序的正常运行或更严重的问题。

修复建议

使用getSharedPreferences时第二个参数必须设置为MODE_PRIVATE。

参考链接

https://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String, int) https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_WRITEABLE

19. 配置文件可读可写

风险描述

使用getSharedPreferences打开文件时,如果将第二个参数设置为MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE。

危害描述

当前文件可以被其他应用读取和写入,导致信息泄漏、文件内容被篡改,影响应用程序的正常运行或更严重的问题。

修复建议

使用getSharedPreferences时第二个参数设置为MODE_PRIVATE。禁止使用MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE模式。

参考链接

https://developer.android.com/reference/android/content/Context.html#getSharedPreferences(java.lang.String, int) https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_WRITEABLE https://developer.android.com/reference/android/content/Context.html#MODE_WORLD_READABLE

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. 动态注册广播

风险描述

使用registerReceiver动态注册的广播在组件的生命周期里是默认导出的。

危害描述

导出的广播可以导致拒绝服务、数据泄漏或是越权调用。

修复建议

使用带权限检验的registerReceiver API进行动态广播的注册。

参考链接

https://developer.android.com/reference/android/content/Context.html#registerReceiver(android.content.BroadcastReceiver, android.content.IntentFilter, java.lang.String, android.os.Handler)

25. 开放socket端口

风险描述

app绑定端口进行监听,建立连接后可接收外部发送的数据。

危害描述

攻击者可构造恶意数据对端口进行测试,对于绑定了IP 0.0.0.0的app可发起远程攻击。

修复建议

如无必要,只绑定本地ip127.0.0.1,并且对接收的数据进行过滤、验证。

参考链接

https://developer.android.com/reference/java/net/Socket.html#Socket(java.net.InetAddress, int)

26. Fragment注入

风险描述

通过导出的PreferenceActivity的子类,没有正确处理Intent的extra值。

危害描述

攻击者可绕过限制访问未授权的界面。

修复建议

当targetSdk大于等于19时,强制实现了isValidFragment方法;小于19时,在PreferenceActivity的子类中都要加入isValidFragment ,两种情况下在isValidFragment 方法中进行fragment名的合法性校验。

参考链接

https://developer.android.com/reference/android/preference/PreferenceActivity.html#isValidFragment(java.lang.String)

27. webview明文存储密码

风险描述

Webview中使用setSavePassword(true),保存在WebView中输入的用户名和密码到应用数据目录的databases/webview.db中。

危害描述

当手机是root或是通过其他漏洞获取webview.db的内容时,将会造成用户敏感数据的泄漏。

修复建议

使用WebView.getSettings().setSavePassword(false)来禁止保存密码。

参考链接

https://developer.android.com/reference/android/webkit/WebSettings.html#setSavePassword(boolean)

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. 随机数不安全使用

风险描述

调用SecureRandom类中的setSeed方法。

危害描述

生成的随机数具有确定性,存在被破解的可能性。

修复建议

使用/dev/urandom或者/dev/random来初始化伪随机数生成器。

参考链接

https://developer.android.com/reference/java/security/SecureRandom.html#setSeed(long)

33. FFmpeg文件读取

风险描述

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

危害描述

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

修复建议

升级FFmpeg库到最新版。

参考链接

http://ffmpeg.org/

34. libupnp栈溢出漏洞

风险描述

使用了低于1.6.18版本的的libupnp库文件。

危害描述

构造恶意数据包可造成缓冲区溢出,造成代码执行。

修复建议

升级libupnp库到1.6.18版本或以上。

参考链接

https://sourceforge.net/projects/pupnp/files/pupnp/libUPnP%201.6.18/

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

风险描述

使用低于17的targetSDKVersion,并且在Context子类中使用addJavascriptInterface绑定this对象。

危害描述

通过调用getClassLoader可以绕过google底层对getClass方法的限制。

修复建议

targetSDKVersion使用大于17的版本。

参考链接

https://developer.android.com/reference/android/content/Context.html#getClassLoader()

36. AES/DES硬编码密钥

风险描述

使用AES或DES加解密时,采用硬编码在程序中的密钥。

危害描述

通过反编译拿到密钥可以轻易解密APP通信数据。

修复建议

密钥加密存储或是用过变形后进行加解密运算,切勿硬编码到代码中。

参考链接

https://developer.android.com/reference/javax/crypto/spec/SecretKeySpec.html#SecretKeySpec(byte[], java.lang.String)

附录

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

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

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

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

把链接https://developer.android.com/guide/topics/manifest/application-element.html#debug中的 https://developer.android.com/换为:file:///C:/Android/android-sdk-windows/docs/ 

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容