安卓安全那点事

本文旨在对于一个安卓app的安全知识做一个较为泛泛的总结,为开发出更安全的应用提供思路。内容比较粗略,仅起到抛砖引玉的效果,还望大家见谅。

Android应用的安全

意义

在维基百科上有一个关于计算机安全的定义:

计算机安全(computer security)是计算机与网络领域的信息安全(information security)的一个分支。其目的是在保证信息和财产可被授权用户正常获取和使用的情况下,保护此信息和财产不受偷窃,污染,自然灾害等的损坏。计算机系统安全是指一系列包含敏感和有价值的信息和服务的进程和机制,不被未得到授权和不被信任的个人,团体或事件公开,修改或损坏。由于它的目的在于防止不需要的行为发生而非使得某些行为发生,其策略和方法常常与其他大多数的计算机技术不同

这些话中,关键点是 保护, 信息和财产。现如今的信息是有价值的,是财产的一部分,应用的保护说到底是就保护自己的财产。合理有效的防护手段能够避免自身的利益受到损害。

现状

关于这件事,Android从业人员做的怎么样呢?从腾讯的安全科恩实验室的报告中做了一个截取
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aqcBKZGd-1593566519763)(./images/1590722564509.png)]

看报告的结论只能说惨不忍睹,差点就全军覆没了。安卓从业人员这安全意识这一块做的不怎么好,甚至连安全意识都没有的人也大有存在。根据我的开发经历开看,不少开发人员对安全这块可以说是一无所知

讲两个我遇到的真实案例

  • 曾经的就职的某手机公司,早期系统应用的签名都是统一的,人手一个是一个非常廉价的可获取资源。后来发生了一件事,有一个消费者投诉反馈到了工信部,经调查发现系统的浏览器被插入了一些不可描述的广告。很不幸的是被注入的页面是我提供的SDK,虽然锅没有背在我的身上,但是这个事情相关联的人都受到较为严格的处罚
  • 公司邀请专业的安全公司顾问上门给我们进行科普,这些安全人员就针对公司应用的安全扫描中,结果发现了一些应用的超级权限有弱口令像12345这样的可以直接进行访问,用户设置的密码如同摆设,一度场面十分尴尬。很多应用用裸奔来形容也不为过

如何破解一个APP

情景假设:给你一百万如果针对一个应用或者体系获取需要的的信息

古语云:上兵伐谋,其次伐交,再次伐兵

  • PlanA: 直接收买开发人员
  • PlanB: 收买开发人员的手中的部分信息,然后再招人破解
  • PlanC: 直接硬刚一波进行破解

以上的三个策略PlanA是最佳的,因为获取信息最全面,成本也最低,但是风险确较高。

虽然PlanC的硬刚破解是最笨的办法,但是我们做技术的需要研究的也就是这种最笨拙的方式了。以上的例子只是为了告诉大家
安全的本质是成本,如果可以,技术的手段是非必须的

安全的成本本质也体现在防守的一方,做防守的人也需要在安全成本的投入上进行衡量。防守策略的投入,会使得应用的不稳定因素提高,启动变慢,体积变大,用户的操作受到影响等隐性成本的提升。

有点跑题了,回归技术的相关,破解一个应用的基本思路

  1. 采集信息(日志信息,网络报文,落地的文件,使用的类库等)
  2. 分析数据(寻找加密算法,分析数据报文的真实内容)
  3. 验证数据
  4. 伪造数据或者篡改应用本身

这里最难的是第一二步,后面的大多有可以直接抄袭的实现代码,反而比较容易。采集信息就是见缝插针,尽可能的了解更多。
知己知彼方能百战不殆,回顾一个软件产品的上线过程,了解每一个细节,才能去找寻可能的漏洞。

一个软件的正常流程是这样的:
设计->开发->发布->运行
在这里插入图片描述

设计安全

设计上的分类分为UI设计安全业务逻辑设计安全

UI设计安全

在UI操作上防止泄露必要的信息,虽然基础但是很有必要
比如登录的账号密码,在显示时会增加一个密码的隐藏过程
在这里插入图片描述

