On 06/01/14 22:51, Peter Hutterer wrote:
On Sun, Jan 05, 2014 at 07:34:23PM -0500, Mouse wrote:
[...the security extension...]  A lot of people use X remotely with
ssh which is unsafe without something like this.

What's unsafe about that?  I don't see anything offhand, but I haven't
thought about it for long enough for that to mean much.

ssh merely encrypts the connections between the two hosts, but the usual
issues with X itself still apply (every client has access to every other
client, more-or-less).

Cheers,
    Peter

That's not (completely) correct.

In openssh, ssh -X gives you an untrusted client, and you need ssh -Y in order to get a X11 client with access to the other, local, clients.


What I would like to see are mutually untrusted clients, so they can't snoop each other and eventually you could have an environment with every application ‘untrusted’.

The changes to Xext/security.c seem minor (see below) and for the common case where the X11 client connects to the server using a local socket, the pid of the process which opened the socket (usually available in some OS-specific way) seem a good identifier (would need to take care on pid reuse). Another option would be to assign the id from a counter.

The piece which is more delicate in my opinion is defining the authorization protocol appropiately. The pid could be stored there, there could be a magic value making the X server untrust the client and fetch the id itself…

What do you think?


diff --git a/Xext/securitysrv.h b/Xext/securitysrv.h
index 8904242..d007f19 100644
--- a/Xext/securitysrv.h
+++ b/Xext/securitysrv.h
@@ -63,7 +63,7 @@ extern RESTYPE SecurityAuthorizationResType;
 typedef struct {
     XID id;                     /* resource ID */
CARD32 timeout; /* how long to live in seconds after refcnt == 0 */
-    unsigned int trustLevel;    /* trusted/untrusted */
+    pid_t trustLevel;    /* trusted/untrusted */
     XID group;                  /* see embedding extension */
unsigned int refcnt; /* how many clients connected with this auth */ unsigned int secondsRemaining; /* overflow time amount for >49 days */
diff --git a/Xext/security.c b/Xext/security.c
index 7bf6cc4..80a2e3c 100644
--- a/Xext/security.c
+++ b/Xext/security.c
@@ -59,7 +59,7 @@ static DevPrivateKeyRec stateKeyRec;
 typedef struct {
     unsigned int haveState  :1;
     unsigned int live       :1;
-    unsigned int trustLevel :2;
+    pid_t trustLevel;
     XID authId;
 } SecurityStateRec;

@@ -122,7 +122,7 @@ SecurityDoCheck(SecurityStateRec * subj, SecurityStateRec * obj,
         return Success;
     if (subj->trustLevel == XSecurityClientTrusted)
         return Success;
-    if (obj->trustLevel != XSecurityClientTrusted)
+    if (obj->trustLevel == subj->trustLevel)
         return Success;
     if ((requested | allowed) == allowed)
         return Success;
@@ -401,7 +401,7 @@ ProcSecurityGenerateAuthorization(ClientPtr client)
     int err;                    /* error to return from this function */
XID authId; /* authorization ID assigned by os layer */
     xSecurityGenerateAuthorizationReply rep;    /* reply struct */
-    unsigned int trustLevel;    /* trust level of new auth */
+    pid_t trustLevel;    /* trust level of new auth */
     XID group;                  /* group of new auth */
     CARD32 timeout;             /* timeout of new auth */
     CARD32 *values;             /* list of supplied attributes */
@@ -438,6 +438,7 @@ ProcSecurityGenerateAuthorization(ClientPtr client)
     trustLevel = XSecurityClientUntrusted;
     if (stuff->valueMask & XSecurityTrustLevel) {
         trustLevel = *values++;
+        /* Store the pid here */
         if (trustLevel != XSecurityClientTrusted &&
             trustLevel != XSecurityClientUntrusted) {
             client->errorValue = trustLevel;


_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to