签名和权限的作用

Android签名中使用到的一些加密技术有:

公/私钥, SHA1(CERT.SF,MANIFEST.MF), RSA(CERT.RSA), 消息摘要,

移动平台中的主流签名作用:

  • Android平台中是使用自签名

    自签名,证书的签名者和证书拥有者是同一人.

自签名的完整性认证

自签名是没有信任模式的,因为自签名信息是自己的,对无法知道该信息是不是安全,我们只能对其的完整性进行认证.

限制安装和运行

下面是限制应用安装和运行的流程

  • 应用安装时

    校验是否含签名 –> 没有,禁止安装

    –> 有,提取证书进行校验–> 证书是否有效可信任–> 不是禁止安装.

    基于证书的公钥对签名进行校验–> 签名是否正确 –> 不正确禁止安装.

  • 应用运行时

    校验是否包含签名 –> 没有,禁止运行

    –> 有,提取证书进行校验–> 证书是否有效可信任–> 不是禁止运行.(这一步跟安装流程相似)

    基于证书的公钥对签名进行校验–> 签名是否正确 –> 不正确禁止运行.(这一步跟安装流程相似)

权限的作用(细粒度的特权管理)

  • 权限是一个ID或者一个字符串
  • 谦虚用来细分权利(类似Capability,分散权利)
  • 通常一个权限与一个类操作绑定
  • 权限首先需要申请(AndroidManifest或者代码动态申请)
  • 但是申请后是否被批准有平台策略决定

    如:用户需要读取SDCard的权限,这时Android平台会弹出访问SDCard的窗口,如果用户accept了,那这个权限就被申请.

权限的安全性保护(通过签名)

  • 权限的完整性保护(防篡改)

    如发短信的方式,不可能没发一条短信都弹dialog来申请权限,所以这时开发只要在Manifest 中添加 sendSMS permission 就可以.(通过认证并获得签名后再加policy权限)

  • 权限的授权安全策略(防Escalate)

    如普通应用申请Inject Event 权限(注入)

签名作用

完整性鉴别

  • 自签名支持完整性鉴别

    Android中使用的是自签名方式,那就是无法对签名的信任进行认证,只能通过他的完整性鉴别.

  • 不做安装和运行时的限制(不做信任模式)

    Android不会在安装的时候进行Signature Permission 的验证,他仅仅是做Signature(签名) 这步骤.

Signature Permission 和ShareUID(TODO 讲得不错要做详细)

  • Signature Permission(Signature Permission Level Permission)

    相当于他对一些特权的permission 他用单独的signature 方式去验证.

    • 示例代码块:
 <permission android:name="android.permission.HARDWARE_TEST"//权限名称,要注意命名规范
    android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"//在显示时对权限进行归类
        android:protectionLevel="signature"// 权限安全界别
    android:label="@string/permlab_hardware_test"// 在对应语言系统上显示

  android:description="@string/permdesc_hardware_test"
  //该权限的描述与使用
  /> 

上面的protectionLevel="signature" ,因此他并不是给第三方应用去使用的.对于普通的app去使用该权限的话肯定是会被拒绝的.但是对于如果是系统应用的话只要要.mk 里的config写的是security="platefrom" 那么这个app里的Signature 就会使用平台的private key 进行签名.

  • ShareUID(Share Process UID)

    • 示例代码块:

      android:sharedUserid="xxx"

    其实Android中的UID也是在manifest 中写的,如上面代码,那么Android重为什么要有UID.

    UID其实是一个特权的概念,不同文件对一些权限会做一些限制,如对于 uid="owner" 会用r/w/x 权限,而对于uid="other" 可能就会连read 的权限都没有.这样就可以使得Android中每一个 project他对于的资源目录下是属于一个private 的状态.

    所以Android很好的引用了Linux自有的一些特性,将每个项目通过群组(UID)的方式分离出来.

    • Process间Share UID的目的是共享资源

      如果a,b,c三个应用他们之间的share UID是同一个,那么这几个应用间的资源是开源互相访问的.

      漏洞: 那么这样就会引出一个安全问题,如果360配置的时候将share UID设置成 QQ应用一样,而且框架允许的情况下,那么问题就来了,360可以很简单的就访问到了qq的数据.

    • Android中两个Apk Share相同的UID必须其签名所用的Private Key 一样.(为什么?)

      google的解决方法就是,如果多个应用之间真的要设置成Share UID相同,那么前提条件就是这几个应用的私钥也必须是一样的,是同一个owner ,也就是说厂家是同一家.

