[systemd-devel] udisks in systemd user-sessions (or kdbus in future)

David Herrmann dh.herrmann at gmail.com
Wed Mar 11 09:09:42 PDT 2015


Hi

On Mon, Mar 9, 2015 at 1:32 PM, Simon McVittie
<simon.mcvittie at collabora.co.uk> wrote:
> (udisks developers, please see
> <http://lists.freedesktop.org/archives/systemd-devel/2015-January/027711.html>
> if you need more background on login sessions vs. user-sessions.)
>
> I'm developing a patch for udisks to fix its interaction with systemd
> user-sessions (, and I would like to check that the behaviour I propose
> is consistent with udisks' and systemd's security models.
>
> Background
> ----------
>
> In systemd user sessions, some of a user's processes can exist outside
> the scope of any particular login session:
>
> └─user.slice
>   └─user-1000.slice
>     ├─user at 1000.service
>     │ ├─2089 /lib/systemd/systemd --user
>     │ └─dbus.service
>     │   ├─ 2233 /usr/bin/dbus-daemon …
>     │   ├─ 2297 /usr/lib/gvfs/gvfsd
>     │   …
>     └─session-2.scope
>       ├─ 2102 gnome-session
>       ├─ 2376 /usr/bin/gnome-shell
>>
> This model is currently a non-default opt-in thing if you use
> dbus-daemon: you have to either use dbus 1.9.x and --enable-user-session
> (e.g. the dbus-user-session package in Debian experimental), or install
> third-party bits like user-session-units. However, I hope to make it the
> default one day, and it is the only model supported by kdbus. The
> systemd/kdbus developers have indicated that they have no interest in
> supporting the traditional "D-Bus session bus per login session" model.
>
> If processes outside login sessions don't have access to devices on
> those login sessions' seats, then gvfsd won't be able to mount devices.
> Conversely, there is no privilege boundary between the login sessions
> and the same user's non-login-session processes - in particular, the
> user's processes can usually ptrace each other and write to each other's
> configuration files - so isolating them doesn't make a great deal of sense.
>
> How udisks works now
> --------------------
>
> udisks currently has this pseudocode to determine whether I may mount a
> device, and similar logic for other operations:
>
>     let requesting_seat = requesting process->login_session->seat
>     let device_seat = device->seat
>     if (device_seat && requesting_seat &&
>             requesting_seat == device_seat) {
>         use a polkit rule like org.freedesktop.udisks2.filesystem-mount
>             (by default, requires either an active login session or
>             admin authentication)
>     } else {
>         use a polkit rule like
>         org.freedesktop.udisks2.filesystem-mount-other-seat
>             (by default, requires admin authentication regardless)
>     }
>
> However, that breaks down for the user-session model: in particular,
> shared processes like gvfsd live outside the scope of any particular
> login session. When gnome-disks asks gvfsd to ask udisks to mount a
> disk, udisks sees that the request came from gvfsd, sees that gvfsd is
> not in a login session, and uses the more strictly-controlled
> filesystem-mount-other-seat action.
>
> How I propose it should work
> ----------------------------
>
> I propose to change it to this pseudocode, for which I'm developing a patch:
>
>     let device_seat = device->seat
>
>     if (device_seat) {
>         let active_sessions = requesting uid's active login sessions
>
>         foreach session in active_sessions {
>             if session->seat && session->seat == device_seat {
>                 use a polkit rule like
>                     org.freedesktop.udisks2.filesystem-mount
>                 return
>             }
>         }
>     }
>
>     use a polkit rule like
>         org.freedesktop.udisks2.filesystem-mount-other-seat
>
> (In practice I'd use sd_uid_is_on_seat() rather than looping over active
> sessions myself.)
>
> I'm specifically looking for one or more *active* sessions on the
> device's seat because with fast-user-switching, you could in principle
> encounter a situation like this:
>
> user.slice
> ├─ alice
> │  ├─ graphical session on seat0, tty7, active
> │  └─ system --user
> ├─ bob
> │  ├─ graphical session on seat0, tty8, inactive
> │  ├─ graphical session on seat1, active
> │  └─ systemd --user
> └─ chris
>    ├─ ssh session on no seat, active
>    └─ systemd --user
>
> In that situation, I think the desired behaviour is that alice controls
> seat0 devices and bob controls seat1 devices, corresponding to their
> respective physically-present locations; bob should not have control
> over seat0 devices until he returns to seat0, and chris should not have
> control over either.
>
> udisks developers: is this consistent with how you think it should work?
>
> systemd/kdbus developers: is this consistent with how you think
> situations like this should work in the kdbus-based future?

Yes!

> (This sort of thing is one of the reasons I was keen to make D-Bus
> support user sessions without requiring kdbus - if we can get this sort
> of thing fixed now, in parallel with the kdbus developers getting it
> through kernel review, then that's one less regression to fix when kdbus
> eventually lands.)

I fully agree!

Thanks
David


More information about the systemd-devel mailing list