openSUSE / libpathrs

C-friendly API to make path resolution safer on Linux.
GNU Lesser General Public License v3.0
66 stars 5 forks source link

/proc hardening #7

Closed cyphar closed 1 month ago

cyphar commented 4 years ago

Right now, we do a few security checks when operating on /proc, namely:

Unfortunately, this method is still vulnerable to potential attacks if we're in a situation where /proc (usually thanks to a confused deputy) has been set up in such a way to trick us into thinking (for instance) that we are writing an AppArmor label when in fact we aren't.

Effectively we need to use the resolution capabilities of libpathrs for /proc (which leads to some fun re-entrancy issues since libpathrs depends on using /proc during resolution). So that will need some attention.

Note that checking that a given Handle has PROC_SUPER_MAGIC is not sufficient at all because you can always bind-mount another process's procfs file to your own -- and for write-related requests you can just bind-mount a file which no-ops on write like /proc/self/sched.

The set of underlying features currently required are:

the8472 commented 3 years ago

A way, at least for sufficiently privileged processes, to avoid bind-mount attacks is to create a private procfs instance with new mount API and then operate on the detached, untainted tree.

Edit: Nevermind, I see that's already mentioned in one of the linked issues.

cyphar commented 3 years ago

Yeah that is one of the options. Ideally that will be the long-term solution (with subset=pids,hidepid=4 we should be able to make creating a private procfs instance safe for unprivileged users). But for now we can only do that for privileged users.

cyphar commented 1 month ago

https://github.com/cyphar/filepath-securejoin/pull/13 has an implementation of most of this, though it only works for privileged users and on a new enough kernel (Linux 5.8-ish).