资 讯

网站建设、app开发、微信开发、网络营销知识汇聚

We provide professional and all-round information services to enterprises from all levels and angles

开发android app时千万不能大意的权限攻击问题
admin 2018-06-15

Android权限机制是 Android系统提供的基础安全措施。本节将介绍 Android权限的工
作机制,以及如何对其进行攻击。
11.3.1 Android权限检查机制
Android系统通过权限来控制软件想要使用的功能,程序默认情况下没有权限去进行特
定的操作,例如打电话、发短信,软件要想进行这些操作必须显式地申请相应的权限。如果
没有申请权限而执行特定的操作,软件在运行通常会抛出一个 Security Exception异常。申
请权限的方法很简单,只需要在程序的 AndroidManifest.xml文件中添加相应的权限代码即
可。例如在序中使用发送短信功能,需要在 AndroidManifest xml中添加下面这行代码
suses-permission android: name="android. permission. SEND SMS"/>
所有可以使用的权限位于系统源码的 frameworks base dataletclplatform.xml文件中。其
中的权限可以分为两大类:直接读写设的底层(low- -level)权限与间接读写设备的高层
(high- -level)权限
android. permission. INTERNET权限属于底层权限,它的声明如下。



name指定了权限的名称,gid指定了所关联的用户组。 android. permission. INTERNET权
限关联了inet用户组,当软件中声明了该限后,运行时的进程所属的用户就会添加到inet
用户组,我们可以编写下面的代码进行测试
private String getMyID()
String str = null
try t
java. lang Processprocess=Runtime. getRuntime().exec("id")i
Inputstream input process. getInputstream()
BufferedReader in = new BufferedReader(
new InputStreamReader(process. getInputstream(), "GBK"));
str -in readLine();
input.close()
catch (IOException e) t
e printstackTrace():
}
return str
Runtime etRuntimeO)执行的系统id命令用于输当前用户的uid、gid以及用户组信息。
运行本小节的 Permission实例,效果如图113所示,可以发现当前程序的用户已经属于inet
组了
高层权限与底层权限不同,高层权限是通过 Framework层的权限检查代码来进行权限控
制的。例如下面的代码。
private boolean CheckNetworkstate(
boolean flag= false
ConnectivityManager manager =(ConnectivityManager)getSystemservice(
Context. CONNECTIVIIY SERVICE)
if (manager. getActiveNetworkInfo() !=null)
flag =manager. getActiveNetworkInfo().isAvailable()
return flac
CheckNetwork State方法用于检查当前网络状态否可用,其中调用的 ConnectivityManager
类的 getActiveNctworkInfo0方法就需要使用到
android. permission ACCESS NETWORK STATE
权限,该权限就属于高层权限。我们来看一下
getActiveNetworkInfoO方法的实现
public NetworktnEo getActiveNetworkInfo)(
enforceAccessPermission()
final int uid =Binder. getCallingUid();
return getE tworkInfo(mActiveDefaul tNetwork, uid) i
}
en forceAccessPermission()用于执行权限检查,它的代码如下
private void enforceAccessPermission ()
cOntext.cnfozceCalliiiyO1SelEPermlsy1on
android. Manifest permission ACCESS NETWORK STATE
ConnectivityService")
}
原来是调用 enforce CallingOrSelfPermissionO.方法来检查的,该方法的作用是检查是否声
明了访问网络状态的权限 I android. permission ACCESS NETWORK STATE,如果没有就抛出
Security Exception安全异常中止程序。其实还有很多其它的权限检查方法,它们都是由继承
自 Context的 Contextlmpl类来实现的。根据检查的内容与处理的方法不同,可以将权限检
查方法分为以下几类
检查权限并返回结果型
public int checkpermission(String permission, int pid, int uid)
public int checkCalling Permission(string permission)
public int checkca1lingorselfPermission(String permission)
检查权限失败抛出异常型
public void enforcePermission(String permission, int pid, int uid, String message)
public void entorceca11ingPermission(String permission
String message)
public void enforceCallingorSel fPermission( String permission, String message)
Uri权限控制型
public void grantUripermission(String toPackage, Uri uri, int modePlags
public void revokeUripermission(Uri uri. int modeFlags)
Uri权限检查并返回结果型
public int checkUriPermission(Uri uriint pid. int uid, int modeFlags
public int checkcallingUriPermission(Uri uri, int modeFlags)
public int checkCallingorselfUriPermission(Uri uri, int modeFlags)
public int checkUriPermission(Uri uri
String readpermission
String writePermission, int pid, int uid, int modeFlags)
Uri权限检查失败抛出异常型
public void en forceUriPermission(Uri uri, int pid, int uid, int modeFlags,
String message)
public void en forcecallingUri Permission(Uri uri int modeFlags, String
message)
public void enforcecallingorselfUriPermission(Uri uri, int modeFlags, String
message)
public void enforceUriPermission( Uri uri, String readPermission, String
wrri tePermlssion
int pid, int uid. int modeRlags, String message)
每个权限检查的控制粒度与处理方法都不,根据处理的对象不同,它们又可以分为一
般的权限检查与Uri的权限检查两大类。权限检查的对象可以是 Permission字符串匹配、pid、
td、Uri。我们接着上面查看 enforce Callin OrSelfPermissionO方法的代码
public void enforceCallingorselfpermission(
String permission, String message) t
enforce(permission
checkcal1ingorsel pErmissi on(permission)
true
Binder. getcallinguid()
message)
enforce方法判断 checkCallingOrSelfPermission的权限检查结果,如果结果不为
PackageManager. PERMISSION GRANTED,则抛出 SecurityException异常。代码如下。
private void enforce(
string permission, int resultofCheck
boolean sel foo, int uid, String message) t
if ( resultofCheck ! = PackageManager PERMISSION GRANTED)
throw new SecurityException(
(message ! =null (message + n: ") w m)+
(selfr'oo
Neither user w+ uid+ w nor current process has
" User "+uid +"does not have ")+
permission
}
其它权限检查方法的代码笔者就不讨论了,有兴的读者可以自己阅读 Android系统源
码中的 Contextlmpl. java文件
11.3.2串谋权限攻击
Android程序中资源的访问包括使用 Framework提供的功能与访问其它程序的组件,前
者是通过系统提供的权限机制进行控制的,后者是通过自定义权限控制的。正常情况下,没
有声明特定的访问权限,就无法访问这些资源。但通过其它程序中可访问的 Android组件,
就有可能突破这种访问控制,从而提升程序本身的权限,这种权限提升的攻击方式笔者在此
将它称为串谋权限攻击。
串谋权限攻击的原理如图114所示。程序1本身无任何权限,它的组件2想要“联网
下载文件并保存到SD卡上”,这在正常情况是不允许的,程序2拥有联网与写SD卡的权
限,并实现了文件下载与保存的功能,此时程序1的组件2可以通过访问程序2的组件1来
实现文件的下载,从而突破 Android系统的权限控制机制
DownloadManager拥有下载文件与保存到SD卡上的权限,是正规的“有权”一族。它
的 AndroidManifest. xml文件中有如下两行权限的声明
cuses-permission android: name="android.permission WRITE EXTERNAL, STORAGE/>


saction android: name="com. droider download">


DownloadReceiver响应 Action为“com. broider. download”的广播,然后访问 Intent指定
的URL地址去下载文件,相应的广播响应代码如下。
public void onRecelve(Context context, Intent intent)
if (intent. getAction()equals ("com. droider download).) t
string url -intent. gotEattrao(). getetring(murl")
String fileName intent. getExtras(). get string(filename")
Toast.makeText(context, url, Toast. LENGTH SHORT)show()
try
download1e(ur1,fi1 eName);//下载文件
catch (IOException e)
e. printstackrrace(
}
需要下载的文件是通过url字符串传递过来的,保存的文件名则是 filename传递过来的
下面来看看我们的攻击程序 EviIDownloader,它什么权限都没有,只有一段发送文件下载请
求的代码。
btnl. setonClickListener (new OnclickListener(
OVerride
public void onClick(View v)[
Intent intent new Intent (
//创建 Intent对象
intent. setAction ("com. droider download");
intent. putExtra("url
http: //developer. android. com/images/home/android-iellybean. png" )
/要下载的文件URI
string fileName =ib pna m
//保存的文件名
intent. putExtra("filename", fileName
sendBroadcast( intent);/发送广播
}
);
当 EviIDownloader实例的下载文件按钮被点,以上代码就会执行, DownloadReceiver
收到广播后就开始下载文件,如图11-6所示,一次完美的串谋攻击就完成了
11.3.3权限攻击检测
串谋攻击主要针对 Android系统的可访问组件,因此防范的方法是开发人员在编写
代码时为组件添加访问控制权限。但很多时候,我们不具备源代码的访问权限,尤其是
软件测试人员,他们的职责是找出软件中潜在的bug与安全隐患,在测试大量apk时,
很难通过直接运行或反编译apk找出安全问题所在。这种情况就需要借助工具来完成安
全检测了。
笔者在此推荐一款开源的 Android平台安全评估工具 Mercury,它除了能检查组件权限
提升漏洞外,还能检测 Android系统安全漏洞该工具的项目主页为 https: //github. com/mwrlabs/
mercury,目前最新版本为1.1,官方编译好的文件的下载地址为htt:/ labs. mwTinfosecurity.om/
assets/299/mercury-vl 1 zip
下面我们来看看该工具是如何检测组件权限提升漏洞的。将下载好的 mercury-v1.zip
解压,然后在AVD上安装 mercury- server. apk,如果是在手机上安装,确保手机能够获取rt
权限。安装好后启动 Mercury程序,点击界面上的OF按钮启动 Mercury服务,此时按钮
会切换为ON状态,效果如图11-7所示
PC端的 Mcrcury客户端是通过 Socket与AVD上的服务端通讯的,在启动客户端前,需
要在PC端的命令提示符下执行如下命令开启端口转发。
adb forward tcp: 31415 tcp: 31415
31415是 Mercury使用的默认端口。命令执行完后就可以启动 Mercury客户端了,在命
令提示符下执行 mercury.py会进入 Mercur的 Shell环境,如图11-8所示。
在 Shell环境下执行“ connect127.0.1”来连接服务端,连接成功后输入help查看可以
使用的命令。以上一小节的串谋攻击为例,我们需要查看的是没有设置权限的广播接收者
因此执行 broadcast命令,执行完后输入elp查看可以使用的命令( Mercury所有的命令都
支持使用help查看其使用帮助),查看所有的广播接收者可以执行info命令,下面是笔者执
行info的输出信息。
*mercuryfbroadcast> info
Package name: com. android launcher
Receiyer: com, android. launcher. InstallShortcutReceiver
Required Permission: com. android launcher. permission. INSTALL SHORTCUT
Package name: com. android launcher
Receiver: com. android. launcher. UninstallShortcutReceiver
Reguired Permission: com. android launcher. permission. UNINSTALL SHORTCUT
Package name: com. android. quicksearchbox
Receiver: com. android. quicksearchbox. CorporaUpdateReceiver
Reouired Permission: null
Package name: com. android. deskclock
Receiver: com. android alarmclock. AnalogApphidgetProvider
Required Permission: null
Package name: com. droider downloadmanager
Receiver: com. droider. downloadmanager. DownloadReceiver
Reguired Permission: null
从输出信息中可以一眼看出, downloadmanager程序的 DownloadReceiver广播接收者不
需要权限就可以调用。下面我们使用send命令发送一条 Action为“com. droid. download”
的广播,来模拟一次串谋权限攻击。执行以下命令(注意是1行):
send --action com. droider. download-extrastring
"url="http: //developer. android. com/images/home/android-jellybean. png
filename="ib. png
命令执行后AVD上的 downloadmanage有了反应,效果如图11-9所示,说明此时发现
了一处安全漏洞。
Mercury I的其它功能笔者在此就不介绍了,读可以自己慢慢去摸索。至于如何防范权
限攻击,我们将在下一小节 Android组件安全中介绍。好了,码字不易,希望大家有上海app开发需求的可以找我们

  • 上一篇:资深app开发工程师为你分析 Android 手机提取root权限的危害
  • 下一篇:app开发四大组件之-Activity
  • © 2011-2020 www.keyrey.com 上海科睿网络科技有限公司 © 版权所有 沪ICP备12032097号-1
    友情链接 : 上海app开发 app开发公司 app制作 手机软件开发 手机软件开发公司 小程序开发 上海网站制作公司
    QQ在线咨询

    上海app开发QQ在线咨询 上海app开发QQ在线咨询
    电话咨询
    400-877-9280 app开发公司电话咨询
    即时在线咨询 手机软件开发即时在线咨询
    微信扫一扫
    添加app制作微信 上海网站制作公司微信
    科睿网络-互联网开发营销专家

    凡事有交代 件件有着落 事事有回应

    立即获取为您量身定制的开发营销方案

    咨询热线 400-877-9280