Android高级之十三讲之安全方案

  1. 云栖社区>
  2. 博客>
  3. 正文

Android高级之十三讲之安全方案

liuzxgeek 2016-12-14 21:31:51 浏览726
展开阅读全文



本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!


Android是开源的,内部API相对比较透明,因此App的威胁会多一些,了解一些安全知识,有助于用户体验和产品稳定性。

1、App组件方面,慎用android:export=true(Activity、Service、BroadcastReveiver如果组件有超过一个intent-filter则默认为true;ContentProvider在16即4.1系统及以下默认为true,以上为false;),防止被程序恶意调用;对放出的组件,进行权限限制和数据校验,Intent设置包名。

2、WebView使用webView.addJavaScriptInterface的方式注入开放给H5的接口,使用注解的方式@JavaScriptInterface来标明接口。

4.2以下防攻击方案:http://blog.csdn.net/zhouyongyang621/article/details/47000041

3、防止反编译,造成接口被攻击、数据泄露,进行混淆加固处理;同时可以将apk的md5发给服务端进行校验,如果二次打包,则可以分辨出;用Cipher对数据库包括SharePreference加密,后者使用MODE_PRIVATE;核心功能写入so,通过jni调用

4、防止DNS劫持,使用https加密传输;升级和下载时往往容易被劫持链接而下载别的App,同时防止被hook导致安装其他路径的安装包。升级和下载使用https,安装时要比较下载包的Md5与服务端返回是否一致、包名是否一致来保证下载包正常;将数据设置失效时间。

5、接口数据校验,注意频繁请求某一接口、虚拟注册、验证码接口被刷,防止服务端被拖垮。

6、打包上传后验证签名信息,下载应用市场apk,解压出META-INF下CERT.RSA文件,使用如下命令查看签名

keytool -printcert -file META-INF/CERT.RSA

7、数据传递
 Collections.unmodifiableList(list);
上面的方法可使当前list无法再添加对象,保持数据传递的安全性。

8、某些敏感Api为防止hook,可以设置setAccessiable(false),使得无访问权限来保证业务层实现安全。

9、设置包名和权限,防止部分攻击(仅打开此包下,具备此权限的页面)

Intent intent = new Intent("com.android.settings.action.SWITH_AGED_MODE");
intent.setPackage("com.android.settings");
sendBroadcast(intent,"com.android.settings.permission.SWITH_SETTING");
并对四大组件中传递的intent进行合法性校验。

10、防御措施一般如下三种:

第一、寄托在破坏攻击者的工具。第二、寄托在Java层代码逆向、调试和阅读的难度。第三、寄托在c层代码逆向、调试和阅读的难度上。

  11、对于动态注册的广播,尽量使用LocalBroadcastReceiver来进行本地注册,这样只在本应用内通信;如果使用registerReceiver()则要做好权限控制。

附硬件信息查询方式,通过拨号盘输入如下参数即可

12、onPause时,通过ProcessManager.getRunningAppProcess来检测自己是否位于栈顶,防止第三方应用悬浮

13、使用TrustMangerFactory导入证书,自签校验

14、getRecentTask,使自己的进程不可见

在AndroidManifest.xml配置android:exclueFromRecents=false或Intent设置此flag,仅5.0以下有效,以上底层已经封掉getRecentTask方法

15、android:allowBackup="false" 防止设为true后,通过 adb backup 和adb restore来备份和恢复数据。

16、敏感信息不要使用socket通信,使用可以检验身份的方式会更好。

通用功能

