Authorized clients

Sebastian Wick sebastian at sebastianwick.net
Mon Jan 6 16:45:08 PST 2014


Am 2014-01-06 19:33, schrieb Martin Peres:
> Le 06/01/2014 19:10, Sebastian Wick a écrit :
>> Am 2014-01-06 16:05, schrieb Martin Peres:
>>> As I said before, I think trusting applications is taking the problem
>>> the wrong way.
>>> 
>>> What we want is that a screenshot can only happen when the *user* 
>>> wants it.
>>> This is why I think it is the desktop shell's job to launch the
>>> screenshot app when
>>> required by the user. In this case, even if the user can select the 
>>> application
>>> that can perform a screen shot and even if a malicious application 
>>> changes
>>> the default setting, it won't be able to perform screenshots 
>>> silently.
>>> This is what
>>> we want.
>> 
>> It's just not flexible enough. What if you want to autostart a 
>> screen-reader?
> 
> Please provide a better example, this one doesn't make sense. Who
> would want that?
> And if they do want that, they should press a button on their keyboard
> to do just that.

Taking a screenshot from the command line with delay, recording the 
desktop as
soon as a program starts. Making screenshots at a specific times.
There are some valid cases you can't even think of until someone wants 
it.

> Let's not repeat X11's mistakes. Being too lax on security isn't good
> for anyone.
>> 
>>> By allowing some programs (and not the action), you expose yourself 
>>> to
>>> letting the
>>> application record the screen without the user knowing and this is 
>>> not
>>> acceptable.
>> 
>> You would only allow certain functionality to trusted programs. If the 
>> program
>> does something unexpected or malicious you should not trust the 
>> program.
>> You would also know which program uses which functionality so you 
>> could inform
>> the user about it.
> 
> See, I hate the term "trusted". Just because a program is trusted
> doesn't mean it is
> cannot do anything malicious at some point. Even malicious doesn't
> mean much since,
> to me, malicious means doing something without the user expecting it.
> 
>> 
>>> My proposal is that it should require a physical key pressing to be
>>> able to get ONE
>>> screenshot means we also require a secure input method and can attest 
>>> the origin
>>> of the key stroke but what else can be do? Of course, you should also 
>>> allow key
>>> strokes from the on-screen keyboard, but this application should be 
>>> launched
>>> by the compositor and should be trusted anyway. I should talk to 
>>> Peter
>>> Hutterer about
>>> input security/origin.
>> 
>> Like I said, I think it's too inflexible.
> 
> Please, share a list of valid use cases :) I already gave reasons why
> I think not doing what
> I proposed almost means no confidentiality on the application's 
> buffers.
> 
> Of course, it could be mitigated by making the screen flash or
> something when a screenshot
> is taken but people just hate that and some would even fail to notice 
> it.
> 
> What you want is allowing apps to grab the screen whenever you want.
> Allowing that should
> mean you have root/admin access. A global configuration file could
> disable the screenshooting
> security, but that should be a conscious choice of the administrator
> (for whatever weird reason
> they want to be able to grab the screen).
> 
> However, I re-iterate, this is something stupid security-wise for very
> little benefit. Why don't you
> want to associate a physical event to start the recording process?

I just don't agree that a restricted protocol is only useful if the user
interacts with it.

>>> Martin, I would rather not use cgroups for that because it isn't
>>> stable yet and I'm sure
>>> we can find a solution that doesn't depend on it.
>> 
>> I do agree on this one but I'm not even sure how cgroups would be 
>> useful.
>> 
>> 
>> The problem we have is relatively simple. We want a protocol to be 
>> restricted to
>> certain clients. Which means:
>> 1. The program of the client must not be manipulated by ptrace, 
>> LD_PRELOAD etc.
>> 2. The communication must be separate from other clients to prevent 
>> snooping
>> 3. The compositor must decide if a client may use the protocol or not
>> 
>> The only way I know to achieve 1. is by starting the program by 
>> another trusted
>> application. The compositor is one of them.
>> 
>> Making the communication separate works by passing a new socket to the 
>> program
>> and the only way I know of is by passing it to the program when 
>> starting it.
>> 
>> To decide if a client may use a protocol we could outsource the whole 
>> decision
>> to polkit and just pass enough information so it can make a good 
>> decision.
>> 
>> All in all I think the best and most simple way to do it is by 
>> starting the
>> program by the compositor, passing a new socket, then let the client 
>> ask
>> for permission to use a protocol and pass the request to polkit.
>> 
>> The permission would be per-connection so if a program started by the
>> compositor starts another program with a client it would have the same
>> permission as the parent.
> 
> Fully agree on this.
>> 
>> That also means that we need a protocol to tell the compositor to 
>> start a
>> program with a new socket and a protocol to ask the compositor for 
>> permission.
> 
> Why do you want to create so many protocols? The compositor simply has 
> to create
> a new connection to itself, mark this connection as being allowed to
> do one screenshot,
> then fork. The child should then exec the wanted process. The new
> process will simply
> access the already-opened fd and communicate with the server with it
> (yes, some FDs
> from the parent can still exist in the child process, after the exec).
> 
> That should be the way for privileged application to communicate with
> the compositor.
> No authentication protocol needed, the compositor is responsible for 
> doing
> the authentication the way it pleases him.

You're right about the authentication protocol but there must be a way 
to tell the
compositor to start an application without having a key-binding or such 
a thing.
When a client uses the protocol, the compositor would then do what you 
described.

>> Polkit should be flexible enough to allow a protocol based on how a 
>> program
>> was started. You could configure polkit that if the compositor started 
>> a program
>> because of a key-binding it has permission to use a protocol and stuff 
>> like that.
> 
> I haven't studied polkit, I don't know.

I'm going to ask someone who knows more about polkit but from what I 
understand we
can pass arguments to polkit rules.
We don't even have to argue about if only clients started by a user 
action get
permission because we can simply pass to polkit if the client was 
started by a user
action and let polkit decide.

> Cheers,
> Martin
> 
> PS: I hope I have managed to express my view in an understandable way

I do understand where you're coming from. I just don't think that we 
have to solve
the problem when others can do it for us.


More information about the wayland-devel mailing list