Why is su world executable?omm DG
I have a headless server that is logged into remotely by multiple users. None of the other users are in the sudoers file, so they cannot obtain root via sudo. However, since the permissions on su are -rwsr-xr-x there's nothing stopping them from attempting to brute force the root password.
One could argue that if a user knows the root password they can compromise the system anyway, but I don't think this is the case. OpenSSH is configured with PermitRootLogin no and PasswordAuthentication no, and none of the other users have physical access to the server. As far as I can tell, the world execute permission on /usr/bin/su is the only avenue for users attempting to gain root on my server.
What's further puzzling to me in that it doesn't even seem useful. It allows me to run su directly instead of needing to do sudo su, but this is hardly an inconvenience.
Am I overlooking something? Is the world execute permission on su just there for historic reasons? Are there any downsides to removing that permission that I haven't encountered yet?
3 Answers
One point that is missing from @ilkkachu's answer is that elevating to root is only one specific use for su. The general purpose of su is to open a new shell under another user's login account. That other user could be root (and perhaps most often is), but su can be used to assume any identity the local system can authenticate.
For example, if I'm logged in as user jim, and I want to investigate a problem that mike has reported, but which I am unable to reproduce, I might try logging in as mike, and running the command that is giving him trouble.
13:27:20 /home/jim> su -l mike
Password:(I type mike's password (or have him type it) and press Enter)
13:27:22 /home/mike> id
uid=1004(mike) gid=1004(mike) groups=1004(mike)
13:27:25 /home/mike> exit # this leaves mike's login shell and returns to jim's
13:27:29 /home/jim> id
uid=1001(jim) gid=1001(jim) groups=1001(jim),0(wheel),5(operator),14(ftp),920(vboxusers)
Using the -l option of su causes it to simulate a full login (per the man page).
The above requires knowledge of mike's password, however. If I have sudo access, I can log in as mike even without his password.
13:27:37 /home/jim> sudo su -l mike
Password:(I type my own password, because this is sudo asking)
13:27:41 /home/mike>
In summary, the reason the permissions on the su executable are as you show, is because su is a general-purpose tool that is available to all users on the system.
-
That makes a lot of sense. Since I'm in the habit of using
sudoI forgot thatsucan be used for more than justsudo -s. And without being a sudoer this would be the only way to switch users without altering ssh keys. For my use case this is another reason to remove the permission, but I understand now why the world execute permission is set by default. Thanks! – Altay_H 7 hours ago
However, since the permissions on
suare-rwsr-xr-xthere's nothing stopping them from attempting to brute force the root password.
Yes. Assuming your usual Linux system, the pam_unix.so module does delay a failed authentication attempt by ~two seconds, but I don't think there's anything to stop simultaneous attempts.
Failed attempts are logged of course:
Aug 16 22:52:33 somehost su[17387]: FAILED su for root by ilkkachu
Brute-forcing a password should show up prominently in the logs, if you have any kind of system for monitoring them. And if you have untrusted local users, maybe you should. Untrusted local users could also attempt to use any local-only privilege escalation exploits, and they're much more common than remote privilege escalation.
What's further puzzling to me in that it doesn't even seem useful.
Of course it's useful, it allows you to elevate yourself to root, if you know the password.
It allows me to run
sudirectly instead of needing to dosudo su, but this is hardly an inconvenience.
sudo su is somewhat redundant. There's no need to use two programs that are meant to allow you to run programs as another user, one is quite enough. Just use sudo -i or sudo -s (or sudo /bin/bash etc.) if you want to run shell.
Am I overlooking something? Is the world execute permission on su just there for historic reasons?
See above. Well, not all systems have sudo as an alternative, I'm not sure if you consider that historic.
Are there any downsides to removing that permission that I haven't encountered yet?
Not really, no as far as I know. I think some systems have su set so that only members of a particular group ("wheel") can run it. You can do the same to sudo if you like (chown root.sudousers /usr/bin/sudo && chmod 4710 /usr/bin/sudo).
Or you could just remove either or both of the programs if you don't need them. Though on Debian, su comes with the login package, so it's probably not a good idea to remove the package as a whole. (And pairing login and su together like that does seem somewhat historic.)
-
BSD systems require users to be in the
wheelgroup to usesu. There are some BSD systems (I can only speak for OpenBSD) that does not ship withsudoat all (it's a 3rd-party package). OpenBSD hasdoaswhich is a reimplementation of the basics ofsudo, but it's disabled by default upon installing a fresh system. – Kusalananda♦ 7 hours ago -
@Kusalananda You only have to be in
wheelif you want tosuto root. Any account cansuto any non-root account for which they have the password, regardless of their membership in thewheelgroup. – Jim L. 7 hours ago -
I run 'sudo su -' to ensure that the root shell I get is a full root login, without a polluted environment from my user account. The default sudoers on RHEL includes quite a few environment variables that are executable (such as PS1). – jsbillings 4 hours ago
You already have some good answers, but there's one part of your post they don't address.
As far as I can tell, the world execute permission on /usr/bin/su is the only avenue for users attempting to gain root on my server.
That's a dangerous assumption. If you've set a good password for root, then it in most cases is far more likely that a successful privilege escalation will be due to the exploitation of a bug in the kernel or a setuid binary (you can of course also remove the setuid bit from those, but passwd is setuid, and if you want to high security you should also offer that to your users, and denying them the option of changing their password is not compatible with that).