CVE-2015-3164
http://lists.freedesktop.org/archives/wayland-devel/2015-June/022548.html
This commit is contained in:
parent
2d1fe9d31e
commit
d0fa93e2f8
@ -0,0 +1,90 @@
|
|||||||
|
From d80ec479f17bf0931b9332b4f3959c19ec62aba1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ray Strode <rstrode@redhat.com>
|
||||||
|
Date: Thu, 23 Apr 2015 14:10:23 -0400
|
||||||
|
Subject: [PATCH 1/3] xwayland: Enable access control on open sockets
|
||||||
|
[CVE-2015-3164 1/3]
|
||||||
|
|
||||||
|
Xwayland currently allows wide-open access to the X sockets
|
||||||
|
it listens on, ignoring Xauth access control.
|
||||||
|
|
||||||
|
This commit makes sure to enable access control on the sockets,
|
||||||
|
so one user can't snoop on another user's X-over-wayland
|
||||||
|
applications.
|
||||||
|
|
||||||
|
Signed-off-by: Ray Strode <rstrode@redhat.com>
|
||||||
|
Reviewed-by: Daniel Stone <daniels@collabora.com>
|
||||||
|
Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
|
||||||
|
---
|
||||||
|
hw/xwayland/xwayland.c | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c
|
||||||
|
index 7e8d667..c5bee77 100644
|
||||||
|
--- a/hw/xwayland/xwayland.c
|
||||||
|
+++ b/hw/xwayland/xwayland.c
|
||||||
|
@@ -456,61 +456,61 @@ block_handler(void *data, struct timeval **tv, void *read_mask)
|
||||||
|
FatalError("failed to dispatch Wayland events: %s\n",
|
||||||
|
strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
|
xwl_screen->prepare_read = 1;
|
||||||
|
|
||||||
|
ret = wl_display_flush(xwl_screen->display);
|
||||||
|
if (ret == -1)
|
||||||
|
FatalError("failed to write to XWayland fd: %s\n", strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
|
static CARD32
|
||||||
|
add_client_fd(OsTimerPtr timer, CARD32 time, void *arg)
|
||||||
|
{
|
||||||
|
struct xwl_screen *xwl_screen = arg;
|
||||||
|
|
||||||
|
if (!AddClientOnOpenFD(xwl_screen->wm_fd))
|
||||||
|
FatalError("Failed to add wm client\n");
|
||||||
|
|
||||||
|
TimerFree(timer);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
listen_on_fds(struct xwl_screen *xwl_screen)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < xwl_screen->listen_fd_count; i++)
|
||||||
|
- ListenOnOpenFD(xwl_screen->listen_fds[i], TRUE);
|
||||||
|
+ ListenOnOpenFD(xwl_screen->listen_fds[i], FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
wm_selection_callback(CallbackListPtr *p, void *data, void *arg)
|
||||||
|
{
|
||||||
|
SelectionInfoRec *info = arg;
|
||||||
|
struct xwl_screen *xwl_screen = data;
|
||||||
|
static const char atom_name[] = "WM_S0";
|
||||||
|
static Atom atom_wm_s0;
|
||||||
|
|
||||||
|
if (atom_wm_s0 == None)
|
||||||
|
atom_wm_s0 = MakeAtom(atom_name, strlen(atom_name), TRUE);
|
||||||
|
if (info->selection->selection != atom_wm_s0 ||
|
||||||
|
info->kind != SelectionSetOwner)
|
||||||
|
return;
|
||||||
|
|
||||||
|
listen_on_fds(xwl_screen);
|
||||||
|
|
||||||
|
DeleteCallback(&SelectionCallback, wm_selection_callback, xwl_screen);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Bool
|
||||||
|
xwl_screen_init(ScreenPtr pScreen, int argc, char **argv)
|
||||||
|
{
|
||||||
|
struct xwl_screen *xwl_screen;
|
||||||
|
Pixel red_mask, blue_mask, green_mask;
|
||||||
|
int ret, bpc, green_bpc, i;
|
||||||
|
|
||||||
|
xwl_screen = calloc(sizeof *xwl_screen, 1);
|
||||||
|
if (xwl_screen == NULL)
|
||||||
|
--
|
||||||
|
2.3.7
|
||||||
|
|
484
0002-os-support-new-implicit-local-user-access-mode-CVE-2.patch
Normal file
484
0002-os-support-new-implicit-local-user-access-mode-CVE-2.patch
Normal file
@ -0,0 +1,484 @@
|
|||||||
|
From 6003510f40dd64f8cd1c060b6fd5ca40d48d3e6d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ray Strode <rstrode@redhat.com>
|
||||||
|
Date: Thu, 23 Apr 2015 15:36:09 -0400
|
||||||
|
Subject: [PATCH 2/3] os: support new implicit local user access mode
|
||||||
|
[CVE-2015-3164 2/3]
|
||||||
|
|
||||||
|
If the X server is started without a '-auth' argument, then
|
||||||
|
it gets started wide open to all local users on the system.
|
||||||
|
|
||||||
|
This isn't a great default access model, but changing it in
|
||||||
|
Xorg at this point would break backward compatibility.
|
||||||
|
|
||||||
|
Xwayland, on the other hand is new, and much more targeted
|
||||||
|
in scope. It could, in theory, be changed to allow the much
|
||||||
|
more secure default of a "user who started X server can connect
|
||||||
|
clients to that server."
|
||||||
|
|
||||||
|
This commit paves the way for that change, by adding a mechanism
|
||||||
|
for DDXs to opt-in to that behavior. They merely need to call
|
||||||
|
|
||||||
|
LocalAccessScopeUser()
|
||||||
|
|
||||||
|
in their init functions.
|
||||||
|
|
||||||
|
A subsequent commit will add that call for Xwayland.
|
||||||
|
|
||||||
|
Signed-off-by: Ray Strode <rstrode@redhat.com>
|
||||||
|
Reviewed-by: Daniel Stone <daniels@collabora.com>
|
||||||
|
Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
|
||||||
|
---
|
||||||
|
include/os.h | 17 ++++++++++
|
||||||
|
os/access.c | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
os/auth.c | 8 ++---
|
||||||
|
3 files changed, 130 insertions(+), 4 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/include/os.h b/include/os.h
|
||||||
|
index 3e68c49..3c3954f 100644
|
||||||
|
--- a/include/os.h
|
||||||
|
+++ b/include/os.h
|
||||||
|
@@ -386,65 +386,82 @@ InvalidHost(sockaddrPtr /*saddr */ , int /*len */ , ClientPtr client);
|
||||||
|
#define LCC_ZID_SET (1 << 3)
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int fieldsSet; /* Bit mask of fields set */
|
||||||
|
int euid; /* Effective uid */
|
||||||
|
int egid; /* Primary effective group id */
|
||||||
|
int nSuppGids; /* Number of supplementary group ids */
|
||||||
|
int *pSuppGids; /* Array of supplementary group ids */
|
||||||
|
int pid; /* Process id */
|
||||||
|
int zoneid; /* Only set on Solaris 10 & later */
|
||||||
|
} LocalClientCredRec;
|
||||||
|
|
||||||
|
extern _X_EXPORT int
|
||||||
|
GetLocalClientCreds(ClientPtr, LocalClientCredRec **);
|
||||||
|
extern _X_EXPORT void
|
||||||
|
FreeLocalClientCreds(LocalClientCredRec *);
|
||||||
|
|
||||||
|
extern _X_EXPORT int
|
||||||
|
ChangeAccessControl(ClientPtr /*client */ , int /*fEnabled */ );
|
||||||
|
|
||||||
|
extern _X_EXPORT int
|
||||||
|
GetAccessControl(void);
|
||||||
|
|
||||||
|
extern _X_EXPORT void
|
||||||
|
AddLocalHosts(void);
|
||||||
|
|
||||||
|
extern _X_EXPORT void
|
||||||
|
ResetHosts(const char *display);
|
||||||
|
|
||||||
|
extern _X_EXPORT void
|
||||||
|
+EnableLocalAccess(void);
|
||||||
|
+
|
||||||
|
+extern _X_EXPORT void
|
||||||
|
+DisableLocalAccess(void);
|
||||||
|
+
|
||||||
|
+extern _X_EXPORT void
|
||||||
|
EnableLocalHost(void);
|
||||||
|
|
||||||
|
extern _X_EXPORT void
|
||||||
|
DisableLocalHost(void);
|
||||||
|
|
||||||
|
+#ifndef NO_LOCAL_CLIENT_CRED
|
||||||
|
+extern _X_EXPORT void
|
||||||
|
+EnableLocalUser(void);
|
||||||
|
+
|
||||||
|
+extern _X_EXPORT void
|
||||||
|
+DisableLocalUser(void);
|
||||||
|
+
|
||||||
|
+extern _X_EXPORT void
|
||||||
|
+LocalAccessScopeUser(void);
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
extern _X_EXPORT void
|
||||||
|
AccessUsingXdmcp(void);
|
||||||
|
|
||||||
|
extern _X_EXPORT void
|
||||||
|
DefineSelf(int /*fd */ );
|
||||||
|
|
||||||
|
#if XDMCP
|
||||||
|
extern _X_EXPORT void
|
||||||
|
AugmentSelf(void *from, int len);
|
||||||
|
|
||||||
|
extern _X_EXPORT void
|
||||||
|
RegisterAuthorizations(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern _X_EXPORT void
|
||||||
|
InitAuthorization(const char * /*filename */ );
|
||||||
|
|
||||||
|
/* extern int LoadAuthorization(void); */
|
||||||
|
|
||||||
|
extern _X_EXPORT int
|
||||||
|
AuthorizationFromID(XID id,
|
||||||
|
unsigned short *name_lenp,
|
||||||
|
const char **namep,
|
||||||
|
unsigned short *data_lenp, char **datap);
|
||||||
|
|
||||||
|
extern _X_EXPORT XID
|
||||||
|
CheckAuthorization(unsigned int /*namelength */ ,
|
||||||
|
const char * /*name */ ,
|
||||||
|
unsigned int /*datalength */ ,
|
||||||
|
const char * /*data */ ,
|
||||||
|
diff --git a/os/access.c b/os/access.c
|
||||||
|
index 28f2d32..c9f8a1f 100644
|
||||||
|
--- a/os/access.c
|
||||||
|
+++ b/os/access.c
|
||||||
|
@@ -75,60 +75,64 @@ SOFTWARE.
|
||||||
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
* DEALINGS IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_DIX_CONFIG_H
|
||||||
|
#include <dix-config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
#include <X11/Xwinsock.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#define XSERV_t
|
||||||
|
#define TRANS_SERVER
|
||||||
|
#define TRANS_REOPEN
|
||||||
|
#include <X11/Xtrans/Xtrans.h>
|
||||||
|
#include <X11/Xauth.h>
|
||||||
|
#include <X11/X.h>
|
||||||
|
#include <X11/Xproto.h>
|
||||||
|
#include "misc.h"
|
||||||
|
#include "site.h"
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#ifndef WIN32
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
|
||||||
|
+#ifndef NO_LOCAL_CLIENT_CRED
|
||||||
|
+#include <pwd.h>
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#if defined(TCPCONN) || defined(STREAMSCONN)
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#endif /* TCPCONN || STREAMSCONN */
|
||||||
|
|
||||||
|
#ifdef HAVE_GETPEERUCRED
|
||||||
|
#include <ucred.h>
|
||||||
|
#ifdef sun
|
||||||
|
#include <zone.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(SVR4) || (defined(SYSV) && defined(__i386__)) || defined(__GNU__)
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
#endif
|
||||||
|
#if defined(SYSV) && defined(__i386__)
|
||||||
|
#include <sys/stream.h>
|
||||||
|
#endif
|
||||||
|
#ifdef __GNU__
|
||||||
|
#undef SIOCGIFCONF
|
||||||
|
#include <netdb.h>
|
||||||
|
#else /*!__GNU__ */
|
||||||
|
#include <net/if.h>
|
||||||
|
#endif /*__GNU__ */
|
||||||
|
|
||||||
|
#ifdef SVR4
|
||||||
|
#include <sys/sockio.h>
|
||||||
|
#include <sys/stropts.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <netdb.h>
|
||||||
|
@@ -198,97 +202,202 @@ static Bool NewHost(int /*family */ ,
|
||||||
|
int /* addingLocalHosts */ );
|
||||||
|
|
||||||
|
/* XFree86 bug #156: To keep track of which hosts were explicitly requested in
|
||||||
|
/etc/X<display>.hosts, we've added a requested field to the HOST struct,
|
||||||
|
and a LocalHostRequested variable. These default to FALSE, but are set
|
||||||
|
to TRUE in ResetHosts when reading in /etc/X<display>.hosts. They are
|
||||||
|
checked in DisableLocalHost(), which is called to disable the default
|
||||||
|
local host entries when stronger authentication is turned on. */
|
||||||
|
|
||||||
|
typedef struct _host {
|
||||||
|
short family;
|
||||||
|
short len;
|
||||||
|
unsigned char *addr;
|
||||||
|
struct _host *next;
|
||||||
|
int requested;
|
||||||
|
} HOST;
|
||||||
|
|
||||||
|
#define MakeHost(h,l) (h)=malloc(sizeof *(h)+(l));\
|
||||||
|
if (h) { \
|
||||||
|
(h)->addr=(unsigned char *) ((h) + 1);\
|
||||||
|
(h)->requested = FALSE; \
|
||||||
|
}
|
||||||
|
#define FreeHost(h) free(h)
|
||||||
|
static HOST *selfhosts = NULL;
|
||||||
|
static HOST *validhosts = NULL;
|
||||||
|
static int AccessEnabled = DEFAULT_ACCESS_CONTROL;
|
||||||
|
static int LocalHostEnabled = FALSE;
|
||||||
|
static int LocalHostRequested = FALSE;
|
||||||
|
static int UsingXdmcp = FALSE;
|
||||||
|
|
||||||
|
+static enum {
|
||||||
|
+ LOCAL_ACCESS_SCOPE_HOST = 0,
|
||||||
|
+#ifndef NO_LOCAL_CLIENT_CRED
|
||||||
|
+ LOCAL_ACCESS_SCOPE_USER,
|
||||||
|
+#endif
|
||||||
|
+} LocalAccessScope;
|
||||||
|
+
|
||||||
|
/* FamilyServerInterpreted implementation */
|
||||||
|
static Bool siAddrMatch(int family, void *addr, int len, HOST * host,
|
||||||
|
ClientPtr client);
|
||||||
|
static int siCheckAddr(const char *addrString, int length);
|
||||||
|
static void siTypesInitialize(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* called when authorization is not enabled to add the
|
||||||
|
* local host to the access list
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
+EnableLocalAccess(void)
|
||||||
|
+{
|
||||||
|
+ switch (LocalAccessScope) {
|
||||||
|
+ case LOCAL_ACCESS_SCOPE_HOST:
|
||||||
|
+ EnableLocalHost();
|
||||||
|
+ break;
|
||||||
|
+#ifndef NO_LOCAL_CLIENT_CRED
|
||||||
|
+ case LOCAL_ACCESS_SCOPE_USER:
|
||||||
|
+ EnableLocalUser();
|
||||||
|
+ break;
|
||||||
|
+#endif
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
EnableLocalHost(void)
|
||||||
|
{
|
||||||
|
if (!UsingXdmcp) {
|
||||||
|
LocalHostEnabled = TRUE;
|
||||||
|
AddLocalHosts();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* called when authorization is enabled to keep us secure
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
+DisableLocalAccess(void)
|
||||||
|
+{
|
||||||
|
+ switch (LocalAccessScope) {
|
||||||
|
+ case LOCAL_ACCESS_SCOPE_HOST:
|
||||||
|
+ DisableLocalHost();
|
||||||
|
+ break;
|
||||||
|
+#ifndef NO_LOCAL_CLIENT_CRED
|
||||||
|
+ case LOCAL_ACCESS_SCOPE_USER:
|
||||||
|
+ DisableLocalUser();
|
||||||
|
+ break;
|
||||||
|
+#endif
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
DisableLocalHost(void)
|
||||||
|
{
|
||||||
|
HOST *self;
|
||||||
|
|
||||||
|
if (!LocalHostRequested) /* Fix for XFree86 bug #156 */
|
||||||
|
LocalHostEnabled = FALSE;
|
||||||
|
for (self = selfhosts; self; self = self->next) {
|
||||||
|
if (!self->requested) /* Fix for XFree86 bug #156 */
|
||||||
|
(void) RemoveHost((ClientPtr) NULL, self->family, self->len,
|
||||||
|
(void *) self->addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifndef NO_LOCAL_CLIENT_CRED
|
||||||
|
+static int GetLocalUserAddr(char **addr)
|
||||||
|
+{
|
||||||
|
+ static const char *type = "localuser";
|
||||||
|
+ static const char delimiter = '\0';
|
||||||
|
+ static const char *value;
|
||||||
|
+ struct passwd *pw;
|
||||||
|
+ int length = -1;
|
||||||
|
+
|
||||||
|
+ pw = getpwuid(getuid());
|
||||||
|
+
|
||||||
|
+ if (pw == NULL || pw->pw_name == NULL)
|
||||||
|
+ goto out;
|
||||||
|
+
|
||||||
|
+ value = pw->pw_name;
|
||||||
|
+
|
||||||
|
+ length = asprintf(addr, "%s%c%s", type, delimiter, value);
|
||||||
|
+
|
||||||
|
+ if (length == -1) {
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Trailing NUL */
|
||||||
|
+ length++;
|
||||||
|
+
|
||||||
|
+out:
|
||||||
|
+ return length;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+EnableLocalUser(void)
|
||||||
|
+{
|
||||||
|
+ char *addr = NULL;
|
||||||
|
+ int length = -1;
|
||||||
|
+
|
||||||
|
+ length = GetLocalUserAddr(&addr);
|
||||||
|
+
|
||||||
|
+ if (length == -1)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ NewHost(FamilyServerInterpreted, addr, length, TRUE);
|
||||||
|
+
|
||||||
|
+ free(addr);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+DisableLocalUser(void)
|
||||||
|
+{
|
||||||
|
+ char *addr = NULL;
|
||||||
|
+ int length = -1;
|
||||||
|
+
|
||||||
|
+ length = GetLocalUserAddr(&addr);
|
||||||
|
+
|
||||||
|
+ if (length == -1)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ RemoveHost(NULL, FamilyServerInterpreted, length, addr);
|
||||||
|
+
|
||||||
|
+ free(addr);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+LocalAccessScopeUser(void)
|
||||||
|
+{
|
||||||
|
+ LocalAccessScope = LOCAL_ACCESS_SCOPE_USER;
|
||||||
|
+}
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* called at init time when XDMCP will be used; xdmcp always
|
||||||
|
* adds local hosts manually when needed
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
AccessUsingXdmcp(void)
|
||||||
|
{
|
||||||
|
UsingXdmcp = TRUE;
|
||||||
|
LocalHostEnabled = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(SVR4) && !defined(sun) && defined(SIOCGIFCONF) && !defined(USE_SIOCGLIFCONF)
|
||||||
|
|
||||||
|
/* Deal with different SIOCGIFCONF ioctl semantics on these OSs */
|
||||||
|
|
||||||
|
static int
|
||||||
|
ifioctl(int fd, int cmd, char *arg)
|
||||||
|
{
|
||||||
|
struct strioctl ioc;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
memset((char *) &ioc, 0, sizeof(ioc));
|
||||||
|
ioc.ic_cmd = cmd;
|
||||||
|
ioc.ic_timout = 0;
|
||||||
|
if (cmd == SIOCGIFCONF) {
|
||||||
|
ioc.ic_len = ((struct ifconf *) arg)->ifc_len;
|
||||||
|
ioc.ic_dp = ((struct ifconf *) arg)->ifc_buf;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
diff --git a/os/auth.c b/os/auth.c
|
||||||
|
index 5fcb538..7da6fc6 100644
|
||||||
|
--- a/os/auth.c
|
||||||
|
+++ b/os/auth.c
|
||||||
|
@@ -154,78 +154,78 @@ RegisterAuthorizations(void)
|
||||||
|
(int) protocols[i].name_length);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
XID
|
||||||
|
CheckAuthorization(unsigned int name_length,
|
||||||
|
const char *name,
|
||||||
|
unsigned int data_length,
|
||||||
|
const char *data, ClientPtr client, const char **reason)
|
||||||
|
{ /* failure message. NULL for default msg */
|
||||||
|
int i;
|
||||||
|
struct stat buf;
|
||||||
|
static time_t lastmod = 0;
|
||||||
|
static Bool loaded = FALSE;
|
||||||
|
|
||||||
|
if (!authorization_file || stat(authorization_file, &buf)) {
|
||||||
|
if (lastmod != 0) {
|
||||||
|
lastmod = 0;
|
||||||
|
ShouldLoadAuth = TRUE; /* stat lost, so force reload */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (buf.st_mtime > lastmod) {
|
||||||
|
lastmod = buf.st_mtime;
|
||||||
|
ShouldLoadAuth = TRUE;
|
||||||
|
}
|
||||||
|
if (ShouldLoadAuth) {
|
||||||
|
int loadauth = LoadAuthorization();
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the authorization file has at least one entry for this server,
|
||||||
|
- * disable local host access. (loadauth > 0)
|
||||||
|
+ * disable local access. (loadauth > 0)
|
||||||
|
*
|
||||||
|
* If there are zero entries (either initially or when the
|
||||||
|
* authorization file is later reloaded), or if a valid
|
||||||
|
- * authorization file was never loaded, enable local host access.
|
||||||
|
+ * authorization file was never loaded, enable local access.
|
||||||
|
* (loadauth == 0 || !loaded)
|
||||||
|
*
|
||||||
|
* If the authorization file was loaded initially (with valid
|
||||||
|
* entries for this server), and reloading it later fails, don't
|
||||||
|
* change anything. (loadauth == -1 && loaded)
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (loadauth > 0) {
|
||||||
|
- DisableLocalHost(); /* got at least one */
|
||||||
|
+ DisableLocalAccess(); /* got at least one */
|
||||||
|
loaded = TRUE;
|
||||||
|
}
|
||||||
|
else if (loadauth == 0 || !loaded)
|
||||||
|
- EnableLocalHost();
|
||||||
|
+ EnableLocalAccess();
|
||||||
|
}
|
||||||
|
if (name_length) {
|
||||||
|
for (i = 0; i < NUM_AUTHORIZATION; i++) {
|
||||||
|
if (protocols[i].name_length == name_length &&
|
||||||
|
memcmp(protocols[i].name, name, (int) name_length) == 0) {
|
||||||
|
return (*protocols[i].Check) (data_length, data, client,
|
||||||
|
reason);
|
||||||
|
}
|
||||||
|
*reason = "Protocol not supported by server\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
*reason = "No protocol specified\n";
|
||||||
|
return (XID) ~0L;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ResetAuthorization(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < NUM_AUTHORIZATION; i++)
|
||||||
|
if (protocols[i].Reset)
|
||||||
|
(*protocols[i].Reset) ();
|
||||||
|
ShouldLoadAuth = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
AuthorizationFromID(XID id,
|
||||||
|
unsigned short *name_lenp,
|
||||||
|
--
|
||||||
|
2.3.7
|
||||||
|
|
@ -0,0 +1,63 @@
|
|||||||
|
From fc11a1d595222932af192e7aef551b98cd3393f2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Ray Strode <rstrode@redhat.com>
|
||||||
|
Date: Thu, 23 Apr 2015 15:39:50 -0400
|
||||||
|
Subject: [PATCH 3/3] xwayland: default to local user if no xauth file given.
|
||||||
|
[CVE-2015-3164 3/3]
|
||||||
|
|
||||||
|
Right now if "-auth" isn't passed on the command line, we let
|
||||||
|
any user on the system connect to the Xwayland server.
|
||||||
|
|
||||||
|
That's clearly suboptimal, given Xwayland is generally designed
|
||||||
|
to be used by one user at a time.
|
||||||
|
|
||||||
|
This commit changes the behavior, so only the user who started the
|
||||||
|
X server can connect clients to it.
|
||||||
|
|
||||||
|
Signed-off-by: Ray Strode <rstrode@redhat.com>
|
||||||
|
Reviewed-by: Daniel Stone <daniels@collabora.com>
|
||||||
|
Reviewed-by: Alan Coopersmith <alan.coopersmith@oracle.com>
|
||||||
|
---
|
||||||
|
hw/xwayland/xwayland.c | 2 ++
|
||||||
|
1 file changed, 2 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/hw/xwayland/xwayland.c b/hw/xwayland/xwayland.c
|
||||||
|
index c5bee77..bc92beb 100644
|
||||||
|
--- a/hw/xwayland/xwayland.c
|
||||||
|
+++ b/hw/xwayland/xwayland.c
|
||||||
|
@@ -675,31 +675,33 @@ static const ExtensionModule xwayland_extensions[] = {
|
||||||
|
void
|
||||||
|
InitOutput(ScreenInfo * screen_info, int argc, char **argv)
|
||||||
|
{
|
||||||
|
int depths[] = { 1, 4, 8, 15, 16, 24, 32 };
|
||||||
|
int bpp[] = { 1, 8, 8, 16, 16, 32, 32 };
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(depths); i++) {
|
||||||
|
screen_info->formats[i].depth = depths[i];
|
||||||
|
screen_info->formats[i].bitsPerPixel = bpp[i];
|
||||||
|
screen_info->formats[i].scanlinePad = BITMAP_SCANLINE_PAD;
|
||||||
|
}
|
||||||
|
|
||||||
|
screen_info->imageByteOrder = IMAGE_BYTE_ORDER;
|
||||||
|
screen_info->bitmapScanlineUnit = BITMAP_SCANLINE_UNIT;
|
||||||
|
screen_info->bitmapScanlinePad = BITMAP_SCANLINE_PAD;
|
||||||
|
screen_info->bitmapBitOrder = BITMAP_BIT_ORDER;
|
||||||
|
screen_info->numPixmapFormats = ARRAY_SIZE(depths);
|
||||||
|
|
||||||
|
LoadExtensionList(xwayland_extensions,
|
||||||
|
ARRAY_SIZE(xwayland_extensions), FALSE);
|
||||||
|
|
||||||
|
/* Cast away warning from missing printf annotation for
|
||||||
|
* wl_log_func_t. Wayland 1.5 will have the annotation, so we can
|
||||||
|
* remove the cast and require that when it's released. */
|
||||||
|
wl_log_set_handler_client((void *) xwl_log_handler);
|
||||||
|
|
||||||
|
if (AddScreen(xwl_screen_init, argc, argv) == -1) {
|
||||||
|
FatalError("Couldn't add screen\n");
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ LocalAccessScopeUser();
|
||||||
|
}
|
||||||
|
--
|
||||||
|
2.3.7
|
||||||
|
|
@ -45,7 +45,7 @@
|
|||||||
Summary: X.Org X11 X server
|
Summary: X.Org X11 X server
|
||||||
Name: xorg-x11-server
|
Name: xorg-x11-server
|
||||||
Version: 1.17.1
|
Version: 1.17.1
|
||||||
Release: 14%{?gitdate:.%{gitdate}}%{dist}
|
Release: 15%{?gitdate:.%{gitdate}}%{dist}
|
||||||
URL: http://www.x.org
|
URL: http://www.x.org
|
||||||
License: MIT
|
License: MIT
|
||||||
Group: User Interface/X
|
Group: User Interface/X
|
||||||
@ -126,6 +126,11 @@ Patch10007: 0001-modesetting-Fix-software-cursor-fallback.patch
|
|||||||
Patch10010: 0001-dix-Add-unaccelerated-valuators-to-the-ValuatorMask.patch
|
Patch10010: 0001-dix-Add-unaccelerated-valuators-to-the-ValuatorMask.patch
|
||||||
Patch10011: 0002-dix-hook-up-the-unaccelerated-valuator-masks.patch
|
Patch10011: 0002-dix-hook-up-the-unaccelerated-valuator-masks.patch
|
||||||
|
|
||||||
|
# CVE-2015-3164
|
||||||
|
Patch201531640: 0001-xwayland-Enable-access-control-on-open-sockets-CVE-2.patch
|
||||||
|
Patch201531641: 0002-os-support-new-implicit-local-user-access-mode-CVE-2.patch
|
||||||
|
Patch201531642: 0003-xwayland-default-to-local-user-if-no-xauth-file-give.patch
|
||||||
|
|
||||||
%global moduledir %{_libdir}/xorg/modules
|
%global moduledir %{_libdir}/xorg/modules
|
||||||
%global drimoduledir %{_libdir}/dri
|
%global drimoduledir %{_libdir}/dri
|
||||||
%global sdkdir %{_includedir}/xorg
|
%global sdkdir %{_includedir}/xorg
|
||||||
@ -663,6 +668,9 @@ find %{inst_srcdir}/hw/xfree86 -name \*.c -delete
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Wed Jun 10 2015 Ray Strode <rstrode@redhat.com> 1.17.1-15
|
||||||
|
- CVE-2015-3164
|
||||||
|
|
||||||
* Tue May 26 2015 Peter Hutterer <peter.hutterer@redhat.com> 1.17.1-14
|
* Tue May 26 2015 Peter Hutterer <peter.hutterer@redhat.com> 1.17.1-14
|
||||||
- Add the unaccelerated valuator masks, fixes nonmoving mouse in SDL
|
- Add the unaccelerated valuator masks, fixes nonmoving mouse in SDL
|
||||||
(#1208992)
|
(#1208992)
|
||||||
|
Loading…
Reference in New Issue
Block a user