Thread (6 messages) 6 messages, 3 authors, 2021-06-01

Re: fsnotify events for overlayfs real file

From: Christian Brauner <hidden>
Date: 2021-06-01 09:08:15
Also in: linux-unionfs

On Mon, May 31, 2021 at 09:26:35PM +0300, Amir Goldstein wrote:
On Mon, May 31, 2021 at 6:18 PM Miklos Szeredi [off-list ref] wrote:
quoted
On Tue, 18 May 2021 at 19:56, Amir Goldstein [off-list ref] wrote:
quoted
On Tue, May 18, 2021 at 5:43 PM Miklos Szeredi [off-list ref] wrote:
quoted
On Mon, 10 May 2021 at 18:32, Amir Goldstein [off-list ref] wrote:
quoted
quoted
quoted
My thinking was that we can change d_real() to provide the real path:

static inline struct path d_real_path(struct path *path,
                                    const struct inode *inode)
{
        struct realpath = {};
        if (!unlikely(dentry->d_flags & DCACHE_OP_REAL))
               return *path;
        dentry->d_op->d_real(path->dentry, inode, &realpath);
        return realpath;
}
Real paths are internal, we can't pass them (as fd in permission
events) to userspace.
quoted
quoted
quoted

Another option, instead of getting the realpath, just detect the
mismatch of file_inode(file) != d_inode(path->dentry) in
fanotify_file() and pass FSNOTIFY_EVENT_DENTRY data type
with d_real() dentry to backend instead of FSNOTIFY_EVENT_PATH.

For inotify it should be enough and for fanotify it is enough for
FAN_REPORT_FID and legacy fanotify can report FAN_NOFD,
so at least permission events listeners can identify the situation and
be able to block access to unknown paths.
That sounds like a good short term solution.
It may be a fine academic solution, but I don't think it solves any real
world problem.
I am not aware of any security oriented solutions that use permission
events on inode or directory (let alone sb).

The security oriented users of fanotify are anti-virus on-access
protection engines and those are using mount marks anyway
(dynamically adding them as far as I know).
[cc Marko who may be able to shed some light]

For those products, creating a bind mount inside a new mount ns
may actually escape the on-access policy or the new mount will
also be marked I am not sure. I suppose cloning mount ns may be
prohibited by another LSM or something(?).
Yes, this can be restricted in multiple ways. Three spring to mind right
away:
- procfs: write a really low number to /proc/sys/user/max_mnt_namespaces
- seccomp: prevent the clone3() syscall, prevent the legacy clone()
  syscall with CLONE_NEWNS, prevent unshare(CLONE_NEWNS)
- use LSM
quoted
quoted
Is there a reason for the fake path besides the displayed path in
/proc/self/maps?
I'm not aware of any.
quoted
Does it make sense to keep one realfile with fake path for mmaped
files along side a realfile with private/detached path used for all the
other operations?
This should work, but it would add more open files,
True, but only for the mmaped files.
quoted
so needs some good justifications.
I'm afraid I don't have one yet..
Let's see what the AV vendors have to say.

Thanks,
Amir.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help