最初UNIX为文件分配了九个允许位,对应三类用户(同主、同组、其他),三种操作(读、写、执行)。后来,UNIX又增加了三个允许位:set-user-bit(又称set-user-id或setuid)、set-group-bit(又称set-group-id或setgid)、set-other-bit(又称sticky bit)。看起来似乎是为文件新增加了一种set操作,但实际上不是这样,这三个允许位与操作许可无关。
先说setuid。进程调用execve执行了一个允许位setuid为1的文件后,进程的euid,还有Linux特有的fsuid,被改变为所执行文件的属主id。效果就是进程执行文件不仅将文件的内容读入进程的代码区内存和数据区内存,还将文件属性中的部分数据读入进程凭证。于是,进程可以操作一些以前不能操作的客体。
引入setuid更深层的目的是特权提升!
UNIX的设计是简单的,一些任务只能由特权用户来做,而特权用户只有一个,就是用户id为0的root。如果普通用户需要做一些特权操作,那么正规的做法是请求管理员代劳,比如用户需要加载一块新硬盘。但是有的特权操作使用频繁,又不会对系统带来危害,比如探知网络实体存在的ping命令。总是请管理员做ping操作实在没有必要。怎么办呢?让任何人都可以执行ping命令,让运行ping的进程具有特权,就可以了。它实现起来是这样的:
1)ping文件的属主是root。
2)ping文件的setuid位被置位。(www.xing528.com)
3)ping文件的允许位设置为所有人都可以执行。
就像这样:
setuid机制是由UNIX设计者之一,伟大的Dennis Ritchie,在贝尔实验室发明的。贝尔实验室还为此申请了一项专利:US 4135240。不过此专利被贝尔实验室放入了公共领域,所有UNIX类操作系统不必担心侵权。
setgid与setuid类似,不同的是进程凭证中egid和fsgid被设置为文件的属组id。setgid与特权无关,因为UNIX的特权只与euid是否为0相关,任何组id都和特权无关。
set-other-id又叫sticky bit,因为在UNIX系统V中曾引入这样的逻辑:当执行着set-other-id文件的进程终止时,进程的代码段仍被保留在磁盘交换区。这样的好处是,下次再执行同样的文件时,进程可以快速启动。现在此代码逻辑只残存于不多的UNIX类操作系统中,比如HP-UX。在Linux中文件的sticky bit已无任何作用。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。