在 OS X 上,我的一个朋友更改了递归使用 Finder 的权限/usr/bin
,以便向每个人授予写入权限。
其实现方式如下:
转到/usr/bin
Finder,然后更改信息窗口底部的权限:
之后,您就不能再跑步了Terminal.app
。但您仍然可以运行“磁盘实用程序”,无需终端即可从中恢复。
这是您在这种情况下遇到的错误:
Last login: Fri Jul 4 15:39:24 on ttys001
login(27006,0x7fff78115310) malloc: *** error for object 0x7fceb3412cc0: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
幸运的是,我很快找到了一个提到这个问题的问题这里。
我的第一个想法是这是一个硬件问题(可能是硬盘驱动器/RAM/等上的一些随机损坏......)。
此错误与 中的错误权限有何关系/usr/bin
?
当试图在损坏的系统上工作以获得清晰的差异列表时,我得到了这个:
$ sudo -s
sudo: effective uid is not 0, is sudo installed setuid root?
这是结果diskutil verifyPermissions
(顺便说一句,它解决了问题):
(太大了,无法在这里发布)
每行的形式如下:
Permissions differ on "usr/bin/sudo"; should be -r-s--x--x ; they are -rwxr-xrwx
但我只留下了文件名、它应该具有的权限和当前权限:
Permissions differ on "usr/bin/login"; should be -r-sr-xr-x ; they are -rwxr-xrwx
答案1
问题确实是 Finder 修改权限的方式不仅仅影响人们想象的指示位。由于某种原因,它将文件模式的第一个八进制清零,并且使可执行位保持不变。因此,一些重要的程序得到了它们的setuid/setgid
和sticky
被剥离的位使得它们要么无用,要么行为异常。
中的某些程序需要 setuid 位,/usr/bin/
因为它们必须在比通常程序更低的级别上与系统交互。例如,sudo
、passwd
、newgrp
或login
需要超出普通用户权限的权限,这就是为什么您需要密码才能执行它们。如果删除它们的 setuid 位,它们就无法完成其工作,这会导致它们过早退出甚至崩溃。
因此,例如,正确的权限/usr/bin/login
是4555
或 ,-r-sr-xr-x
并且在您朋友的操作之后我们拥有0757
或-rwxr-xrwx
。这终端程序/usr/bin/login
将您的用户附加到 tty 的调用(请参阅man stty
)并且缺少 setuid 位会导致它失败。释放未分配的指针可能是与此相关的错误。在 OS X 10.6.8 上,我没有收到此指针错误,但是终端程序启动后立即退出,我发现类似的login[6647]: pam_open_session(): system error
条目/var/log/system.log
。
编辑。正如 Antoine Lecaille 在评论中提到的,使 Terminal.app 功能失调的一个简单方法是发出$ sudo chmod -s /usr/bin/login
.请注意,之后您甚至无法打开新窗口,因为这也依赖于登录调用。要撤消它,只需执行$ sudo chmod +s /usr/bin/login
.
我测试了Finder对权限的影响如下:
$ # create a directory with the same permissions as /usr/bin
$ mkdir -m 755 test
$ sudo chown root:wheel test
$ ls -l | grep test
drwxr-xr-x 2 root wheel 68 Jul 6 15:01 test
$ # create 4096 empty files with all possible permissions
$ cd test
$ sudo touch file_{0..7}{0..7}{0..7}{0..7}
$ for perms in {0..7}{0..7}{0..7}{0..7}; do sudo chmod $perms file_$perms; done
由于速度很慢,循环for
可能需要一分钟才能完成chmod
。之后,您的文件夹中就有file_wxyz
具有权限的文件。例如wxyz
test
$ ls -l file_4555
-r-sr-xr-x 1 root wheel 0 Jul 6 15:02 file_4555
$ open .
现在,我们可以模仿您朋友的特技,并使用 Finder:和Cmd+更改文件夹及其所有内容的权限,I并执行您在帖子中解释的操作。我决定授予组wheel读取权限,并授予每个人读取+写入权限。
现在让我们看看我们的文件发生了什么:以下管道列出了目录,读出包含权限的列,对其进行排序并抑制重复行:
$ ls -l | awk '{print $1}' | sort -u
-rw-r--rw-
-rw-r--rwx
-rw-r-xrw-
-rw-r-xrwx
-rwxr--rw-
-rwxr--rwx
-rwxr-xrw-
-rwxr-xrwx
total
$ ls -l file_4555
-rwxr-xrwx 1 root wheel 0 Jul 6 15:02 file_4555
如您所见,setuid/setgid/sticky 位不再设置;所有文件的读写权限相同;并且权限现在仅在执行位上有所不同(其中有八种可能的组合)。
答案2
简答
/usr/bin
包含符号链接,当您更改文件夹的权限时,其权限不会被修改/usr/bin
,因此符号链接上的权限设置不正确,导致指针引用一些无法访问的内存(据我所知,由于以下原因而无法访问)权限问题)。
详细解答
/bin – 用户二进制文件
- 包含二进制可执行文件。
- 单用户模式下需要使用的常用linux命令都位于该目录下。
- 系统所有用户使用的命令都位于此处。
- 例如:ps、ls、ping、grep、cp。
现在,我们已经更改了 的权限/usr/bin
。那么让我们看看符号链接权限是如何受到影响的。
符号链接的文件系统权限通常只与链接本身的重命名或删除操作相关,而与目标文件的访问模式无关,而目标文件的访问模式由目标文件自身的权限控制。
所以现在很明显,更改基本文件的权限不会影响符号链接的权限。
那么这个错误到底意味着什么呢?
这意味着代码正在尝试释放未使用malloc
/分配的内容realloc
。另外,将死指针返回到已释放的内存有什么意义?
根据上述观察,我猜测更改权限后,无法引用符号链接,这就是指针已失效的原因(符号链接上没有适当的权限)。所以,你会得到上面的错误。
参考
https://stackoverflow.com/questions/14575545/pointer-freed-not-allocation https://superuser.com/questions/303040/how-do-file-permissions-apply-to-symlinks https://superuser.com/questions/395035/are-world-read-writable-executable-links-in-usr-bin-security-holes