代码 功能描述 备注
*#*#7780#*#* 恢复手机出厂设置,清除应用数据以及设置,移除手机绑定的谷歌账号,卸载下载的应用 不会删除系统内置应用,不会删除SD Card上的文件
*2767*3855# 重新安装手机操作系统,恢复手机出厂状态,删除包括安装在内部存储上的所有APP并清除设置  
*#*#197328640#*#* 进入调试模式  
*#*#4636#*#* 电话基本信息,电话使用情况,电池信息  
*#*#34971539#*#* 摄像头系统信息 注意不要点击不要点击升级摄像头系统信息,小心1秒变砖
*#*#7594#*#* 改变电源按键的功能,允许直接关机而不是询问用户选择操作(无声模式,飞行模式,关机)  
*#*#273283*255*663282*#*#* 备份所有的媒体文件,打开文件拷贝界面让你能够备份图片,视屏和音频等媒体文件  
*#*#8255#*#* 启动GTalk服务监控  
*2767*4387264636* 显示产品信息  
*#0228# 显示电池状态  
*#12580*369* 软件和硬件信息  
*#32489# 查看加密信息  
*#273283*255*3282*# 数据创建菜单  
*#3282*727336*# 数据使用状态  
*#8736364# OTA升级菜单  
##778 显示EPST菜单  
*#228# ADC读取菜单  

WIFI,GPS和蓝牙检测

代码 功能描述 备注
*#*#526#*#* WLAN检测  
*#*#528#*#* WLAN测试  
*#*#232339#*#* WLAN测试  
*#*#232338#*#* 显示WIFI网卡的MAC地址  
*#*#1472365#*#* 快速GPS测试  
*#*#1575#*#* 不同类型的GPS测试  
*#*#232331#*#* 蓝牙测试  
*#*#232337#*#* 显示蓝牙设备地址  

系统固件版本信息

代码 功能描述 备注
*#*#1111#*#* FTA软件版本  
*#*#2222#*#* FTA硬件版本  
*#*#4986*2650468#*#* 硬件信息  
*#*#1234#*#* PDA和手机系统信息  
*#2263# 基带选择  
*#9090# 诊断配置  
*#7284# USB模式控制  
*#872564# USB日志控制  
*#745# RIL日志输出菜单  
*#746# 调试日志输出菜单  
*#9900# 系统日志输出模式  
*#*#44336#*#* 显示构建时间,更新列表  
*#03# NAND闪存串号  
*#3214789# GCF模式状态  
*#4238378# GCF配置  

工厂测试

代码 功能描述 备注
*#*#0283#*#* 网络数据包回路测试  
*#*#0*#*#* LCD测试  
*#*#0673#*#* 音频测试  
*#*#0289#*#* 音频测试  
*#*#0842#*#* 震动与背光测试  
*#*#2663#*#* 触摸屏测试  
*#*#2664#*#* 触摸屏测试  
*#*#0588#*#* 近距离感应器测试  
*#*#3264#*#* 内存硬件版本  
*#0782# 实时钟测试  
*#0589# 光感应器测试  
*#7353# 快速测试菜单  
*#3214789650# LBS测试  
*#8999*8378# 测试菜单  
*#07# 测试历史  

PDA和电话

代码 功能描述 备注
*#*#7262626#*#* 场测试  
*#06# 显示手机IMEI号码  
*#*#8351#*#* 打开语音拨号记录日志  
*#*#8350#*#* 关闭语音拨号记录日志  
**05***# 从紧急拨号屏幕解锁PUK码  
*#301279# 网络制式HSDPA HSUPA控制菜单  
*#7465625# 查看手机锁定状态  
*7465625*638*# 配置网络锁定MCC/MNC  
*7465625*782*# 配置网络锁定NSP  
*7465625*77*# 插入网络锁定键SP  
*7465625*27*# 插入网络锁定键NSP/CP  
*#272886# 自动接听选择  

其他

