昨天看到Google发布的Android M 终于带来了喜闻乐见的权限管理机制,突然想到以前Android开发都要添加的那一堆权限是什么鬼,于是决定研究一下,写点总结。
首先是我之前对Linux的权限理解还停留在文件的rwx上面,最多还知道一个suid和guid可以用来提权,例如操作passwd等。Google了一下,搜到这篇文章:http://blog.chinaunix.net/uid-27105712-id-3349522.html , 好吧,原来还有一个叫进程的权限,于是决定把这个模型捋一下。
Linux本艰深,但如果把一些概念投射到现实世界中,会好理解很多。
简单来说,把Linux用户看做现实中的一个真正的“人”,Linux文件看做属于这个“人”的财产。
1. Linux 用户当做“人”
首先我们先敲入以下命令:id
king@king-B85-HD3 ~ $ id
uid=1000(king) gid=1000(king) groups=1000(king),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),110(sambashare)
这个命令给出我这个“人”作为一个人的所有身份,我的名字叫king,我加入了一个叫king的组织(主group),除了king这个组织外,我还加入了4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),108(lpadmin),110(sambashare)
等若干组织(附加group)。当然一般情况下,gid那一部分应该取另一名字,代表一个群体,比如啥“某party”,“单身狗”之类,本人无党派人士,自然uid和gid都叫做king
了,king这个group也只有我一个人。
上面这些话如果翻译成大白话来说,可以这么说,我叫奥巴马(uid),我是民主党的(主group,gid),我除了民族党,我还是北约成员,亚太合作组织成员, G8成员,联合国成员,电信联盟成员……(各种groups)。
2. Linux 文件当做属于某个人或组织的财产
Linux下一切皆是文件,像什么硬件节点啊,管道啊,甚至socket什么统统都是文件,这就简化了模型,我们直接把Linux 文件当做属于某个人或组织的财产。
为什么这样理解呢?我们先看一下Linux文件的权限:
king@king-B85-HD3 ~ $ ll
total 136864
drwxr-xr-x 50 king king 4096 5月 30 08:27 .
drwxr-xr-x 3 root root 4096 9月 19 2014 ..
drwx------ 3 king king 4096 9月 20 2014 .adobe
drwxr-xr-x 4 king king 4096 3月 29 23:28 .android
-rw------- 1 king king 6650 5月 27 12:34 .bash_history
这条命令基本显示了一个文件作为一个“财产”该具有的信息:
先看第三列和第四列,显示这个“财产”的所有者和所有组织,加入奥巴马有一辆车,那么这个车的所有者是奥巴马,所有组织是民主党
最左边的那一栏显示了文件的类型和权限。
第一个字母代表文件类型,Linux下共有七种文件类型,我的背发是,b、c、d、p、l、f、s,如下表:
符号 | 类型 |
---|---|
b | 块设备 |
c | 字符设备 |
d | 目录、文件夹 |
p | 管道 |
l | 链接 |
- | 普通文件 |
s | socket套接字 |
另外九个字母分别代表owner、group、other三种人对于这个“财产”的权限, rwx分别代表读写执行,所以3*3=9是九个位。
举个例子:假如奥巴马有辆车,它的权限是:rwxr-xr–
这辆车对于奥巴马本人来说,具有rwx权限;对于其它民主党人士来说,具有人r-x权限;而对于其它任何屁民来说,只有人r–权限。
扩展来说,对于这辆车:
对于奥巴马(owner : rwx):
奥巴马可以read,即完全查看这辆车的内部构造,甚至照着模样copy出一辆新车;
奥巴马可以write,比如改装这辆车;
奥巴马可以execute,奥巴马能开;
对于奥巴马的组织(group : r-x)民主党其它人士,比如他媳妇米歇尔:
这辆车可以read,比如可复制;
这辆车不能write,不允许改装,媳妇也不行,领导也不行;
这辆车可以execute, 即米歇尔可以开着跑;
而对于我等其它屁民(other : r–):
我们不能改装也不能开,不过还好,我们有read的权限,我们可以copy出一辆来自己改装自己开。对,Linux下就是这么神奇,只有你有read权限,哪怕对象是奥巴马,你也可以把他全家都copy过来。
讲了那么多,基本上可以把Linux的用户和文件和现实中人和财产映射起来.
然后,Linux下有7种文件,其中只有目录和普通文件的execute位有意义。对于普通文件,如果它具有可执行权限,意味着它可以跑起来形成一个“进程”,而对于目录来说,可执行位代表着这个目录可以被对应的用户通过文件系统“使用”,比如cd进去。下面贴一段描述:
在linux里面,目录也是一个文件。权限设置方法与普通文件一样。
目录的可执行权限:目录无所谓执行不执行,目录只能否被开启(也称作“遍历”或“搜索”)
对目录的执行权限不仅意味着查看目录下文件名还允许查看文件的其它信息如文件大小、修改时间。
说的再详细些就是这样的
Linux的权限不是很细致,只有RWX三种
r(Read,读取):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。
w(Write,写入):对文件而言,具有新增,修改,删除文件内容的权限;对目录来说,具有新建,删除,修改,移动目录内文件的权限。
x(eXecute,执行):对文件而言,具有执行文件的权限;对目录了来说该用户具有进入目录的权限。
1、目录的只读访问不允许使用cd进入目录,必须要有执行的权限才能进入。
2、只有执行权限只能进入目录,不能看到目录下的内容,要想看到目录下的文件名和目录名,需要可读权限。
3、一个文件能不能被删除,主要看该文件所在的目录对用户是否具有写权限,如果目录对用户没有写权限,则该目录下的所有文件都不能被删除,文件所有者除外
4、目录的w位不设置,即使你拥有目录种某文件的w权限也不能写该文件
如果一个用户,他不能跑起一个进程的话,那么就意味着它什么也干不了,比如他不能上网,不能聊QQ,不能搬砖……而一个进程,又是通过一个具有可执行权限的普通文件跑起来的,所以,我会把普通文件再分一下,能跑的财产和不能跑的财产,自己脑补奥巴马有一辆车子和一个车库……,而一个用户,也之有跑起来一个进程,才能够干一些事情,其中包括访问那些不能跑的财产, 比如奥巴马只有开上车,才能去使用他的车库。换句话说,如果奥巴马不跑起来一个进程,他自己的房子也访问不了,他还必须写一个”访问房子“的程序,给它可执行权限,还要把它跑起才行。再换句话说,奥巴马只有跑起了一个可执行程序,他才是奥巴马,他才可以去访问那些标记owner为奥巴马的财产。
3. Linux的suid和guid权限
前面有说到Linux具有rwx三种权限,其实Linux 还赢了两个特殊的权限,叫做suid和guid ,如下图:
king@king-B85-HD3 ~/foo/bar $ chmod 6744 *
king@king-B85-HD3 ~/foo/bar $ ll
total 12
drwxr-xr-x 2 king king 4096 5月 30 10:14 .
drwxr-xr-x 6 king king 4096 5月 30 10:03 ..
-rwsr-Sr-- 1 king king 3 5月 30 10:14 1
-rwsr-Sr-- 1 king king 0 5月 30 10:00 2
-rwsr-Sr-- 1 king king 0 5月 30 10:00 3
话说原本该写着x地方怎么变成了小s和大S ?这个是什么鬼?具体内容自己可以去查suid和sguid的内容。
如果在某一个可执行文件下的owner和group权限位,开起了小s状态,代表这个可执行文件开放了提权。
举个例子:假如奥巴马有一个车库,他标记为奥巴马和民主党人才能用,权限为660(rw-rw-rw-), 而这个车库只有开着一辆车(跑起来一个进程)才能访问,这个车也是奥巴马的,也归民主党,权限为755(rwxr-xr-x), 所有人都能开这个车,但是,奥巴马开着车,他是奥巴马,能访问车库; 米歇尔开着车她是民主党人士,也能访问车库,而我等屁民开着奥巴马的车,我还是我,是不能访问车库的。
假如我等屁民也想访问奥巴马的车库玩玩,怎么办呢?这个时候可以开启奥巴马车辆的suid和sguid权限,如果开了suid,屁民开着奥巴马的车,他就是奥巴马,奥巴马开车能干啥,屁民也能干啥;如果开了sguid,屁民开着民主党的车,他就是民主党人士,民主党人士开车能干啥,屁民也能干啥。这就是开发提权作用。
说道suid的时候,提的最多的例子是passwd这个东西,简单说是普通用户改的密码要存在/etc/passwd 这个文件下,但是/etc/passwd这个目录归root所有,并且不提供普通用户写权限,那普通用户还怎么操作?
事实上很多文章都漏说了一个可执行文件,普通用户是通过passwd这个命令修改密码的,这个passwd命令的路径在/usr/bin/passwd, 即普通用户通过/usr/bin/passwd 这个可执行文件,访问修改了/etc/passwd 这个文件,把密码存在这。
我们来看一下权限:
king@king-B85-HD3 ~/foo/bar $ ll /usr/bin/passwd
-rwsr-xr-x 1 root root 47032 2月 17 2014 /usr/bin/passwd
king@king-B85-HD3 ~/foo/bar $ ll /etc/passwd
-rw-r--r-- 1 root root 1984 3月 20 21:52 /etc/passwd
可以看到,正常情况下,非root用户是不能把密码写到/etc/passwd这个文件里面的,但是,由于/usr/bin/passwd开放了suid权限,普通用户执行这个文件,就变成了这个文件的owner, 也就是root, root当然可以修改/etc/passwd这个file了。
一般android手机如果root的话,会通过hack手段放入一个/system/bin/su文件, 这个file的owner是root,作用是执行任何其它命令(passwd命令只能访问/etc/passwd), 这个file也是开启了suid权限,这样对于android的任何一个用户(android为每一个app都申请了一个用户,以用户身份运行app),执行时候都有了root权限,就能为所欲为了,这也是root的原理。同理ubuntu的sudo命令类似。
所以,简单来说,suid的原理就是,你开上奥巴马的车,你就是奥巴马,你开着root的程序,你就是root, sguid同理,有点狐假虎威的味道是不是,呵呵。