代码保护
classes.dex文件加密保护
在编译阶段,配置 Proguard,对敏感函数进行混淆。
Dalvik 反调试检测
攻击者可以通过动态调试的方法,对 App 进行逆向、 跟踪等。同时,攻击者还可以利用调试技术,在运行时的 App 内存中注入恶意代码,达到截获运行时数据 的目的,此举可能导致用户的隐私信息被窃取
Native 反调试检测
Native 代码注入检测
Native 库(.so 文件)加密保护
SO 中包含了编译后的机器码,由于没有对 该文件进行加密,使用工具可以将字节码还原成类 C 代码
自身签名完整性校验
Android 系统使用 JAR 包的签名机制对 APK 进行完整性保护,确保 APK 在不安全的网络传输时的完整性 得到保护。但 Android 系统没有对数字签名的颁发者进行管理,任何人都可以生成数字签名,并使用该签 名对 APK 包进行重新签名。如果 App 本身不对自身的签名来源进行有效的完整性检查,攻击者可以篡改 应用(插入恶意代码、木马、后门、广告等),重新签名并且二次发布,导致应用程序完整性被破坏。
自身文件完整性校验
APK 文件的格式为 zip 包,任 何人均可通过解压的方式获取其内部文件。如果不对内部文件进行完整性校验,攻击者可能会对 APK 包 中的资源文件、代码文件进行篡改(插入恶意代码、木马、后门、广告等),重新签名并且发布,并使用 钓鱼的方式对终端用户进行攻击。
数据传输保护
X509TrustManager 未正确校验 SSL 证书链
使用https情况下,实现checkServerTrusted()校验证书,证书不匹配抛出CertificateException异常。
应用安全规范
允许备份标记没有设置为关闭
未将备份属性 android:allowBackup 配置为 false,将允许外部程序任意备份 App 私有数据。
设置 AndroidManifest.xml 文件中设置 application 节点的 android:allowBackup 属性为 false。
允许 WebView 访问本地任意脚本
Android 使用 Webview 时可以使用 setAllowFileAccess(boolean allow)方法禁用或允许 webview 加载本地 文件,webview 默认是允许加载本地文件的,如果没有对需要加载的脚本做校验,Webview 将加载任意本 地脚本,攻击者可使之加载恶意代码导致用户数据泄露等安全风险。
setAllowFileAccess(boolean allow)方法只是禁用或允许 webview 对文件系统的访问, Assets 和 resources 资源任然可以使用 file:///android_asset 和 file:///android_res 访问。
对需要加载的文件做白名单校验,防止攻击者对脚本进行篡改后添加到脚本中的恶意代码危害到 客户端安全。
调试日志输出敏感信息
在开发阶段不使用 Android 系统自带的 Log 输出,而是使用另外一个类对 Log 进行包装。该类使用 全局变量控制是否输出调试信息,在应用实际发布的时候,对所有的调试输出统一进行关闭。
通过合理配置 ProGuard,在编译期移除调试输出的代码,proguard-rules.pro 的配置如下:
必须注释掉-dontoptimize
移除所有 android.util.Log 相关的代码
-assumenosideeffects class android.util.Log { public static int v(...);
public static int i(...);
public static int w(...);
public static int d(...);
public static int e(...); }
Activity 进行防止截屏处理
在 Activity 中添加防止截屏的选项,在 Activity 的 onCreate()中配置: getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE)
运行环境安全性检查
在 App 添加检测运行环境的代码或者 SDK,在不安全的环境(Root、模拟器等)中对用户做出提示,禁止某些敏感 功能运行。
网友评论