修复 /usr 中的 setuid 和 setgid 位?

Hel*_*mut 7 permissions root chmod chown

我做了一件蠢事:

chown -R root:root /usr
chmod -R g-w /usr
Run Code Online (Sandbox Code Playgroud)

显然,我能做的最好的事情就是重新安装系统。但是,到目前为止,我的系统运行良好 - 是否有任何不尽快修复此问题的立即危险的事情?我有 Ubuntu 18.04(没有互联网连接),它只是用作本地 NAS。

我这样做的原因是在进行更新时出现警告:

WARN: uid is 0 but '/usr' is owned by 1000
WARN: /usr is group writable!
Run Code Online (Sandbox Code Playgroud)

我问过,论坛上有人用“它是完全安全的”建议了上述命令。经验教训:不要相信互联网上的人,即使他们听起来完全相信。

显然,为什么/usr组可写而不由 root 拥有的原因是因为我特定的 DIY-Nas Ubuntu (Odroid):

drwxrwxr-x  10 odroid odroid     4096 Apr 12  2018 usr
Run Code Online (Sandbox Code Playgroud)

也许我不应该使用-R递归选项。现在没关系。

在过去的几个小时里,我浏览了各种帖子以了解我做了什么。它看起来像是chown/usr中断setuidsetgid位上运行任何,所以我需要手动与现有系统进行比较,以在我再次修复所有权后恢复所有这些。为了修复sudocommand,我已经这样做了:

chown root:root /usr/bin/sudo && chmod 4755 /usr/bin/sudo
Run Code Online (Sandbox Code Playgroud)

除此之外,我看不到任何其他问题。当我登录到 Ubuntu 界面时,我收到了一些蓝牙软件的许可警告,但这并不是直接相关的。我知道出于安全原因,/usr 中的某些软件具有除root(例如,请参阅此处的列表)以外的组- 但是否会对我的 nas 系统产生任何真正的负面影响,尤其是与文件处理相关的/归档东西,例如损坏或无法访问的文件?

请注意,我创建了一个新的 stackexchange 帐户,因为我太尴尬了..无论如何,非常感谢您的建议!

Per*_*uck 8

我认为您很幸运,因为您刚刚删除了组的“可写”位。这不会影响 SETGID 或 SETUID 位。如果它们之前设置,它们仍然设置。chmod -R 777 /usr另一方面,该命令将所有位重置为 ,rwx同时删除任何其他位,包括s位。这就是为什么发布的chmod -R 777 /usr人通常被迫重新安装。

也许我在我的系统上所做的观察可以帮助你。我已经运行了一些find命令来查看哪些文件和目录会受到您发出的命令的影响。结果如下:

# Find all files and directories NOT owned by user root:
find usr -not -user root -ls
3407926     52 -rwsr-sr-x   1 daemon   daemon      51464 Feb 20  2018 usr/bin/at

# Find all files and directories NOT owned by group root:
find usr -not -group root -ls
3418319      4 drwxrwsr-x   3 root     staff        4096 Jan  5  2018 usr/local/lib/python3.6
3418322      4 drwxrwsr-x   2 root     staff        4096 Jan  5  2018 usr/local/lib/python3.6/dist-packages
3419229      4 drwxrwsr-x   4 root     staff        4096 Nov 13 20:03 usr/local/lib/python2.7
3419230      4 drwxrwsr-x   2 root     staff        4096 Jan 26  2018 usr/local/lib/python2.7/dist-packages
1049153      4 drwxrwsr-x   2 root     staff        4096 Nov 13 20:03 usr/local/lib/python2.7/site-packages
3544477      4 drwxrwsr-x   2 root     staff        4096 Jan  5  2018 usr/local/share/fonts
3418324      4 drwxrwsr-x   3 root     staff        4096 Jan  5  2018 usr/local/share/emacs
3544479      4 drwxrwsr-x   2 root     staff        4096 Jan  5  2018 usr/local/share/emacs/site-lisp
3416934    372 -rwsr-xr--   1 root     dip        378600 Jun 12 19:20 usr/sbin/pppd
3410196     40 -rwxr-sr-x   1 root     mail        39000 Apr  3  2018 usr/sbin/ssmtp
3408208     12 -rwxr-sr-x   1 root     utmp        10232 Mär 11  2016 usr/lib/x86_64-linux-gnu/utempter/utempter
3419827     12 -rwxr-sr-x   1 root     tty         10232 Aug  4  2017 usr/lib/mc/cons.saver
3428536     16 -rwxr-sr-x   1 root     mail        14336 Jul 31 16:14 usr/lib/evolution/camel-lock-helper-1.2
3416858     44 -rwsr-xr--   1 root     messagebus  42992 Nov 15  2017 usr/lib/dbus-1.0/dbus-daemon-launch-helper
1183416      4 drwxrwsr-t   2 root     lpadmin      4096 Nov  8  2017 usr/share/ppd/custom
3410118     44 -rwxr-sr-x   1 root     mlocate     43088 Mär  1  2018 usr/bin/mlocate
3408029     16 -rwxr-sr-x   1 root     tty         14328 Jan 17  2018 usr/bin/bsd-write
3414379    356 -rwxr-sr-x   1 root     ssh        362640 Nov  5 12:51 usr/bin/ssh-agent
3410676     32 -rwxr-sr-x   1 root     tty         30800 Jul 26 18:20 usr/bin/wall
3409008     72 -rwxr-sr-x   1 root     shadow      71816 Jan 25  2018 usr/bin/chage
3416771     24 -rwxr-sr-x   1 root     shadow      22808 Jan 25  2018 usr/bin/expiry
3407926     52 -rwsr-sr-x   1 daemon   daemon      51464 Feb 20  2018 usr/bin/at
3409356     40 -rwxr-sr-x   1 root     crontab     39352 Nov 16  2017 usr/bin/crontab

