可在命令或进程失败时使用此调试过程。在找到并修复第一个特权问题之后,您可能需要再次运行 ppriv -eD command 命令以查找其他特权要求。
% ppriv -eD touch /etc/acct/yearly touch[5245]: missing privilege "file_dac_write" (euid = 130, syscall = 224) needed at zfs_zaccess+0x258 touch: cannot create /etc/acct/yearly: Permission denied
在 /etc/name_to_sysnum 文件中查找 syscall 编号的名称。
% grep 224 /etc/name_to_sysnum creat64 224
在此示例中,creat64() 调用失败。要成功执行进程,必须为该进程指定可在 /etc/acct/yearly 目录中创建文件的权限。
truss 命令可以在常规 shell 中调试特权使用。例如,以下命令调试失败的 touch 进程:
% truss -t creat touch /etc/acct/yearly creat64("/etc/acct/yearly", 0666) Err#13 EACCES [file_dac_write ] touch: /etc/acct/yearly cannot create
扩展的 /proc 接口在 truss 输出中的错误代码后面报告缺少 file_dac_write 特权。
示例 7-6 使用 ppriv 命令在配置文件 Shell 中检查特权使用在此示例中,jdoe 用户可以承担角色 objadmin。objadmin 角色拥有 "Object Access Management"(对象访问管理)权限配置文件。使用此权限配置文件,objadmin 角色可以更改不属于 objadmin 的文件的权限。
在以下摘录中,jdoe 无法更改 useful.script 文件的权限:
jdoe% ls -l useful.script -rw-r--r-- 1 aloe staff 2303 Apr 10 10:10 useful.script jdoe% chown objadmin useful.script chown: useful.script: Not owner jdoe% ppriv -eD chown objadmin useful.script chown[11444]: missing privilege "file_chown" (euid = 130, syscall = 16) needed at zfs_zaccess+0x258 chown: useful.script: Not owner
当 jdoe 承担 objadmin 角色时,更改了该文件的权限:
jdoe% su - objadmin Password: xxxxxxxx # ls -l useful.script -rw-r--r-- 1 aloe staff 2303 Apr 10 10:10 useful.script # chown objadmin useful.script # ls -l useful.script -rw-r--r-- 1 objadmin staff 2303 Apr 10 10:10 useful.script # chgrp admin useful.script # ls -l objadmin.script -rw-r--r-- 1 objadmin admin 2303 Apr 10 10:11 useful.script示例 7-7 更改 root 用户拥有的文件
此示例说明了防止特权升级的方法。有关讨论,请参见特权升级和内核特权。此文件归 root 用户所有。由于权限较低的 objadmin 角色需要所有特权才能更改文件的所有权,因此操作失败。
jdoe% su - objadmin Password: xxxxxxxx # cd /etc; ls -l system -rw-r--r-- 1 root sys 1883 Oct 10 10:20 system # chown objadmin system chown: system: Not owner # ppriv -eD chown objadmin system chown[11481]: missing privilege "ALL" (euid = 101, syscall = 16) needed at zfs_zaccess+0x258 chown: system: Not owner