身份ID和升级的匹配

  • Android中的自签名只是代表了身份,但是不代表身份是否可信任
  • Android应用的identifier(鉴定者) 是Package Name:
    • Package Name不一样,相互不影响,只允许同时存在(安装)
    • Package Name一样,只能存在一个,允许做升级处理.
  • 升级的安全性考虑
    • 必须签名的证书一致(市场上假冒app)
    • 如果不一致,则用户要么放弃新的应用,要么先卸载旧的,再安装新的.
    • 正常的升级将不清除应用cache,以保证历史数据的持续性.

Android APK 之META INF

其实很应用的安装包,就是一个压缩包,把apk 后缀修改成.zip 就可以解压里面的数据.

  • APK的一个结构

    • assets
    • lib
    • META-INF 里面有3个文件,相当于是摘要信息文件(签名信息CERT.RSA,CERT.SF,MANIFEST.MF)
    • res
    • AndroidManifest
    • class.ex
  • 签名流程

    java -jar signapk.jar testkey.x509.pem testkey.pk8 update.apk update-signed.apk

Android中的权限

Android签名中使用到的一些加密技术有:

签名(特权权限)

权限作用

细粒度特权管理

  • 权限与操作关联

    每一个权限都与对应的操作(功能)有关联.

  • 应用需要显式申请权限

    如需要在AndroidManifest中去申请需要的权限.

  • 用户对权限可知(不可控)

    用户对该项目使用到的app需要涉及什么权限,都是可以查看到的,但是在安装app时必须accept所有权限才可以安装,否则就无法安装,这就是不可控,但是在Android6.0后google出现了RuntimePermission,对部分单个权限是可控的,而且当系统root后,也可以通过一些管家对某个app 的单个权限进行分配.

  • 对特权权限单独控制

    Android中对特权权限单独控制,这个方式其实就是通过签名来处理的.比如上面提到的sendSMS 发送短信的权限.

Android的不同权限类别

  • Normal 默认,一般安装不会被显示出来.
  • Dangerous 危险,安装时会有pop提示.
  • Signature 签名,对于一些特权权限就需要通过签名来保护,对apk的私钥邀请与签名一样.
  • SignatureOrSystem 签名or系统,对于申请权限的私钥跟签名一样,或者改app是系统app才可以使用该权限.
  • 自定义权限注意

    一般一些开发厂商或应用开发商会自定义一些权限.

注意:

对于自定义权限很简单,但是对于要设置他的protectionLevel这个问题还是比较关键的.如果level定义太严格,那以后拓展起来就比较差,如果定义太宽泛,就很容易出现安全漏洞.建议根据如下方式定义:

  • 根据需求应用范围用户权限,按照上面的权限类别描述来定义需要的权限.
  • 为了避免permission name 重复,命名规范也要注意.
  • 如,百度地图在自定义权限时,该sdk提供一些api但是如果这些功能只给百度自己公司的app 用,那就可以定义protectionLevel=”SignatureOrSystem”.

Android权限的定义源码路径

Android运行时权限控制方式

下面是两种方式的描述

通过PM的CheckPermission

  • Android独有的service(底层平台不具有)
  • 所以需要在Android本身framework中控制
  • 主流的service一般都基于binder IPC或者其他IPC提供服务
  • Android真正的service都是在底层实现的,所以在最底层控制(service所在的server中)以避免逃逸控制
    • 绕开Utility Function 直接 Invoke Remote Service
    • 如:DayDream(屏保)

映射为OS的特定属性

  • 非Android特有的service(底层平台已经提供,如File访问,TCPIP数据收发等)
  • 多个入口访问: Android API,Java API, NDK C API, Shell,etc
  • 底层控制准则,会聚扣在底层,所以在底层(OS层面)统一控制,这样可以避免逃逸控制.
  • 所以复用OS的一些安全控制特性,比如GID
  • 所以需要把Android空间的 Permission Mapping到OS的GID
  • 如: 访问SDCard

因为Android是基于Linux OS的那么Linux它有的一些安全特性与GID ,Android就可以对他复用,因此在对于多接口的访问安全问题就可以解决了,可以先看下面代码:

读取SDCard的权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

SDCard权限的映射关系

<permission name="android.permission.WRITE_EXTERNAL_STORAGE"
    <group gid="sdcard_rw"
/>

Android的permission 与UID/GID 的mapping

  • 任何自定义权限只要符合上面xml 语法的都会在system/etc/permissions 下面的xml文件,被系统读取并parse 在UID/GID中进行mapping. 如见system/etc/permissions 目录下的platform.xml .
  • 安全性问题
    • 任何应用都可以为自己的permission 分配GID吗?那不是安全漏洞?
    • 当然不行! 只有ROOT用户才允许新增或改写.

