On 10.10.2013 19:15, Schaufler, Casey wrote:
Only if you look, and you still don't know if the other side broke the 
connection and is still running or if it died and there's a different process 
running with the same pid.

For example in gsignond we have p2p socket for D-Bus, so in case the other end broke the connection, by doing so it also ceased to receive any services and all it's remote objects were destroyed.

If it's a different process under same PID, then the socket descriptor cannot be valid anymore.

Except that the original process could have close()d the socket and still be running, so 
the test in (3) yields a false negative. And, how do you do validate that "(1) is 
still intact"?

If it did so, then we wouldn't perform any action for it either anymore. It can get the request done at phase (1) completed only by being around at (3) too, since it is anyway required in order to receive reply to the D-Bus message.

You get error if the socket's other end was terminated at least latest when you try to read() or write() to it. IMO, getsockopt(SO_PEERCRED) should also fail if the peer has closed the socket and terminated the process (I have not verified this yet though, but it is easy to do).


The way I implemented ACL in gSSO for standard Linux desktop (just DAC enabled, no MAC support) is that we have a p2p D-Bus over socket between client application and gsignond (works also with session&system bus). When request is received over the socket, SO_PEERCRED is used to fetch callers PID and then /proc/PID/exe symlink is dereferenced to binary path of the caller which is then compared against the ACL defined for stored credential and then response is performed and sent back over the same socket. So in case the application terminated meanwhile and the process got replaced with something else, the application wouldn't be able to receive the response it wanted. Or at least it had voluntarily given up it's privileges to someone else... If someone has better ideas how to do it with D-Bus I'd be more than happy to hear about it!


--- 8< --- (maybe OT)
In these cases databases are also protected from the user, gsignond is running with setgid to "gsignond" group, but running with users' uid. Then databases are stored in a directory that is only accessible to uid=root gid=gsignond while per-user database is only accessible to uid=user gid=gsignond. User is not member of "gsignond" group. This way user cannot access the database directory, while gsignond cannot accidentally access databases of other users even if it had a bug...

_______________________________________________
Dev mailing list
[email protected]
https://lists.tizen.org/listinfo/dev

Reply via email to