unix下专供root调用程序的介绍( 五 )


序中的安全漏洞.
(b) 警惕外来的编码和make/install方法
. 某些make/install方法不加选择地建立SUID/SGID程序.
. 检查违背上述指导原则的SUID/SGID许可的编码.
. 检查makefile文件中可能建立SUID/SGID文件的命令.
4. root程序的设计有若干个子程序可以从有效UID为0的进程中调用.许多前面提到的子程序,当从root进程中调用时,将完成和原来不同的处理.主要是忽略了许可权限的检查.
由root用户运行的程序当然是root进程(SUID除外),因有效UID用于确定文件的存取权限,所以从具有root的程序中,调用fork()产生的进程,也是root进程.【unix下专供root调用程序的介绍】(1) setuid():从root进程调用setuid()时,其处理有所不同,setuid()将把有效的和实际
的UID都置为指定的值.这个值可以是任何整型数.而对非root进程则仅能以实际UID或
本进程原来有效的UID为变量值调用setuid().
(2) setgid():在系统进程中调用setgid()时,与setuid()类似,将实际和有效的GID都改
变成其参数指定的值.
调用以上两个子程序时,应当注意下面几点:
. 调用一次setuid()(setgid())将同时设置有效和实际UID(GID),独立分别设置有
效或实际UID(GID)固然很好,但无法做到这点.
. setuid()(setgid())可将有效和实际UID(GID)设置成任何整型数,其数值不必一
定与/etc/passwd(/etc/group)中用户(小组)相关联.
. 一旦程序以一个用户的UID了setuid(),该程序就不再做为root运行,也不可能再
获root特权.
(3) chown():root进程运行chown()时,chown()将不删除文件的SUID和/或SGID许可,
但当非root进程运行chown()时,chown()将取消文件的SUID和/或SGID许可.
(4) chroot():改变进程对根目录的概念,调用chroot()后,进程就不能把当前工作目录
改变到新的根目录以上的任一目录,所有以/开始的路径搜索,都从新的根目录开始.
(5) mknod():用于建立一个文件,类似于creat(),差别是mknod()不返回所打开文件的
文件描述符,并且能建立任何类型的文件(普通文件,特殊文件,目录文件).若从非
root进程调用mknod()将执行失败,只有建立FIFO特别文件(有名管道文件)时例外,
其它任何情况下,必须从root进程调用mknod().由于creat()仅能建立普通文件,
mknod()是建立目录文件的唯一途径,因而仅有root能建立目录,这就是为什么
mkdir命令具有SUID许可并属root所有.一般不从程序中调用mknod().通常用
/etc/mknod命令建立特别设备文件而这些文件一般不能在使用着时建立和删除,
mkdir命令用于建立目录.当用mknod()建立特别文件时,应当注意确从所建的特别文
件不允许存取内存,磁盘,终端和其它设备.
(6) unlink():用于删除文件.参数是要删除文件的路径名指针.当指定了目录时,必须从
root进程调用unlink(),这是必须从root进程调用unlink()的唯一情况,这就是为
什么rmdir命令具有root的SGID许可的原因.
(7) mount(),umount():由root进程调用,分别用于安装和拆卸文件系统.这两个子程序
也被mount和umount命令调用,其参数基本和命令的参数相同.调用mount(),需要给
出一个特别文件和一个目录的指针,特别文件上的文件系统就将安装在该目录下,调用
时还要给出一个标识选项,指定被安装的文件系统要被读/写(0)还是仅读(1).
umount()的参数是要一个要拆卸的特别文件的指针.

推荐阅读