Android手机与SIM卡通信的途经的研究报告

摘要

摘要
课题名称 STK信息获取
过程成果 1.Android系统中提供了SIM操作的相关API,但是应用程序需要相当高的权限才可以使用,实施上有很大问题。
2.Android系统中提供了查询、增删修改SIM中通讯录的函数,但是并不是直接读写。通过通讯录操作进行签名存在安全问题。
课题报告 详见下文
备注 -

1、常规途经:借助Android中RIL框架与SIM通信

概述:

利用Android系统中提供的RIL框架,通过系统中的逻辑手机对象的相关API对SIM进行STK相关操作。 操作通路如图:

说明:

  1. 可以收发AT命令是非常高的权限,因为AT命令是手机操作系统与SIM卡操作系统唯一的通路。可以随意收发AT命令意味着应用程序有了完全控制手机通信功能的能力,从安全角度来说,只有手机厂商才能获得这一权限,不会简单的授予第三应用程序。
  2. 不通过获取GSMPhone对象而直接通过socket与RIL-c端通信应该也是需要系统权限的,经测试:普通APK程序连接RIL的socket会返回访问被拒绝的错误,而获取了和系统电话应用相同权限的APK程序则可以正常连接。
  3. 在Java中通过JNI调用Native来操作设备同样是需要系统权限的,而Native的权限和Java APK的权限是一样的,没有系统权限同样不能操作SIM卡设备。
  4. 要获取和系统电话应用相同的权限,需要在应用程序的属性配置文件AndroidManifest中设置 android:sharedUserId=”android.uid.phone”和 android:process=”com.android.phone”。但是这样的应用程序使用普通密钥签名系统是拒绝安装的,必须使用对应系统的系 统密钥进行签名。
  5. 关于系统密钥,每个厂家都有经过自己定制的Android系统,甚至不同型号的手机,不同的系统版本都会造成系统密钥不同,对软件进行系统级签名,必须是 一一对应的才有效。所以此类软件一般称为系统软件,是随厂家的Android系统Rom绑定一起发布的,或者是随厂商的升级补丁发布。此种签名不适合应用 在第三方应用程序上。

优势:

是正规的操作SIM卡的途经,具有很高的安全性,可定制性高,效率高。

缺陷:

需要的到各手机厂商的系统签名密钥文件,而且各个厂商的手机系统密钥文件也是不同的,发布的软件很难维护,必须一一配配用户的手机系统。

2、非常规途经:在SIM卡中将特定的通讯录操作作为操作命令

概述:

把签名相关命令伪装成通讯录的读取、写入操作,通过特殊的通讯录操作完成签名操作。 比如,读取姓名为”签名_123”的用户通讯录,返回的电话号码为”123”的签名。

说明:

  1. Android系统中读取SIM卡中的通讯录信息,是通过IccProvider模块实现的,对应用层暴露的接口类似于数据库操作,并不是直接操作SIM卡通讯录。
  2. 限制:姓名最长14个英文字符、电话号码最长20个英文字符。SIM卡中通讯录只有姓名、电话号码两个字段。

优势:

通用性强,把命令实现在通讯录中,伪装为标准的通讯录操作,可以屏蔽手机操作系统的约束。软件维护相对容易。

缺陷:

签名接口一旦泄露,会有很多安全问题,因为接口是标准的,只要有操作通讯录的权限就可以进行签名操作。由于通讯录字符数量的限制,加密签名强度受限。 如果使用此方案,在签名接口保护上还需加上另外的安全机制。

3、相关资料

RIL简介

RIL是Radio Interface Layer的缩写。
目前的智能机在硬件上多采用双cpu的架构,一个是基带处理器,主要处理数字信号、语音信号的编码解码以及GSM通信协议,另一个是应用处理器,运行操作系统和各种应用程序。
基带处理器、射频和其它外围芯片作为一个模块,成为GSM/GPRS modem,提供AT命令接口。应用处理器通过AT命令集与带GPRS功能的无线通讯模块通信,提供SMS、Voice Call及网络应用的最底层支持。

Android 中的RIL

