Thread (44 messages) 44 messages, 10 authors, 2019-06-12

Re: [RFC][PATCH 00/10] Mount, FS, Block and Keyrings notifications [ver #3]

From: David Howells <dhowells@redhat.com>
Date: 2019-06-06 21:17:23
Also in: keyrings, linux-block, linux-fsdevel, linux-security-module, linux-usb, lkml

Andy Lutomirski [off-list ref] wrote:
quoted
quoted
You are allowing arbitrary information flow between T and W above.  Who
cares about notifications?
I do. If Watched object is /dev/null no data flow is possible.
There are many objects on a modern Linux system for which this
is true. Even if it's "just a file" the existence of one path
for data to flow does not justify ignoring the rules for other
data paths.
Aha!

Even ignoring security, writes to things like /dev/null should
probably not trigger notifications to people who are watching
/dev/null.  (There are probably lots of things like this: /dev/zero,
/dev/urandom, etc.)
Even writes to /dev/null might generate access notifications; leastways,
vfs_read() will call fsnotify_access() afterwards on success.

Whether or not you can set marks on open device files is another matter.
David, are there any notification types that have this issue in your
patchset?  If so, is there a straightforward way to fix it?
I'm not sure what issue you're referring to specifically.  Do you mean whether
writes to device files generate notifications?
Generically, it seems like maybe writes to device nodes shouldn't trigger
notifications since, despite the fact that different openers of a device
node share an inode, there isn't necessarily any connection between them.
With the notification types I have currently implemented, I don't even notice
any accesses to a device file unless:

 (1) Someone mounts over the top of one.

 (2) The access triggers an I/O error or device reset or causes the device to
     be attached or detached.

 (3) Wangling the device causes some other superblock event.

 (4) The driver calls request_key() and that creates a new key.
Casey, if this is fixed in general, do you have another case where the
right to write and the right to read do not imply the right to
communicate?
quoted
An analogy is that two processes with different UIDs can open a file,
but still can't signal each other.
What do you mean "signal"?  If two processes with different UIDs can
open the same file for read and write, then they can communicate with
each other in many ways.  For example, one can write to the file and
the other can read it.  One can take locks and the other can read the
lock state.  They can both map it and use any number of memory access
side channels to communicate.  But, of course, they can't send each
other signals with kill().

If, however, one of these processes is using some fancy mechanism
(inotify, dnotify, kqueue, fanotify, whatever) to watch the file, and
the other one writes it, then it seems inconsistent to lie to the
watching process and say that the file wasn't written because some
security policy has decided to allow the write, allow the read, but
suppress this particular notification.  Hence my request for a real
example: when would it make sense to do this?
Note that fanotify requires CAP_SYS_ADMIN, but inotify and dnotify do not.

dnotify is applied to an open file, so it might be usable on a chardev such as
/dev/null, say.

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