假设我有一个只有 root 可以访问的目录:
$ sudo -s
$ mkdir ~/rootonly
$ chmod 000 ~/rootonly
该目录下有一个具有全局所有权限的目录:
$ cd ~/rootonly
$ mkdir openforall
$ chmod 777 openforall
不,如果我想以普通用户身份访问该目录,我似乎不能(正如我所料):
$ su me
$ cd ~/rootonly/openforall/
bash: cd: /home/me/rootonly/openforall: Permission denied
$ touch ~/rootonly/openforall/foo
touch: cannot touch `/home/me/rootonly/openforall/foo': Permission denied
但是,如果我首先以 root 身份进入目录,然后通过 su 切换到普通用户,它就可以工作了:
$ sudo -s
$ cd /home/me/rootonly/openforall
$ su www-data
$ touch test
$ ls
$ -rw-r--r-- 1 www-data www-data 0 2011-08-05 14:17 test
为什么这样做有效?第一种情况只是“cd”的特定行为吗?它会尝试逐个文件夹地浏览目录层次结构?换句话说,对于绕过 bash 的攻击者,如果知道路径,内核是否会提供访问“openforall”的条目?
我对这里幕后发生的事情很感兴趣。
答案1
当命令需要“遍历”目录时,就会强制执行权限。
当你 时touch ~/rootonly/openforall/foo
,touch 命令需要打开rootonly
目录,以便它可以找到 的位置(inode 等),openforall
然后它可以编辑openforall
目录结构的内容来设置 的时间戳foo
。