这里就包含好几点可以进行处理,

  • 界面上不会显示明码防止窥屏
  • 界面上显示的黑色点数并不是真实的位数,防止通过位数来猜测
  • 使用系统级别安全的键盘或者自定义键盘输入
  • 禁止残障人员辅助功能
  • 隐私信息的后台模糊显示

逻辑设计安全

对于设计的业务逻辑应该是一个完整的闭环,对于攻击应该有意识的进行应对。
身为应用的门户,登录是所有人应对的第一关。不知道大家是否发现登录这个环节无论是在哪个应用中都算是比较奇葩的,有很多在登录时做的验证操作,短信验证人脸识别等等,这些操作的初衷是为了什么?

同样是提问:

  1. 登录是单点的么?
  2. 登录需要怎么识别是非机器操作?
  3. 登录需要超时么?
  4. 登录的出错尝试的多少次?
  5. 登录的出错验证需要什么进行处理?

一个完整的业务逻辑是需要考虑要考虑为了安全需要做到哪一步的?在用户使用的便宜性和安全级别之间做衡量。设计的东西太繁杂,需要在设计阶段就需要细细的琢磨,不能太过随意

这里吐槽一点,就是网易大师邮箱的登录,没法设置单点,也没放弃某一个客户端的登录,登录了多个邮箱后,旧的邮箱仍然在不断的推送。如果暂时把登陆过的设备出借他人了,没有任何办法知道我的信息到底分发到哪里去了,差评。

源码安全

项目管理级别

  1. 源文件下载的管理
    代码的下载管理,ssh下载优于账号密码的下载
    使用电脑的文件加密(usb口限制了)

  2. code Review
    代码安全的审核,防止溢出等导致可能的攻击
    依赖库的审核 (比如fastjson又双叒叕暴露了高危漏洞)
    sonar的静态检测工具是也是有必要的

  3. 秘钥管理
    秘钥是身份证,不要身份证人手一张,影响不好,最理想的状态是除了管理层应该谁也不知道签名的秘钥
    jekins gitlab 上面都可以支持参数配置,脚本运行打包的方式

源码自身的保护

  1. 文件混淆 资源混淆

  • 文件混淆和资源混淆的意义都在于降低其代码的可阅读性。增加反向阅读的难度。
    一般情况下资源是不用混淆的,出于做到更优的想法,资源的隐藏比没有隐藏肯定会更好。
    资源混淆是一个比较复杂的操作,目前看到是腾讯系的使用比较多。
    目前android使用的ProGuard的工具进行class文件的混淆操作,这里仍然提醒的一点是混淆是颗粒度,较多的开发者对于proGuard的工具没有清晰的认识,只会最简单的处理方式。对于安全级别高的应用,应该尽可能的做多的混淆
    处理前,
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3YT5E0cZ-1593566519776)(./images/1591150915047.png)]
    处理后
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rU40BZdK-1593566519779)(./images/1591150955297.png)]

  • 源码阅读工具
    阅读class的工具jd-gui下载地址
    github新出项目的比较好用的一键解读apk的神器 jadx附上对应的github地址
    如果前两者的转换有不全面的,借助baksmali 则可以直接转smali后进行阅读,smali类似于汇编语言的存在,如果到了这个级别,我就根本不在乎字节码的可读性了,因为本身就可读性很差了。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0I49tWkn-1593566519780)(./images/1591151950836.png)]

  1. 静态保护 加花指令,防止静态分析工具,比如针对.so分析的IDAPro
    class的字节码世界已经不安全了,我要进行进一步的隐藏,内容下沉到.so中。
    (ps:我们公司的使用的易盾就是有这种操作)
    代码下沉后,仍然有比较好用工具比如IDApro这类静态分析工具能够进行阅读。
    这个时候我们可以加入适当的花指令
    花指令有两种表现方式:

    • 一种是无用的代码增加你的阅读量
    • 一种是陷阱指令使得的反编译工具在运行时出现问题或者不能正确的解析一些真实的代码
  2. 动态保护 加固,隐藏真实的内容
    加壳的程序可以有效阻止对程序的反汇编分析,以达到它不可告人的目的。这种技术也常用来保护软件版权,防止被软件破解
    在不同的平台上涉及到具体的操作手段会有所区别,但本质上都有壳程序优先获得应用的控制权,代替系统的加载过程,完成自定义的加载。在加载的过程中可以有加解密的操作,达到隐藏源码的作用。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3AnSEXgy-1593566519781)(./images/1591325856024.png)]