Android签名与权限的安全问题(3)的更多相关文章

  1. android apk的签名和权限问题

    一. android apk的签名问题(http://blog.csdn.net/lyq8479/article/details/6401093) 1.为什么要给Android应用程序签名?      ...

  2. Android签名机制

    Android APK 签名比对 发布过Android应用的朋友们应该都知道,Android APK的发布是需要签名的.签名机制在Android应用和框架中有着十分重要的作用. 例如,Android系 ...

  3. Android Permission 访问权限大全(转)

    程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 完整列表如下: android.permission.ACCESS_CHECKIN_PROPERTIES允 ...

  4. Android 签名证书

    Android APK的数字签名的作用和意义 http://blog.csdn.net/gaomatrix/article/details/6568191 http://jingyan.baidu.c ...

  5. Android签名总结

    signapk.jar与eclipse export插件默认赋予程序一个DEBUG权限的签名 signapk.jar包含有系统权限(system api, permission),而eclipse e ...

  6. Android 签名详解

    Android 签名详解 AndroidOPhoneAnt设计模式Eclipse  在Android 系统中,所有安装 到 系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程 ...

  7. Android 安全性和权限

    自定义权限 permission <permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT& ...

  8. Android签名详解(debug和release)

    Android签名详解(debug和release)   1. 为什么要签名 1) 发送者的身份认证 由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,以此保证签名不同的包 ...

  9. Android签名打包详解

    一.      Android签名有什么作用? 应用程序升级:如果你希望用户无缝升级到新的版本,那么你必须用同一个证书进行签名.这是由于只有以同一个证书签名,系统才会允许安装升级的应用程序.如果你采用 ...

随机推荐

  1. SqlServer优化:当数据量查询不是特别多,但数据库服务器的CPU资源一直100%时,如何优化?

    最近和同事处理一个小程序,数据量不是特别大,某表的的数据记录:7000W条记录左右,但是从改别执行一次查询时,却发现查询速度也不快,而且最明显的问题就是CPU100%. sql语句: select g ...

  2. SpringBoot中@ManyToMany的坑

    我在User表中添加了manytomany的外键映射 @ManyToMany(fetch=FetchType.EAGER) @JoinTable(name="user_role", ...

  3. jacascript 滚动 scroll 与回到顶部

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 滚动 scroll scrollHeight 表示元素的总高度,包括由于溢出而无法展示在网页的不可见部分: ...

  4. contenteditable 插入及粘贴纯文本内容

    本文主要介绍 div 标签设置  contenteditable = ' true ' 时,在光标位置插入输入的内容,或在光标位置粘贴纯文本内容.文中涉及知识,可参考以下: http://www.zh ...

  5. Spring-cloud(五) 使用Ribbon进行Restful请求

    写在前面 本文由markdown格式写成,为本人第一次这么写,排版可能会有点乱,还望各位海涵. 主要写的是使用Ribbon进行Restful请求,测试各个方法的使用,代码冗余较高,比较适合初学者,介意 ...

  6. 使用python实现人脸检测

    人脸检测 人脸检测使用到的技术是OpenCV,上一节已经介绍了OpenCV的环境安装,点击查看. 功能展示 识别一种图上的所有人的脸,并且标出人脸的位置,画出人眼以及嘴的位置,展示效果图如下: 多张脸 ...

  7. pyqt5 动画学习(三) 指定控件的移动轨迹

    这一篇来讲解自定义控件的移动轨迹 原理:我们采用QPainterPath先画一个弧线,然后加载一个物体让物体移动,设置100个关键帧,每个关键帧物体的坐标位置就是弧线的坐标位置,这样就能达到按照指定轨 ...

  8. Javasript设计模式之链式调用

    写过jquery的可能都知道,jquery里面可以很方便的使用以下代码: // 不使用链式调用 const element = $(ele); element.addClass('red'); ele ...

  9. SQL学习之查询

    查询实例: 1.创建数据库并使用: create database school; use school; 2.创建表并插入内容: create table student( Sno char(9) ...

  10. 线程基础(CLR via C#)

    1.线程基础  1.1.线程职责  线程的职责是对CPU进行虚拟化.Windows 为每个进程豆提供了该进程专用的线程(功能相当于一个CPU).应用程序的代码进入死循环,于那个代码关联的进程会&quo ...