假设您有以下结构:
+ directory
-- file1
-- file2
-- file3 -> /tmp/file3
file3
file3
是指向系统上其他地方的链接。
现在假设我拥有chmod 777
目录及其中的所有内容。我的权限是否file3
已/tmp
获得这些权限?此外,假设我们有相同的情况,但情况相反。
/tmp/file3 -> /directory/file3
如果我对链接到的文件应用权限,这会对链接产生什么影响?
答案1
这取决于您的呼叫方式chmod
和所运行的平台。
例如,在 Linux 系统上,man chmod
这样说:
chmod
永远不会更改符号链接的权限;chmod
系统调用无法更改其权限。这不是问题,因为符号链接的权限永远不会被使用。但是,对于命令行上列出的每个符号链接,chmod
都会更改指向文件的权限。相反,chmod
会忽略递归目录遍历期间遇到的符号链接。
然而,在 Mac 上,可以使用 chmod 来修改符号链接的权限,使用如下选项(来自man chmod
):
-h 如果文件是符号链接,则更改链接本身的模式而不是链接指向的文件的模式。
为了举例子,我们假设您在 Linux 机器上阅读本回答的其余部分。
如果在第一种情况下您运行chmod -R 777 directory
以递归方式更改权限,则链接目标不会受到影响,但是如果您这样做chmod 777 directory/*
,则会受到影响。
如果你直接更改链接目标的权限,这些权限将会继续有效(因为手册页和巴拉布姆也就是说,实际的链接权限没有用于任何事情)。
测试日志用于说明:
$ mkdir dir && touch dir/file{1,2} /tmp/file3 && ln -s {/tmp,dir}/file3
$ ls -l dir/* /tmp/file3
-rw-r--r-- 1 user group 0 2011-06-27 22:02 /tmp/file3
-rw-r--r-- 1 user group 0 2011-06-27 22:02 dir/file1
-rw-r--r-- 1 user group 0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3
$ chmod -R 777 dir && ls -l dir/* /tmp/file3
-rw-r--r-- 1 user group 0 2011-06-27 22:02 /tmp/file3
-rwxrwxrwx 1 user group 0 2011-06-27 22:02 dir/file1
-rwxrwxrwx 1 user group 0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3
$ chmod 700 dir/* && ls -l dir/* /tmp/file3
-rwx------ 1 user group 0 2011-06-27 22:02 /tmp/file3
-rwx------ 1 user group 0 2011-06-27 22:02 dir/file1
-rwx------ 1 user group 0 2011-06-27 22:02 dir/file2
lrwxrwxrwx 1 user group 10 2011-06-27 22:02 dir/file3 -> /tmp/file3
答案2
baraboom 和 peth 的答案都是正确的:符号链接本身的权限位是无关紧要的(macOS 除外;见下文),并且通过chmod
命令行工具或chmod()
系统调用更改符号链接的权限将只是像针对符号链接的目标执行一样。
去引用SUSv4/POSIX.1-2008 对 symlink() 系统调用的描述:
所创建的符号链接的文件模式位的值未指定。POSIX.1-2008 指定的所有接口都应表现得好像符号链接的内容始终可以读取,但返回的文件模式位的值st_模式领域的统计结构未指定。
此处,“未指定”为每种实现方式留下了解释的空间。具体如下:
- 在 Linux 上(使用 ext4fs 测试),无论创建符号链接时的 umask 是多少,
stat()
都会返回;因此始终显示符号链接。st_mode=0777
ls -l
lrwxrwxrwx
- 在 macOS(HFS)和 FreeBSD(UFS 和 ZFS)上,符号链接确实有其自己的权限:
chmod -h
上面提到的命令可以更改此链接权限(内部使用非 POSIXlchown()
系统调用来实现此目的),并且stat()
系统调用返回此值st_mode
。
Linux 和 FreeBSD 上的符号链接始终可以被跟踪,正如 POSIX 所规定的那样。特别是在 FreeBSD 上,这意味着符号链接的文件模式对访问控制完全没有影响。
另一方面,macOS 稍微违反了 POSIX。尽管无论符号链接是否具有读取权限,都可以对其进行跟踪,但如果用户没有读取权限,readlink()
则会失败并显示(Permission denied):EACCES
$ sudo ln -shf target symlink
$ sudo chmod -h 444 symlink
$ ls -l symlink
lr--r--r-- 1 root staff 1 Mar 14 13:05 symlink -> target
$ sudo chmod -h 000 symlink
$ ls -l symlink
ls: symlink: Permission denied
l--------- 1 root staff 1 Mar 14 13:05 symlink
$ echo kthxbye > target
$ cat symlink
kthxbye
(请注意,第二条命令-> target
的输出中缺少该部分,尽管用户没有读取权限,但该命令仍然成功并打印了文件的内容。)ls -l
cat symlink
target
symlink
NetBSD 显然提供了一个名为的特殊挂载选项symperm
,如果设置该选项,则会导致符号链接读取/执行权限控制readlink()
和链接遍历。
答案3
以下答案是关于权限隐含所有权而不是读/写/执行权限位。
尽管符号链接上的权限位可能并不重要,但是在粘性位目录的情况下,所有权很重要,因为每个人都可以创建文件,例如,哦,/tmp
。
Alice 可以在 中创建一个符号链接/tmp
,然后编辑它并将其删除:
alice@~ $ ln -sf /whatever /tmp/mylink
alice@~ $ ln -sf /whatever-else /tmp/mylink
但是用户 Bob 不能替换或者删除 Alice 的链接(在 Linux 上测试):
bob@~ $ rm /tmp/mylink
rm: cannot remove /tmp/mylink: Operation not permitted
/tmp/mylink
如果鲍勃 (Bob) 可以做到这一点,那么鲍勃 (Bob) 就可以对爱丽丝 (Alice ) 对爱丽丝所信任的路径的解析进行攻击。
通常,删除对象需要具有目录权限。这适用于符号链接。Bob 当然能删除 Alice 所拥有的、Bob 可写入的目录中的符号链接,该目录没有粘滞位。
答案4
- 删除链接文件(确保它未被任何进程使用)
- 设置 umask,使得 777-umask=所需文件权限
- 重新创建链接文件