Skip to content

A zeroth-order guide to privelege escalation

This is not meant to be a detailed comparison, just a back-of-the-envelope guide explaining why you should or shouldn't use a particular program in particular circumstances.

sudo

This program is sadly, considered the default on most GNU+Linux distributions. It is a rather complex beast, despite the fact that it is, for lack of a better term, the original systemd, an ugly piece of code that almost everyone hates, but still runs for some reason. Not to say that systemd is bad, these days it's perhaps what it was meant to be all along, but sudo is something that you likely need to know about, but also something that you should avoid if possible on your own machines.

Contrary too popular belief, this program is not built-in. It is, in fact, not even installed, unless explicitly specified on newbiew-friendly advanced distributions such as ArchLinux.

So what do you need to know about sudo. Well, it's an SUID binary. 99% of the codebase is completely inert, in that you don't actually use most of it, all you use if for is privelege escalation for the root user.

Is this a bad thing? Yes. The program, by sheer size is a huge attack surface. If you can avoid it, please do.

One thing I should mention is that sudo comes with sudoedit, which is a program that would have been nice when editors couldn't privelege escalate on their own. Most editos are either used as sudo vim or can do privelege escalation internally, such as kate and emacs.

sudo -E is an important case where the environment must be preserved, for example, when you're doing something that the original sudo is ill-equipped to do, that is running a graphical application. The implementation is considered sub-par, to the point, where both KDE and Gnome had their own replacements, kdesudo and gsudo. Both deprecated by the way. The consensus, is that if you have the technical budget to create a graphical program, you surely also have the technical budget to do privelege escalation properly.

This program is configured via the sudoers file. The trouble with that file, is that it has an obtuse syntax, and must be edited with a special program: visudo. Don't you feel like you're safe already?

Doas

Doas is what sudo should have been. It's a TUI-only alternative to sudo, that uses the same mechanism, but by virtue of being much smaller, and better maintained, seems to have fewer unknown vulnerabilities.

The entire man page for doas fits into half a screen. Its usage is small-enough so that people undestand what it actually does.

The configuration file is both straightforward, and can be specified via the -c flag, which usually means that the user can easily change it. The greatest improvement that doas offers over sudo is that it actually explains much of the stuff that is buried deep in the abstractions.

I found it much easier to try and set up particular rules for particular programs. If you ask me, just use doas if you have the ability to do so.

Polkit

This is what I use. This program is likely to come pre-installed. It is what systemd falls back on, if you try to perform an action that needs root priveleges, but you forgot to use sudo. Its main advantage is that it lives in the modern day and age. It is a program that integrates with your desktop environment, and you can make WMs work just as well. You can make rules in .... ewww... JavaScript. But other than that, the program is fairly straightforward.

Ideally, it doesn't require any input. Any operation that must require privelege escalation, must be performed in an isolated process and the privelege must be de-escalated as quickly as possible. That is not something that you can do, while keeping the UX of sudo, where sudo make has different abilities to just regular make.

One reason I choose to use it as the SUID binary with paru, is because I often use it to compile emacs-git, and that takes a while. I often put it in the background and do other stuff. On more than one occasion, I had to re-run the compilation several times with sudo, because I missed the time when the terminal prompted me for input. Sure, I now know that konsole has a way to monitor for silence, but that is neither here nor there. Add pkexec as a drop-in replacement for sudo and you're golden.

As an added bonus, you have the option to do this:

WRAPPER USAGE
       To avoid modifying existing software to prefix their command-line invocations with pkexec, it's possible to use pkexec in a she-bang wrapper[1]
       like this:

           #!/usr/bin/pkexec /usr/bin/python

           import os
           import sys

           print "Hello, I'm running as uid %d"%(os.getuid())

           for n in range(len(sys.argv)):
               print "arg[%d]=‘%s'"%(n, sys.argv[n])

       If this script is installed into /usr/bin/my-pk-test, then the following annotations

             [...]
             <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/python</annotate>
             <annotate key="org.freedesktop.policykit.exec.argv1">/usr/bin/my-pk-test</annotate>
             [...]

       can be used to select the appropriate polkit action. Be careful to get the latter annotation right, otherwise it will match any pkexec invocation
       of /usr/bin/python scripts.

So the user experience can be improved at the source, and packaged up. For obvious reasons, the rules need to be edited in some way, and the mornonic choice of using XML is a pain, but the work in making the system be standard, be reliable, and be supported by multiple applications is already done. I think that the suckless crowd would find it far easier to patch in a different file type, rather than try and implement their own, inferior design.

Systemd run0

This program is quite an interesting beast. I tried to hate it, and almost managed to do so, but at some point I realised that it is actually a very good substitute for sudo. It is not an SUID program, and as a consequence, the security of it, in places where SUID style privelege escalation would be problematic, and re-writing programs to use something like polkit would be difficult, run0 finds a nice niche.

I can see myself using run0 and polkit exclusively. But the program hasn't been well-tested, so feel free to experiment with it, but don't blame me if it breaks. It's all very early days.