安卓的代码加固和其他安全问题

文章目录

  • 安卓加固
    • apk文件结构
    • dex加固过程
  • 其它安全问题

安卓加固

安卓的代码加固和其他安全问题_第1张图片
从App的加固技术来看:主流分为dex加密和so加密,目前来看保护dex文件更为重要,因为dex反编译后的java代码可读性更强。

android-ndk: Native Development Kit
官网解释:这套工具使您能在 Android 应用中使用 C 和 C++ 代码

安卓的代码加固和其他安全问题_第2张图片

apk文件结构

文件或目录 说明
assets 存放资源文件
lib 存放ndk编译出来的so文件
META-INF 签名信息
res 存放资源文件
AndroidManifest.xml 清单文件
classes.dex java源码编译后的dalvik字节码
resources.arsc 编译后的二进制资源文件

dex加固过程

安卓的代码加固和其他安全问题_第3张图片
上图中的重打包签名的详细图:
安卓的代码加固和其他安全问题_第4张图片
ProxyApplication就是壳dex的入口。

其它安全问题

除了混淆源码、加固源码,还有以下问题需要注意:

风险名称 风险 解决方案
篡改和二次打包 修改文件资源,添加病毒、广告,
窃取支付密码,拦截短信
混淆资源文件,
对签名过后的hash进行验签
资源文件被窃取 钓鱼网站 混淆资源文件
webview明文存储密码风险 用户使用webview默认存储密码到databases/webview.db
root的手机可以产看webview数据库
关闭webview存储密码的功能
调试日志函数调用 日志中含有敏感信息 关闭调试日志函数,删除日志文件
不安全加密 ECB模式和OFB模式 改用CBC或CFB
密钥硬编码 逆向窃取密钥 应该模仿best practice去随机生成
动态调试 gdb调试,java调试 在so文件中对调试进程进行监听
android:debuggable=“false”
应用数据被备份 清单文件中allowbackup=true
攻击者可以使用adb命令对APP应用数据进行备份
allowbackup=false
全局可读写内部文件 不同软件之间不必要的数据共享
其它应用可以读取或修改内部文件
MODE_WORLD_READABLE
android: sharedUserId
使用MODE_PRIVATE模式创建内部存储文件;加密后存储;或者干脆脱敏
内网测试信息残留 通过测试的Url,测试账号等对正式服务器进行攻击等 清除测试痕迹
随机数不安全使用 不够随机 不使用setseed方法
使用/dev/urandom /dev/random
http/https 明文传输,中间人攻击 X509TrustManager checkServerTrusted校验函数要按需实现,不能留空白
HostnameVerifier 检查证书的主机名和使用证书的主机名是否一致
输入监听 窃取密码等 自定义键盘
截屏攻击 对app界面进行截图或录屏 添加属性getWindow().setFlags(FLAG_SECURE)
不让用户截图和录屏
模拟器运行风险 刷单,模拟位置 禁止在模拟器上运行
四组件导出风险 Activity被第三方应用访问导致被任意应用恶意调用 自定义权限
动态注册Receiver风险 使用带权限检验的registerReceiver API进行动态广播的注册
PendingIntent错误使用Intent风险 使用PendingIntent的时候,如果使用了一个空Intent,会导致恶意用户劫持修改Intent的内容 禁止使用一个空Intent去构造PendingIntent
Intent组件隐式调用风险 使用隐式Intent没有对接收端进行限制导致敏感信息被劫持 对接收端进行限制
建议使用显示调用方式发送Intent
fragment注入攻击风险 PreferenceActivity的子类中,没有加入isValidFragment方法,进行fragment名的合法性校验,攻击者可能会绕过限制,访问未授权的界面 (1).如果应用的Activity组件不必要导出,或者组件配置了intent filter标签,建议显示设置组件的“android:exported”属性为false(2).重写isValidFragment方法,验证fragment来源的正确性
webview远程代码执行风险 风险:WebView.addJavascriptInterface方法注册可供JavaScript调用的Java对象,通过反射调用其他java类等 建议不使用addJavascriptInterface接口,对于Android API Level为17或者以上的Android系统,Google规定允许被调用的函数,必须在Java的远程方法上面声明一个@JavascriptInterface注解
zip文件解压目录遍历风险 Java代码在解压ZIP文件时,会使用到ZipEntry类的getName()方法,如果ZIP文件中包含“…/”的字符串,该方法返回值里面原样返回,如果没有过滤掉getName()返回值中的“…/”字符串,继续解压缩操作,就会在其他目录中创建解压的文件 (1). 对重要的ZIP压缩包文件进行数字签名校验,校验通过才进行解压。 (2). 检查Zip压缩包中使用ZipEntry.getName()获取的文件名中是否包含”…/”或者”…”,检查”…/”的时候不必进行URI Decode(以防通过URI编码”…%2F”来进行绕过),测试发现ZipEntry.getName()对于Zip包中有“…%2F”的文件路径不会进行处理。
Root设备运行风险 已经root的手机通过获取应用的敏感信息等 检测是否是root的手机禁止应用启动
从sdcard加载Dex和so风险 未对Dex和So文件进行安全,完整性及校验,导致被替换,造成用户敏感信息泄露 (1).放在APP的私有目录 (2).对文件进行完成性校验。

你可能感兴趣的:(安全,安卓,android,安全)