android的ril位于应用程序框架与内核之间,分成了两个部分,一个部分是rild,它负责socket与应用程序框架进行通信。另外一个部分是 Vendor RIL,这个部分负责向下是通过两种方式与radio进行通信,它们是直接与radio通信的AT指令通道和用于传输包数据的通道,数据通道用于手机的上 网功能。
对于RIL的java框架部分,也被分成了两个部分,一个是RIL模块,这个模块主要用于与下层的rild进行通信,另外一个是Phone模块,这个模块直接暴露电话功能接口给应用开发用户,供他们调用以进行电话功能的实现。
RIL提供了语音、数据、短信、SIM卡管理以及STK应用的功能,开发模式是需要针对不同的GSM模块进行不同的GSM驱动开发,公用的部分google做好了,特定的部分需要手机厂商自己定制,这样做可以大大地提高开发效率。
RIL跟上层通讯主要采用两种方式,一种是通过Socket发送与接收消息的方式来实现,另外一种方式就是直接通过TCP/IP直接访问内核中的shared memory,进行RPC调用,这种方式主要应用在数据模式上。

Android的Phone模块

Android通过暴露Phone模块来供上层应用程序用户使用电话功能相关的接口。它为用户提供了诸如电话呼叫,短信息,SIM卡管理之类的接口调用。 它的核心部分是类GSMPhone,这个是Gsm的电话实现,需要通过PhoneFactory获取这个GSMPhone。
GSMPhone并不是直接提供接口给上层用户使用,而是通过另外一个管理类TelephonyManager来供应用程序用户使用。类TelephonyManager实现了android的电话相关操作,但并不包括STK应用相关的API。

Android程序的安全系统简述

Android框架是基于Linux内核构建,所以Android安全系统也是基于Linux的安全架构建立的。在Linux安全系统中,用户和组起着重要的作用,Linux中所有的资源给不同的用户和用户组设置了不同的访问属性。
在Android系统中,系统为每一个应用程序(apk)创建了一个用户和组。这个用户和组都是受限用户,不能访问系统的数据,只能访问自己的文件和目录,也不能访问其他应用程序的数据。这样设计尽可能地保护了应用程序的私有数据,增强了系统的安全性和健壮性。

获取System权限

但是有一些应用程序是需要访问一些系统资源的。比如Setting程序,他就需要访问wiffi,在系统中创建删除文件等等操作。Android通过一定途径可以获得system权限。获得system用户权限,需要以下步骤:

  1. 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId=“android.uid.system”这个属性。
  2. 修改Android.mk文件中加入LOCAL_CERTIFICATE := platform这一行
  3. 使用mm命令来编译,生成的apk就有系统的权限了。(一般在源码环境下编译)

这样生成的程序是由系统密钥签名过的程序,而系统密钥文件是在各个厂商的Android源码中的,处于安全的考虑,这个密钥文件时很难从厂商那里得到的,且各大厂商的密钥文件不会是相同的。

获取root权限

一般情况下system用户权限就已经够用了,system用户可以在系统中创建和删除文件,访问设备等等。但是有些情况下system权限还是不够的。 比如:设置网卡IP地址,ifconfig命令是需要root权限的。在Android下面应用程序是没有可能拿到root权限的。但是如果应用程序需要 root权限,就只能想办法绕过去。以设置网卡IP地址为例,root权限下面命令为:ifconfig eth0 192.168.1.188。
在普通用户或者system用户权限下面这条命令是不起作用的,但是不会返回失败和异常,目前有下面两个方法可以现这个功能。

  1. 系统启动的时候init进程创建一个后台进程,该进程处于root用户权限下面。用来监听系统中应用程序的请求(可以用socket实现),并代其完成。这样应用程序就可以执行root用户权限的任务了。
  2. 实现一个虚拟的设备,该设备的功能就是在内核态帮应用程序执行相应的命令。Linux内核态没有权限的问题了。

在Android获得root权限是需要一些前提的:

  1. 必须是Android系统开发人员。
  2. 应用程序必须要获得system权限。

这样可以防止root权限被应用程序无限制的使用,最终危及Android系统安全。

你可能感兴趣的:(android)