安全

标题: Kotlin 章节: Kotlin 内容:

【强制】使用 PendingIntent 时,禁止使用空 intent,同时禁止使用隐式 Intent。
【强制】禁止使用常量初始化矢量参数构建 IvParameterSpec,建议 IV 通过随机方式产生。
【强制】将 android:allowbackup 属性设置为 false,防止 adb backup 导出数据。

说明: 在 AndroidManifest.xml 文件中为了方便对程序数据的备份和恢复在 Android APIlevel 8 以后增加了 android:allowBackup 属性值。默认情况下这个属性值为 true,故当 allowBackup 标志值为 true 时,即可通过 adb backup 和 adb restore 来备份和恢 复应用程序数据。 正例:

<application
android:allowBackup="false"
android:icon="@drawable/test_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
【强制】在实现的 HostnameVerifier 子类中,需要使用 verify 函数效验服务器主机名的合法性,否则会导致恶意程序利用中间人攻击绕过主机名效验。
【强制】利用 X509TrustManager 子类中的 checkServerTrusted 函数效验服务器端证书的合法性。
【强制】META-INF 目录中不能包含如.apk,.odex,.so 等敏感文件,该文件夹没有经过签名,容易被恶意替换。
【强制】Receiver/Provider 不能在毫无权限控制的情况下,将 android:export 设置为 true。
【参考】数据存储在 Sqlite 或者轻量级存储需要对数据进行加密,取出来的时候进行解密。
【强制】阻止 webview 通过 file:schema 方式访问本地敏感数据。

不要广播敏感信息,只能在本应用使用 LocalBroadcast,避免被别的应用收到,或者 setPackage 做限制。

【强制】不要把敏感信息打印到 log 中。

说明: 在 APP 的开发过程中,为了方便调试,通常会使用 log 函数输出一些关键流程的信息,这些信息中通常会包含敏感内容,如执行流程、明文的用户名密码等,这会让攻击者更加容易的了解 APP 内部结构方便破解和攻击,甚至直接获取到有价值的敏感信息。

【强制】对于内部使用的组件,显示设置组件的"android:exported"属性为 false
【强制】应用发布前确保 android:debuggable 属性设置为 false。
【强制】使用 Intent Scheme URL 需要做过滤。
【强制】密钥加密存储或者经过变形处理后用于加解密运算,切勿硬编码到代码中。

说明: 应用程序在加解密时,使用硬编码在程序中的密钥,攻击者通过反编译拿到密钥可以轻易解密 APP 通信数据。

【强制】将所需要动态加载的文件放置在 apk 内部,或应用私有目录中,如果应用必须要把所加载的文件放置在可被其他应用读写的目录中(比如 sdcard),建议对不可信的加载源进行完整性校验和白名单处理,以保证不被恶意代码注入。
【强制】除非 min API level >=17,请注意 addJavascriptInterface 的使用。
【强制】使用 Android 的 AES/DES/DESede 加密算法时,不要使用默认的加密模式 ECB,应显示指定使用 CBC 或 CFB 加密模式。
【强制】不要使用 loopback 来通信敏感信息。
【推荐】对于不需要使用 File 协议的应用,禁用 File 协议,显式设置 webView.getSettings().setAllowFileAccess(false),对于需要使用 File 协议的应用,禁止 File 协议调用 JavaScript,显式设置

webView.getSettings().setJavaScriptEnabled(false)。

【强制】Android APP 在 HTTPS 通信中,验证策略需要改成严格模式。 说明:Android APP 在 HTTPS 通信中,使用 ALLOW_ALL_HOSTNAME_VERIFIER,表示允许和所有的 HOST 建立 SSL 通信,这会存在中间人攻击的风险,最终导致敏感信息可能会被劫持,以及其他形式的攻击。
【推荐】Android5.0 以后安全性要求较高的应用应该使用

window.setFlag(LayoutParam.FLAG_SECURE) 禁止录屏。

【推荐】zip 中不建议允许../../file 这样的路径,可能被篡改目录结构,造成攻击。 说明:当 zip 压缩包中允许存在"../"的字符串,攻击者可以利用多个"../"在解压时改变 zip 文件存放的位置,当文件已经存在是就会进行覆盖,如果覆盖掉的文件是 so、dex 或者 odex 文件,就有可能造成严重的安全问题。
【强制】开放的 activity/service/receiver 等需要对传入的 intent 做合法性校验。
【推荐】加密算法:使用不安全的 Hash 算法(MD5/SHA-1)加密信息,存在被破解的风险,建议使用 SHA-256 等安全性更高的 Hash 算法。
【推荐】Android WebView 组件加载网页发生证书认证错误时,采用默认的处理方法 handler.cancel(),停止加载问题页面。

说明: Android WebView 组件加载网页发生证书认证错误时,会调用 WebViewClient 类的 onReceivedSslError 方法,如果该方法实现调用了 handler.proceed()来忽略该证书错误,则会受到中间人攻击的威胁,可能导致隐私泄露.

【推荐】直接传递命令字或者间接处理有敏感信息或操作时,避免使用 socket 实现,使用能够控制权限校验身份的方式通讯。