拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

TLPI 第38章 练习:Writing Secure Privileged Programs

TLPI 第38章 练习:Writing Secure Privileged Programs

笔记和练习博客总目录见:开始读TLPI。

38-1

以普通无特权用户身份登录,创建一个可执行文件(或者复制已有文件,例如/bin/sleep),并为该文件开启设置用户 ID(set-user-ID)权限位(命令chmod u+s)。尝试修改这个文件(例如cat >> file)。查看操作后文件权限发生了什么变化(用ls –l),并解释原因。


实验如下:

$pwd/home/vagrant/test $cp/usr/bin/sleep.$ls-lsleep-rwxr-xr-x.1vagrant vagrant36320Sep2801:56sleep$sudochmodu+ssleep$ls-lsleep-rwsr-xr-x.1vagrant vagrant36320Sep2801:56sleep$echoabc>>sleep$ls-lsleep-rwxr-xr-x.1vagrant vagrant36324Sep2801:57sleep

结论就是,setuid标志被清掉了。

原书答案如下:

每当无特权用户修改文件时,内核会清除该文件的设置用户 ID(set-user-ID)权限位。若文件已开启组执行权限位,则设置组 ID(set-group-ID)权限位也会被同样清除。(详见 55.4 节:当组执行位关闭、但设置组 ID 位开启时,该组合与 SGID 程序无关;此场景用于开启强制锁(mandatory locking),正因如此,修改这类文件不会清除 SGID 位。)
清除这些权限位是为了保证:如果程序文件允许任意用户写入,那么即便文件被篡改,也无法继续保留给文件执行用户赋予权限的能力。拥有特权(CAP_FSETID)的进程修改文件时,内核不会清除上述权限位。

38-2

编写一个root 权限的 SUID 程序,功能类似sudo(8)。程序支持如下命令行选项与参数:

$ ./douser [-u user ] program-file arg1 arg2 ...

douser程序执行program-file以及后续传入参数,模拟由 user 用户来运行该程序。(如果省略-u选项,则默认用户为 root)。
在执行program-file之前,douser需要请求该 user 的密码,基于标准密码文件完成身份校验(参见教材 164 页,代码清单 8-2),然后将进程的所有用户 ID、组 ID 设置为该用户对应的正确值。


略。

返回列表