`
hyshucom
  • 浏览: 808362 次
文章分类
社区版块
存档分类
最新评论

android service 权限问题

 
阅读更多

今天调哪个破 wifi, 老是有权限问题.....

1. 文件(夹)读写权限

init.rc 中建立test1 test2 test3 文件夹

mkdir /data/misc/test1 0770 root root

mkdir /data/misc/test2 0770 wifi wifi

mkdir /data/misc/test3 0770 system misc

其中

test1 目录的owner是root, group 也是root

test2 目录的owner是wifi , group 也是wifi

test3 目录的owner是system , group 是misc (任何用户都属于group misc)

service xxxx /system/bin/xxxx
user root
disabled
oneshot

service yyyy /system/bin/yyyy
user system
disabled
oneshot

service zzzz /system/bin/zzzz
user wifi
disabled
oneshot

结果:

xxxx 服务可以访问 test1, test2, test3

yyyy 服务可以访问 test3

zzzz 服务可以访问 test2, test3

Android 中mkdir 的定义

view plaincopy to clipboardprint?
int do_mkdir(int nargs, char **args)
{
mode_t mode = 0755;

/* mkdir <path> [mode] [owner] [group] */

if (nargs >= 3) {
mode = strtoul(args[2], 0, 8);
}

if (mkdir(args[1], mode)) {
return -errno;
}

if (nargs >= 4) {
uid_t uid = decode_uid(args[3]);
gid_t gid = -1;

if (nargs == 5) {
gid = decode_uid(args[4]);
}

if (chown(args[1], uid, gid)) {
return -errno;
}
}

return 0;
}
int do_mkdir(int nargs, char **args)
{
mode_t mode = 0755;

/* mkdir <path> [mode] [owner] [group] */

if (nargs >= 3) {
mode = strtoul(args[2], 0, 8);
}

if (mkdir(args[1], mode)) {
return -errno;
}

if (nargs >= 4) {
uid_t uid = decode_uid(args[3]);
gid_t gid = -1;

if (nargs == 5) {
gid = decode_uid(args[4]);
}

if (chown(args[1], uid, gid)) {
return -errno;
}
}

return 0;
}

2. Property 权限

Android Property 也是有权限的。

2.1 以前缀 ctl. 开头的控制属性, 设置前,Android 代码会调用函数check_control_perms()检查调用者的 user id 和 group id

view plaincopy to clipboardprint?
struct {
const char *service;
unsigned int uid;
unsigned int gid;
} control_perms[] = {
{ "dumpstate",AID_SHELL, AID_LOG },
{NULL, 0, 0 }
};

static int check_control_perms(const char *name, int uid, int gid) {
int i;
if (uid == AID_SYSTEM || uid == AID_ROOT)
return 1;

/* Search the ACL */
for (i = 0; control_perms[i].service; i++) {
if (strcmp(control_perms[i].service, name) == 0) {
if ((uid && control_perms[i].uid == uid) ||
(gid && control_perms[i].gid == gid)) {
return 1;
}
}
}
return 0;
}
struct {
const char *service;
unsigned int uid;
unsigned int gid;
} control_perms[] = {
{ "dumpstate",AID_SHELL, AID_LOG },
{NULL, 0, 0 }
};

static int check_control_perms(const char *name, int uid, int gid) {
int i;
if (uid == AID_SYSTEM || uid == AID_ROOT)
return 1;

/* Search the ACL */
for (i = 0; control_perms[i].service; i++) {
if (strcmp(control_perms[i].service, name) == 0) {
if ((uid && control_perms[i].uid == uid) ||
(gid && control_perms[i].gid == gid)) {
return 1;
}
}
}
return 0;
}

2.2 其它属性, 设置前,Android 代码会调用函数check_perms()检查调用者的 user id 和 group id

check_perms(msg.name, cr.uid, cr.gid)

view plaincopy to clipboardprint?
struct {
const char *prefix;
unsigned int uid;
unsigned int gid;
} property_perms[] = {
{ "net.rmnet0.", AID_RADIO, 0 },
{ "net.gprs.", AID_RADIO, 0 },
{ "net.ppp", AID_RADIO, 0 },
{ "ril.", AID_RADIO, 0 },
{ "gsm.", AID_RADIO, 0 },
{ "persist.radio", AID_RADIO, 0 },
{ "net.dns", AID_RADIO, 0 },
{ "net.", AID_SYSTEM, 0 },
{ "dev.", AID_SYSTEM, 0 },
{ "runtime.", AID_SYSTEM, 0 },
{ "hw.", AID_SYSTEM, 0 },
{ "sys.", AID_SYSTEM, 0 },
{ "service.", AID_SYSTEM, 0 },
{ "wlan.", AID_SYSTEM, 0 },
{ "dhcp.", AID_SYSTEM, 0 },
{ "dhcp.", AID_DHCP, 0 },
{ "vpn.", AID_SYSTEM, 0 },
{ "vpn.", AID_VPN, 0 },
{ "debug.", AID_SHELL, 0 },
{ "log.", AID_SHELL, 0 },
{ "service.adb.root", AID_SHELL, 0 },
{ "persist.sys.", AID_SYSTEM, 0 },
{ "persist.service.", AID_SYSTEM, 0 },
{ NULL, 0, 0 }
};

static int check_perms(const char *name, unsigned int uid, int gid)
{
int i;
if (uid == 0)
return 1;

if(!strncmp(name, "ro.", 3))
name +=3;

for (i = 0; property_perms[i].prefix; i++) {
int tmp;
if (strncmp(property_perms[i].prefix, name,
strlen(property_perms[i].prefix)) == 0) {
if ((uid && property_perms[i].uid == uid) ||
(gid && property_perms[i].gid == gid)) {
return 1;
}
}
}

return 0;
}
struct {
const char *prefix;
unsigned int uid;
unsigned int gid;
} property_perms[] = {
{ "net.rmnet0.", AID_RADIO, 0 },
{ "net.gprs.", AID_RADIO, 0 },
{ "net.ppp", AID_RADIO, 0 },
{ "ril.", AID_RADIO, 0 },
{ "gsm.", AID_RADIO, 0 },
{ "persist.radio", AID_RADIO, 0 },
{ "net.dns", AID_RADIO, 0 },
{ "net.", AID_SYSTEM, 0 },
{ "dev.", AID_SYSTEM, 0 },
{ "runtime.", AID_SYSTEM, 0 },
{ "hw.", AID_SYSTEM, 0 },
{ "sys.", AID_SYSTEM, 0 },
{ "service.", AID_SYSTEM, 0 },
{ "wlan.", AID_SYSTEM, 0 },
{ "dhcp.", AID_SYSTEM, 0 },
{ "dhcp.", AID_DHCP, 0 },
{ "vpn.", AID_SYSTEM, 0 },
{ "vpn.", AID_VPN, 0 },
{ "debug.", AID_SHELL, 0 },
{ "log.", AID_SHELL, 0 },
{ "service.adb.root", AID_SHELL, 0 },
{ "persist.sys.", AID_SYSTEM, 0 },
{ "persist.service.", AID_SYSTEM, 0 },
{ NULL, 0, 0 }
};

static int check_perms(const char *name, unsigned int uid, int gid)
{
int i;
if (uid == 0)
return 1;

if(!strncmp(name, "ro.", 3))
name +=3;

for (i = 0; property_perms[i].prefix; i++) {
int tmp;
if (strncmp(property_perms[i].prefix, name,
strlen(property_perms[i].prefix)) == 0) {
if ((uid && property_perms[i].uid == uid) ||
(gid && property_perms[i].gid == gid)) {
return 1;
}
}
}

return 0;
}

从代码中可以看到, 任何不以property_perms[] 中定义的前缀开头的property 是

无法被除root以外的用户访问的,包括system用户。

3. 最后补充Android 的uid gid 定义

view plaincopy to clipboardprint?
#define AID_ROOT 0 /* traditional unix root user */

#define AID_SYSTEM 1000 /* system server */

#define AID_RADIO 1001 /* telephony subsystem, RIL */
#define AID_BLUETOOTH 1002 /* bluetooth subsystem */
#define AID_GRAPHICS 1003 /* graphics devices */
#define AID_INPUT 1004 /* input devices */
#define AID_AUDIO 1005 /* audio devices */
#define AID_CAMERA 1006 /* camera devices */
#define AID_LOG 1007 /* log devices */
#define AID_COMPASS 1008 /* compass device */
#define AID_MOUNT 1009 /* mountd socket */
#define AID_WIFI 1010 /* wifi subsystem */
#define AID_ADB 1011 /* android debug bridge (adbd) */
#define AID_INSTALL 1012 /* group for installing packages */
#define AID_MEDIA 1013 /* mediaserver process */
#define AID_DHCP 1014 /* dhcp client */
#define AID_SDCARD_RW 1015 /* external storage write access */
#define AID_VPN 1016 /* vpn system */
#define AID_KEYSTORE 1017 /* keystore subsystem */

#define AID_SHELL 2000 /* adb and debug shell user */
#define AID_CACHE 2001 /* cache access */
#define AID_DIAG 2002 /* access to diagnostic resources */

/* The 3000 series are intended for use as supplemental group id's only.
* They indicate special Android capabilities that the kernel is aware of. */
#define AID_NET_BT_ADMIN 3001 /* bluetooth: create any socket */
#define AID_NET_BT 3002 /* bluetooth: create sco, rfcomm or l2cap sockets */
#define AID_INET 3003 /* can create AF_INET and AF_INET6 sockets */
#define AID_NET_RAW 3004 /* can create raw INET sockets */
#define AID_NET_ADMIN 3005 /* can configure interfaces and routing tables. */

#define AID_MISC 9998 /* access to misc storage */
#define AID_NOBODY 9999

#define AID_APP 10000 /* first app user */
#define AID_ROOT 0 /* traditional unix root user */

#define AID_SYSTEM 1000 /* system server */

#define AID_RADIO 1001 /* telephony subsystem, RIL */
#define AID_BLUETOOTH 1002 /* bluetooth subsystem */
#define AID_GRAPHICS 1003 /* graphics devices */
#define AID_INPUT 1004 /* input devices */
#define AID_AUDIO 1005 /* audio devices */
#define AID_CAMERA 1006 /* camera devices */
#define AID_LOG 1007 /* log devices */
#define AID_COMPASS 1008 /* compass device */
#define AID_MOUNT 1009 /* mountd socket */
#define AID_WIFI 1010 /* wifi subsystem */
#define AID_ADB 1011 /* android debug bridge (adbd) */
#define AID_INSTALL 1012 /* group for installing packages */
#define AID_MEDIA 1013 /* mediaserver process */
#define AID_DHCP 1014 /* dhcp client */
#define AID_SDCARD_RW 1015 /* external storage write access */
#define AID_VPN 1016 /* vpn system */
#define AID_KEYSTORE 1017 /* keystore subsystem */

#define AID_SHELL 2000 /* adb and debug shell user */
#define AID_CACHE 2001 /* cache access */
#define AID_DIAG 2002 /* access to diagnostic resources */

/* The 3000 series are intended for use as supplemental group id's only.
* They indicate special Android capabilities that the kernel is aware of. */
#define AID_NET_BT_ADMIN 3001 /* bluetooth: create any socket */
#define AID_NET_BT 3002 /* bluetooth: create sco, rfcomm or l2cap sockets */
#define AID_INET 3003 /* can create AF_INET and AF_INET6 sockets */
#define AID_NET_RAW 3004 /* can create raw INET sockets */
#define AID_NET_ADMIN 3005 /* can configure interfaces and routing tables. */

#define AID_MISC 9998 /* access to misc storage */
#define AID_NOBODY 9999

#define AID_APP 10000 /* first app user */

可见root (AID_ROOT = 0) 的权限最高, app (AID_APP = 10000) 权限最低, misc (AID_MISC = 9998) 权限倒数第三低。

所以#1 中描述的目录test3的group 属性设置成了 misc, 则除了 app/nobody 这两个用户,

android系统中其它所有用户都有该目录的group权限!


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/stevenliyong/archive/2010/03/03/5343085.aspx

分享到:
评论

相关推荐

    Android 6.0 权限 动态注册

    android6.0后,对于一些特别敏感的权限,开发者必须在程序中进行声明。 具体见: http://blog.csdn.net/q610098308/article/details/52728858

    Android修改系统文件访问权限

    Android修改系统文件访问权限,在init.rc里配置service,通过启动service去执行脚本,在脚本里做修改文件访问权限操作。应用通过jni启动service。

    Android代码-Android悬浮窗实现(含8.0权限适配)。

    Android悬浮窗实现(含8.0权限适配) 序言 前些日子跟朋友聊天,朋友Z果粉,前些天更新了微信,说微信出了个好方便的功能啊,我问是啥功能啊,看看我大Android有没有,他说现在阅读公众号文章如果有人给你发微信你...

    android自定义权限

    该资源包含了一个android自定义的权限,包含两个工程security和securitytest,其中,security声明自定义的权限,在securitytest中利用这些自定义的权限,包含了自定义的activity,service,contentprovider,发送和...

    Android 开机自动启动一个Service

    Google在更新Android8.0后对Service的权限越发收紧。导致目前想要启动服务必需实现服务的前台化,打开应用才能顺利启动service,否则在服务启动5秒后,系统将自动报错,会弹出一个提示窗口。实际测试得系统的app才能...

    android应用获得执行root权限动作__socket_service

    设备系统定制,让应用获得执行root权限动作,利用socket在底层启动一个service(root权限的哦,你懂得)。现在4.4以后root越发困难了,直接集成源码的su命令是不行的。

    Android代码-android-UCToast

    睡不着起不来的万先生 的 Android无需权限显示悬浮窗, 兼谈逆向分析app 文中提到,type 为 WindowManager.LayoutParams.TYPE_TOAST 的 WindowManager.LayoutParam 无需权限,即可让 View 显示。 本项目模拟实现该...

    Android权限处理

    PermissionsDispatcher使用了编译时解析注解的方式,通过apt自动生成.class方式帮我们去写申请权限的逻辑,很好很强大,并且适配了小米手机,但是它也不支持Service中去申请权限。考虑到我们项目中的应用场景并且...

    android backup service

    如何避免访问app数据遇到权限问题可以参考后面BackupAgent调用原理。 作为开发者,其中App端可以控制是否支持备份的开关,和具体的备份方式。 Framework平台可以客制化具体存储位置,默认有GMS支持情况下会备份到...

    详解Android 8.1.0 Service 中 弹出 Dialog的方法

    当前是基于 Android 8.1.0 的 Service 中弹 Dialog。  首先,就是要在功能清单列表中声明权限,以下两个都必须声明: &lt;uses android:name=android.permission.SYSTEM_ALERT_WINDOW/&gt;&lt;!--这行代码必须存在,否则...

    疯狂Android讲义源代码2

    1.5.5 应用程序权限说明 1.6 Android应用的基本组件介绍 1.6.1 Activity和View 1.6.2 Service 1.6.3 BroadcastReceiver 1.6.4 ContentProvider 1.6.5 Intent和IntentFilter 1.7 本章小结 第2章 Android应用...

    Android 天气APP(一)开发准备

    除添加service组件外,使用定位SDK还需添加如下权限: 4.权限管理(简单了解) 在Android6.0之前权限只需要静态配置即可使用,而在6.0之后需要动态申请权限, Google 在Android 6.0时提出了运行时...

    android的服务

    为了处理这种后台进程,Android引入了Service的概念。Service在Android中是一种长生命周期的组件,它不实现任何用户界面。最常见的例子如:媒体播放器程序,它可以在转到后台运行的时候仍然能保持播放歌曲;或者如...

    《Android系统源代码情景分析》

    2.3.4 处理硬件设备访问权限问题 2.4 开发Android硬件访问服务 2.4.1 定义硬件访问服务接口 2.4.2 实现硬件访问服务 2.4.3 实现硬件访问服务的JNI方法 2.4.4 启动硬件访问服务 2.5 开发Android应用程序...

    Android MIUI通知类短信权限的坑

    然后想实现自动填短信验证码,不好意识,我MIUI自定义了一个通知类短信权限(Service_SMS),你不知道怎么申请,也不知道怎么在manifest注册。所以你没有权,也限监听不到的。我也不知道这个权限完整的名字叫什么,看...

    Rk3399 获取系统ROOT权限补丁7.1与8.1.rar

    2.在device/rockchip/common目录下拷贝对应的文件夹rootservice (注意文件: rootservice/rootservice.mk ) 3.parameter.txt文件中加入androidboot.selinux=permissive (修改路径:source/device/rockchip/...

    BaiduMap_AndroidSDK Sample_demo

    其次,在Android 6.0以后引入了运行时权限,因此有些权限需要在代码中进行判断和申请。 4.2、添加AK信息 在应用的AndroidManifest.xml中,需要添加之前申请过的AK信息,否则访问服务器时,会返回错误信息。 添加...

    Android中获取IMEI码的方法

    1.加入权限在manifest.xml文件中要添加 &lt;uses android:name=”android.permission.READ_PHONE_STATE”&gt;2.代码 代码如下:package net.sunniwell.app; import android.app.Activity; import android.os.Bundle; ...

Global site tag (gtag.js) - Google Analytics