代码 功能描述 备注
*#0*# Galaxy S3服务菜单 Samsung
*#1234# 软件版本 Samsung
*#12580*369# 硬件与软件信息 Samsung
*#0228# 查看电池状态 Samsung
*#0011# 打开服务菜单 Samsung
*#0283# 网络回路测试 Samsung
*#0808# 访问USB服务 Samsung
*#9090# 打开服务模式 Samsung
*#7284# FactoryKeystring菜单 Samsung
*#34971539# 访问摄像头系统 Samsung
*#7412365# 摄像头固件菜单 Samsung
##7764726 Motorola DROID 隐藏服务菜单 Motorola 默认密码6个0
1809#*990# LG Optimus 2x 隐藏服务菜单 LG 默认密码6个0
3845#*920# LG Optimus 3D 隐藏服务菜单 LG 默认密码6个0
3845#*850# LG G3 诊断测试菜单 LG AT&T
5689#*990# LG G3 诊断测试菜单 LG Sprint
3845#*851# LG G3 诊断测试菜单 LG T-Mobile
##228378 LG G3 诊断测试菜单 LG Verizon
3845#*855# LG G3 诊断测试菜单 LG 网络变种
*#*#3424#*#* HTC 测试功能 HTC
##8626337# 运行VOCODER HTC
##33284# 场测试 HTC
##3282# 显示EPST菜单 HTC
##3424# 运行诊断模式 HTC
##786# 反转诊断支持 HTC
##7738# 协议修订 HTC
*#*#786#*#* 硬件重置 Nexus 5
*#*#7873778#*#* 启动Superuser应用 Nexus 5
*#*#1234#*#* 启动Superuser应用 Nexus 5
*#123# 是否连接到家庭网络,仅用于加拿大和美国 Nexus 5
*#*#2432546#*#* 检查系统升级 Nexus 5

日志输出办法:

adb logcat -b main -v time>app.log  打印应用程序的log 

adb logcat -b radio -v time> radio.log 打印射频相关的log

adb logcat -b events -v time  打印系统事件的日志,比如触屏事件

6、权限问题

        try {
            PackageManager packageManager=mContext.getPackageManager();
            Drawable drawable=packageManager.getResourcesForApplication("com.tencent.qq").getDrawable(0x7f020110);
            mOnlineTv.setBackground(drawable);
        }catch (Exception e){
            showToast(e.getMessage());
        }

如上代码可以获取QQ的一张图片来设置到自己的App来,原因在于QQ设置了export=true,破解其App得到资源即可实现。延伸讲一个activity的安全性,一般通过action、设置应用包名可以直接打开,那么可以做的就是给activity设置一个权限,同时将传过来context的package做判断,如果在后台注册过则同意打开,否则拒绝打开。

再举一例:

   Intent intent = new Intent(Intent.ACTION_MAIN);
        ComponentName cn = new ComponentName("com.tencent.qq", "com.tencent.qq.activity.LoginActivity");
        intent.setComponent(cn);
        startActivity(intent);

7、安全一点的intent(设置selector为null,chrome默认设置component为null)

  1. // convert intent scheme URL to intent object  
  2. Intent intent = Intent.parseUri(uri);  
  3. // forbid launching activities without BROWSABLE category  
  4. intent.addCategory("android.intent.category.BROWSABLE");  
  5. // forbid explicit call  
  6. intent.setComponent(null);  
  7. // forbid intent with selector intent  
  8. intent.setSelector(null);  
  9. // start the activity by the intent  
  10. context.startActivityIfNeeded(intent, -1);  

防止被注入选项和component进入其他app,被截取数据。

劫持后如何防止用户数据被抓取

主要因为html中被插入js,同时弹出新的伪装页面

http://www.cnblogs.com/alisecurity/p/5408588.html

遇到下面这种,还是要自己多注意些

8、zip包里尽量不要出现../../file,对解压包的目录进行判断是否多级目录,防止数据被覆盖。

String entryName = entry.getName();
if (entryName.contains("..")){
throw new Exception("unsecurity zipfile!");
}

9、

伪基站传播分析

伪基站能够伪装成电信运营商的服务号,向手机用户群发钓鱼短信,收到的钓鱼短信跟正常短信显示在一起,真假难辨。钓鱼网站的仿真度很高,并抓住了人们贪小便宜的弱点,先收集用户信息,再引导安装仿冒应用。

美国联邦调查局认为:密钥长度需要设置56位,几乎不可破解,而30位以下可以通过暴力破解-入侵的艺术。

网友评论

登录后评论
0/500
评论
liuzxgeek
+ 关注