# find objects that have the group-writable bit set and are owned by user=root but group!=root:
find usr -perm -0020 -user root -not -group root -ls
3418319      4 drwxrwsr-x   3 root     staff        4096 Jan  5  2018 usr/local/lib/python3.6
3418322      4 drwxrwsr-x   2 root     staff        4096 Jan  5  2018 usr/local/lib/python3.6/dist-packages
3419229      4 drwxrwsr-x   4 root     staff        4096 Nov 13 20:03 usr/local/lib/python2.7
3419230      4 drwxrwsr-x   2 root     staff        4096 Jan 26  2018 usr/local/lib/python2.7/dist-packages
1049153      4 drwxrwsr-x   2 root     staff        4096 Nov 13 20:03 usr/local/lib/python2.7/site-packages
3544477      4 drwxrwsr-x   2 root     staff        4096 Jan  5  2018 usr/local/share/fonts
3418324      4 drwxrwsr-x   3 root     staff        4096 Jan  5  2018 usr/local/share/emacs
3544479      4 drwxrwsr-x   2 root     staff        4096 Jan  5  2018 usr/local/share/emacs/site-lisp
1183416      4 drwxrwsr-t   2 root     lpadmin      4096 Nov  8  2017 usr/share/ppd/custom
Run Code Online (Sandbox Code Playgroud)

当然,您的里程可能有所不同,但我相信您只是“破坏”了少数文件。下面的绝大多数对象 /usr由 或拥有root:root并且通常具有rwxrwxr-xrwxr-xr-x。删除该g-w位并没有真正造成伤害,因为它删除了组的可写位,root但是(至少在我的标准系统上)该组的唯一成员root无论如何都是用户,并且他通过用户权限(您没有)拥有写访问权限't 更改)并且实际上不需要通过组成员身份进行写访问。

顺便说一句,我/usr本身具有以下属性:

drwxr-xr-x  10 root root  4096 Jan  5  2018 usr/
Run Code Online (Sandbox Code Playgroud)

更新

OP提到他遇到了错误

sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set
Run Code Online (Sandbox Code Playgroud)

发行后chmod g-wchown root:root,不得不与修复 chmod 4755 /usr/bin/sudo。事实证明,对chown g-w确实不改变setuid位,但chown root:root做了。它显然清除了那些 SETUID(大概还有 SETGID 和 STICKY)位。对我来说,这是意外的行为,但我很确定有一个解释和/或原因。然而。我运行了另一个find 命令来查看下面的哪些文件/usr设置了一个或多个 SETUID、SETGID 和 STICKY 位:

find usr -perm /7000 -printf '%M\t%u:%g\t%p\n'
drwxrwsr-x  root:staff      usr/local/lib/python3.6
drwxrwsr-x  root:staff      usr/local/lib/python3.6/dist-packages
drwxrwsr-x  root:staff      usr/local/lib/python2.7
drwxrwsr-x  root:staff      usr/local/lib/python2.7/dist-packages
drwxrwsr-x  root:staff      usr/local/lib/python2.7/site-packages
drwxrwsr-x  root:staff      usr/local/share/fonts
drwxrwsr-x  root:staff      usr/local/share/emacs
drwxrwsr-x  root:staff      usr/local/share/emacs/site-lisp
-rwsr-xr--  root:dip        usr/sbin/pppd
-rwxr-sr-x  root:mail       usr/sbin/ssmtp
-rwxr-sr-x  root:utmp       usr/lib/x86_64-linux-gnu/utempter/utempter
-rwsr-sr-x  root:root       usr/lib/xorg/Xorg.wrap
-rwxr-sr-x  root:tty        usr/lib/mc/cons.saver
-rwsr-sr-x  root:root       usr/lib/snapd/snap-confine
-rwxr-sr-x  root:mail       usr/lib/evolution/camel-lock-helper-1.2
-rwsr-xr--  root:messagebus usr/lib/dbus-1.0/dbus-daemon-launch-helper
-rwsr-xr-x  root:root       usr/lib/openssh/ssh-keysign
-rwsr-xr-x  root:root       usr/lib/policykit-1/polkit-agent-helper-1
-rwsr-xr-x  root:root       usr/lib/eject/dmcrypt-get-device
drwxrwsr-t  root:lpadmin    usr/share/ppd/custom
-rwxr-sr-x  root:mlocate    usr/bin/mlocate
-rwxr-sr-x  root:tty        usr/bin/bsd-write
-rwsr-xr-x  root:root       usr/bin/traceroute6.iputils
-rwsr-xr-x  root:root       usr/bin/gpasswd
-rwxr-sr-x  root:ssh        usr/bin/ssh-agent
-rwsr-xr-x  root:root       usr/bin/passwd
-rwsr-xr-x  root:root       usr/bin/pkexec
-rwsr-xr-x  root:root       usr/bin/sudo
-rwxr-sr-x  root:tty        usr/bin/wall
-rwsr-xr-x  root:root       usr/bin/chfn
-rwxr-sr-x  root:shadow     usr/bin/chage
-rwsr-xr-x  root:root       usr/bin/arping
-rwxr-sr-x  root:shadow     usr/bin/expiry
-rwsr-sr-x  daemon:daemon   usr/bin/at
-rwxr-sr-x  root:crontab    usr/bin/crontab
-rwsr-xr-x  root:root       usr/bin/chsh
-rwsr-xr-x  root:root       usr/bin/newgrp
Run Code Online (Sandbox Code Playgroud)

这个列表不是很长,但它仍然包含一些我认为至关重要的文件。尤其是那些在最后三分之一,像passwdcrontab等等,当然sudo