>>  proc_map_files_get_link(struct dentry *dentry,
>>                      struct inode *inode,
>>                      struct delayed_call *done)
>>  {
>> -    if (!capable(CAP_SYS_ADMIN))
>> +    if (!(capable(CAP_SYS_ADMIN) || capable(CAP_CHECKPOINT_RESTORE)))
>>              return ERR_PTR(-EPERM);

> First of all -- sorry for late reply. You know, looking into this code more I 
> think this CAP_SYS_ADMIN is simply wrong: for example I can't even fetch 
> links for /proc/self/map_files. Still /proc/$pid/maps (which as well points 
> to the files opened) test for ptrace-read permission. I think we need 
> ptrace-may-attach test here instead of these capabilities (if I can attach to 
> a process I can read any data needed, including the content of the mapped 
> files, if only I'm not missing something obvious).

Currently /proc/pid/map_files/* have exactly the same permission checks as 
/proc/pid/fd/*, with the exception of the extra CAP_SYS_ADMIN check. The check 
originated from the following discussions where 3 security issues are discussed:
http://lkml.iu.edu/hypermail/linux/kernel/1505.2/02524.html
http://lkml.iu.edu/hypermail/linux/kernel/1505.2/04030.html

>From what I understand, the extra CAP_SYS_ADMIN comes from the following 
>issues:
1. Being able to open dma-buf / kdbus region (referred in the referenced email 
as problem #1). I don't fully understand what the dangers are, but perhaps we 
could do CAP_SYS_ADMIN check only for such dangerous files, as opposed to all 
files.
2. /proc/pid/fd/* is already a security hole (Andy says "I hope to fix that 
some day"). He essentially says that it's not because fds are insecure that 
map_files should be too. He seems to claim that mapped files that are then 
closed seems to be a bigger concern than other opened files. However, in the 
present time (5 years after these email conversations), the fd directory does 
not have the CAP_SYS_ADMIN check which doesn't convinces me that the holes of 
/proc/pid/fd/* are such a big of a deal. I'm not entirely sure what security 
issue Andy refers to, but, I understand something along the lines of: Some 
process gets an fd of a file read-only opened (via a unix socket for example, 
or after a chroot), and gets to re-open the file in write access via 
/proc/self/fd/N to do some damage.
3. Being able to ftruncate a file after a chroot+privilege drop. I may be 
wrong, but if privileges were dropped, then there's no reason that the then 
unprivileged user would have write access to the mmaped file inode. Seems a 
false problem.

It turns out that some of these concerns have been addressed with the 
introduction of memfd with seals, introduced around the same time where the 
map_files discussions took place. These seals allow one to share write access 
of an mmap region to an unsecure program, without fearing of getting a SIGBUS 
because the unsecure program could call ftruncate() on the fd. More on that at 
https://lwn.net/Articles/593918/ . Also, that article says "There are a number 
of fairly immediate use cases for the sealing functionality in general. 
Graphics drivers could use it to safely receive buffers from applications. The 
upcoming kdbus transport can benefit from sealing.". This rings a bell with 
problem #1. Perhaps memfd is a solution to Andy's concerns?

Overall, I think the CAP_SYS_ADMIN map_files/ extra check compared to fd/ does 
not improve security in practice. Fds will be given to insecure programs. 
Better security can be achieved with memfd seals, and sane permissioning on 
files, regardless if they were once closed.

I think Adrian added a CAP_CHECKPOINT_RESTORE on the map_files to avoid opening 
a can of worm. But I guess the cat is out of the bag now.

-Nico

Reply via email to