运行时安全

  1. 简单的自证身份

  • 签名的合法性进行校验防止二次打包的应用


  • 篡改函数的返回值
    二次打包后可以任意的注入代码

  1. 数据传输安全
    你还在用http嘛?https一定是安全的嘛?
    一句话描述https: https的本质是通过非对称的加密方式保护对称秘钥的传输
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uaxYCXYm-1593566519783)(./images/1591154429328.png)]
    在实际的场景中由几种app使用Https的方式
    1、信任任何证书
    2、信任系统校验证书
    3、公钥校验
    4、证书全校验

  • 正确的使用https
    单端校验的完善(https中需要校验主机名等操作)
    最理想的是双端校验,服务器需要校验客户端的合法性,客户端也需要校验服务器的合法性
    同时也可以不信任代理,拒绝代理等方式来保护通信


  • 使用flidder主要针对是http/https的报文
    wireshark则主要是直接抓取的网卡的数据,更加的全面强大

  1. 数据落地安全

  • 日志不明码
    文件寻找合适的存储位置(android的存储位置为应用内部私有空间,应用外部私有空间,应用外部公共空间)
    文件落地加密
    数据库落地加密

  • root权限,获取所有的文件
    查看应用找到加密算法和秘钥
  1. 组件通信安全
    与SQL注入类似,Android中四大组件暴露的组件是很危险的Activity ContentProvider, Service, Broadcast

  • 获取不同的报文猜测应用的行为
    针对ContentProvider也可以进行注入
    • 隐藏不必要的组件
    • 组件的输入参数进行严格的校验
    • 所有涉及到跨进程传递的,只能是加密的敏感数据或者非敏感数据
  1. 反调试

  • 应用二次打包,调整清单文件debugable为可调试
    系统全局系统设置为可调试 ro.debuggable 1
    apk->smali文件进行调试
    XPosed , Magisk或者 VirtualAPP hookAPI
    XPosed操作:system/bin/下面的文件替换了app_process等文件,app_process就是zygote进程文件。所以Xposed通过替换zygote进程实现了控制手机上所有app进程。因为所有app进程都是由Zygote fork出来的。
    Xposed的基本原理是修改了ART/Davilk虚拟机,将需要hook的函数注册为Native层函数。当执行到这一函数是虚拟机会优先执行Native层函数,然后再去执行Java层函数,这样完成函数的hook。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JELnQCGS-1593566519784)(./images/1591324720463.png)]

    • 调试检测,根据自身的编译检测调试环境
      每个进程同时刻只能被1个调试进程ptrace,再次p自己会失败。所以可以主动ptrace自己,根据返回值判断自己是否被调试了
    • 进程名检测
    • 系统的调试检测函数
    • 断点搜索的检测(软断,硬断,内存断)
  • 检查虚拟机环境

    • 检查手机IMEI等一系列编号
    • 读取手机品牌信息
    • 检查mac地址
    • 处理器信息
  • 检查Xposed 框架

    • 遍历App安装列表检测
    • 通过自造异常检测堆栈信息,读取异常堆栈中是否包含Xposed字符串来识
    • 通过ClassLoader的 loadClass 加载列表检测
    • 由于Xposed的注入方式是通过底层SO文件修改被hook的方法为native来实现的,所以检测方也可以通过检测方法是否变成了native来达到检测的目的
    • 检测Xposed相关文件
    • 通过反射XposedHelper类和XposedBridge类做信息检测

结语

安全领域是一个庞大而专业的领域,身为非专业的人员很难到做精通,但是对其有所了解是非常有必要的事情。避免一些低级的错误,是我们作为一个合格的开发人员应该具备的素质。能够尽可能的了解安全的知识,才能做出一个靠谱的产品。
你没法赚到超出你认知范围外的钱,同样你也没法做出你认知范围外的防守。
共勉!

热门文章

暂无图片
编程学习 ·

Nginx学习笔记

1.Nginx简介 Nginx 是一个高性能的HTTP和反向代理服务器,特点是占内存少,并发能力强。Nginx转为性能优化而开发,性能是器最重要的考量,实现上非常注重效率,能经受住高负载的考验,有报告表明能支持的高达50000个并发连接数。 百度,腾讯,网易,淘宝等都在使用Nginx. 2.反…
暂无图片
编程学习 ·

C++数据结构第16课、线性表存储结构的抽象实现

课程目标 — 完成顺序存储结构线性表的抽象实现SeqList 设计要点 — 抽象类模板,存储空间的位置和大小由子类完成 — 实现顺序存储结构线性表的关键操作(增、删、查、等) — 提供数组操作符,方便快速获取元素SeqList.h #ifndef SEQLIST_H #define SEQLIST_H#include "…
暂无图片
编程学习 ·

传说中的中国复杂报表都长什么样?有什么特点?

最开始中国式报表这个术语是针对国外的报表工具来说的,当时国外的报表工具只能做一些格式很规整的报表,到了中国以后发现有很多报表做不出来,或者做起来极不方便,还需要大量的人工编程。这些报表成了国外报表工具的恶梦,于是把复杂难做的报表称为“中国式”的。这些很难做…
暂无图片
编程学习 ·

SSM整合小案例

SSM整合 数据库部分(Oracle)创建表 CREATE TABLE product( id varchar2(32) default SYS_GUID() PRIMARY KEY, productNum VARCHAR2(50) NOT NULL, productName VARCHAR2(50), cityName VARCHAR2(50), DepartureTime timestamp, productPrice Number, productDesc VARCHAR2(500…
暂无图片
中恒嘉业 ·

关于主从复制的超详细解析(全)

目录前言1. 主从复制1.1 方式2. Mysql的主从复制2.1 一主一从2.1.1 window和linux通讯2.1.2 linux和linux的通讯2.2 双主双从3. Redis的主从复制3.1 哨兵模式3.2 java代码结合前言 主要介绍mysql的主从复制以及redis的主从复制 能由浅入深的明白原理以及如何操作 再者&#xf…
暂无图片
郑州普通话 ·

树莓派RGB跑马灯实验

树莓派RGB小灯实验第一步:接引脚第二步:讲解一:初始化二:格式化引脚三:开启特效第三步:最终代码第一步:接引脚 树莓派RGB灯GPIO12RGPIO16GGPIO18BGNDGND 第二步:讲解 一&#xff1…
暂无图片
郑州普通话 ·

ctfshow 网络迷踪-哐啷哐啷+鲶鱼之谜

12 哐啷哐啷 通过谷歌识图找到这张图片出自的文章 得到这是这是新疆和田 ctfshow{和田} 13 鲶鱼之谜 这题在群里有wp我就不写了各位可以参考一下群文件 最终flag:ctfshow{ca1524_1837}
暂无图片
代理记账 ·

在web应用中发送和接收Jakarta消息

Running the websimplemessage Example To Package and Deploy websimplemessage Using Maven _1、Make sure that GlassFish Server has been started (see Starting and Stopping GlassFish Server). _2、In a terminal window, go to: tut-install/examples/jms/websimp…
暂无图片
cgfy ·

C++学习日记2——函数、封装、对象特性

一、函数 1.1 函数默认参数 1.1.1 简介 在C中&#xff0c;函数的形参列表中的形参是可以有默认值的 1.1.2 语法 返回值类型 函数名 (参数 默认值) {} 1.1.3 代码 #include <iostream> using namespace std;// 函数的默认参数 int func(int a, int b 20, int c 30…
暂无图片
coreui ·

视频水印怎么去除?超简单 千万不要错过

小编在知乎看到很多大佬分享的视频去水印的方法&#xff0c;但是感觉都有点太复杂了&#xff0c;今天就来分享一下小编自己私藏的几个针对于视频去水印的软件和网站~建议大家收藏哦~ 1、爱给网-视频去水印小工具&#xff08;免费 在线&#xff09; 推荐点 1、在线操作&#…
暂无图片
coreui ·

Mac 安装 tomcat10

Mac 安装 tomcat10 1、下载tomcat tomcat官网&#xff1a;https://tomcat.apache.org/ 点击我下载的tomcat10&#xff1a; 2、下载解压,给bin下的*.sh文件添加可执行权限 3、修改webapps下的ROOT中的index文件查看效果
暂无图片
未来博客 ·

视频水印怎么去除?超简单 千万不要错过

小编在知乎看到很多大佬分享的视频去水印的方法&#xff0c;但是感觉都有点太复杂了&#xff0c;今天就来分享一下小编自己私藏的几个针对于视频去水印的软件和网站~建议大家收藏哦~ 1、爱给网-视频去水印小工具&#xff08;免费 在线&#xff09; 推荐点 1、在线操作&#…
暂无图片
未来博客 ·

Mac 安装 tomcat10

Mac 安装 tomcat10 1、下载tomcat tomcat官网&#xff1a;https://tomcat.apache.org/ 点击我下载的tomcat10&#xff1a; 2、下载解压,给bin下的*.sh文件添加可执行权限 3、修改webapps下的ROOT中的index文件查看效果
暂无图片
建站日记 ·

惠州实验室建设选址、勘察事项

惠州实验室建设选址、勘察事项&#xff0c;SICOLAB技术员带您从实验室建设启动前思考问题考虑如下&#xff1a;一、不同实验室建设选址要求 1.化学实验室 &#xff08;1&#xff09;清洁安静环境 &#xff08;2&#xff09;远离住宅、生活区 &#xff08;3&#xff09;锅炉房与…
暂无图片
建站日记 ·

NLP聊天机器人原理(seq2seq模型)

一、seq2seq模型 1.概念 seq2seq是一个Encoder-Decoder结构的网络&#xff0c;它的输入是一个序列&#xff0c;输出也是一个序列。Encoder中将一个可变长度的信号序列变为固定长度的向量表达&#xff0c;Decoder将这个固定长度的向量变成可变长度的目标的信号序列。这个结构最…
暂无图片
mfbz ·

惠州实验室建设选址、勘察事项

惠州实验室建设选址、勘察事项&#xff0c;SICOLAB技术员带您从实验室建设启动前思考问题考虑如下&#xff1a;一、不同实验室建设选址要求 1.化学实验室 &#xff08;1&#xff09;清洁安静环境 &#xff08;2&#xff09;远离住宅、生活区 &#xff08;3&#xff09;锅炉房与…
暂无图片
mfbz ·

全渠道会员通-天猫会员通3: 会员运营内容准备

在天猫会员通技术对接开发过程中&#xff0c;为了通知存量会员的通知工作&#xff0c;发挥会员通的优势&#xff0c;品牌需要做好以下事宜&#xff1a; 会员体系暂停公告&#xff1a;因会员通技术升级期间&#xff0c;会员服务将被暂停&#xff0c;店铺tab中会员入口将被下线&…
暂无图片
珊珊日记 ·

C# 执行Javascript脚本

c#教程https://www.xin3721.com/eschool/CSharpxin3721/ 前一阵子使用C#编写SCXML状态机&#xff0c;需要解析EMCScript表达式&#xff0c;使用了Jint库&#xff08;https://github.com/sebastienros/jint/)&#xff0c;当时感觉与C#之间的数据转换不是很方便。这两天有时间又关…
暂无图片
珊珊日记 ·

第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛

A.大学期末现状 题目描述 作为一名大学生的你&#xff0c;现在又到了期末查成绩的时候&#xff0c;当你的成绩大于等于60时请输出“jige,haoye!”,否则输出"laoshi,caicai,laolao"。 输入描述: 一行&#xff0c;一个整数x代表你的成绩&#xff08;0<x<100&a…