Package: release.debian.org Severity: normal Tags: stretch User: release.debian....@packages.debian.org Usertags: pu X-Debbugs-CC: t...@security.debian.org
Dear oldstable release managers, Please consider xtrlock (2.8+deb9u1) for stretch: xtrlock (2.8+deb9u1) stretch; urgency=high * CVE-2016-10894: Attempt to grab multitouch devices which are not intercepted via XGrabPointer. xtrlock did not block multitouch events so an attacker could still input and thus control various programs such as Chromium, etc. via so-called "multitouch" events such as pan scrolling, "pinch and zoom", or even being able to provide regular mouse clicks by depressing the touchpad once and then clicking with a secondary finger. This fix does not the situation where Eve plugs in a multitouch device *after* the screen has been locked. For more information on this angle, please see <https://bugs.debian.org/830726#115>. (Closes: #830726) The full diff is attached. In addition, this update has been filed at the behest of the security team after marking this CVE as no-dsa. Regards, -- ,''`. : :' : Chris Lamb `. `'` la...@debian.org / chris-lamb.co.uk `-
diff --git a/debian/changelog b/debian/changelog index 91ebaab..df64472 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,20 @@ +xtrlock (2.8+deb9u1) stretch; urgency=high + + * CVE-2016-10894: Attempt to grab multitouch devices which are not + intercepted via XGrabPointer. + + xtrlock did not block multitouch events so an attacker could still input + and thus control various programs such as Chromium, etc. via so-called + "multitouch" events such as pan scrolling, "pinch and zoom", or even being + able to provide regular mouse clicks by depressing the touchpad once and + then clicking with a secondary finger. + + This fix does not the situation where Eve plugs in a multitouch device + *after* the screen has been locked. For more information on this angle, + please see <https://bugs.debian.org/830726#115>. (Closes: #830726) + + -- Chris Lamb <la...@debian.org> Thu, 16 Jan 2020 16:00:52 +0000 + xtrlock (2.8) unstable; urgency=low * patch from Simon Tatham to add a -f option [fork, and return success diff --git a/Imakefile b/Imakefile index 68605d8..c792294 100644 --- a/Imakefile +++ b/Imakefile @@ -12,6 +12,6 @@ #! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #! GNU General Public License for more details. -SingleProgramTarget(xtrlock,xtrlock.o,-lcrypt -lX11,) +SingleProgramTarget(xtrlock,xtrlock.o,-lcrypt -lX11 -lXi,) InstallProgram(xtrlock,$(BINDIR)) InstallManPage(xtrlock,$(MANDIR)) diff --git a/debian/control b/debian/control index c01554d..359d7a0 100644 --- a/debian/control +++ b/debian/control @@ -2,7 +2,7 @@ Source: xtrlock Maintainer: Matthew Vernon <matt...@debian.org> Section: x11 Priority: optional -Build-Depends: libx11-dev, x11proto-core-dev, xutils-dev, dpkg-dev (>= 1.16.1~) +Build-Depends: libx11-dev, x11proto-core-dev, xutils-dev, dpkg-dev (>= 1.16.1~), libxi-dev Standards-Version: 3.9.1 Package: xtrlock diff --git a/debian/rules b/debian/rules index 91b1572..55e8b4e 100755 --- a/debian/rules +++ b/debian/rules @@ -11,7 +11,7 @@ DPKG_EXPORT_BUILDFLAGS = 1 export DEB_BUILD_MAINT_OPTIONS = hardening=+all include /usr/share/dpkg/buildflags.mk -CFLAGS+=-DSHADOW_PWD +CFLAGS+=-DSHADOW_PWD -DMULTITOUCH build: $(checkdir) diff --git a/xtrlock.c b/xtrlock.c index 6117c6f..a08fe4e 100644 --- a/xtrlock.c +++ b/xtrlock.c @@ -41,6 +41,11 @@ #include <shadow.h> #endif +#ifdef MULTITOUCH +#include <X11/extensions/XInput.h> +#include <X11/extensions/XInput2.h> +#endif + #include "lock.bitmap" #include "mask.bitmap" #include "patchlevel.h" @@ -71,6 +76,34 @@ int passwordok(const char *s) { #endif } +#if MULTITOUCH +XIEventMask evmask; + +/* (Optimistically) attempt to grab multitouch devices which are not + * intercepted via XGrabPointer. */ +void handle_multitouch(Cursor cursor) { + XIDeviceInfo *info; + int xi_ndevices; + + info = XIQueryDevice(display, XIAllDevices, &xi_ndevices); + + int i; + for (i = 0; i < xi_ndevices; i++) { + XIDeviceInfo *dev = &info[i]; + + int j; + for (j = 0; j < dev->num_classes; j++) { + if (dev->classes[j]->type == XITouchClass && + dev->use == XISlavePointer) { + XIGrabDevice(display, dev->deviceid, window, CurrentTime, cursor, + GrabModeAsync, GrabModeAsync, False, &evmask); + } + } + } + XIFreeDeviceInfo(info); +} +#endif + int main(int argc, char **argv){ XEvent ev; KeySym ks; @@ -132,7 +165,32 @@ int main(int argc, char **argv){ program_version); exit(1); } + +#ifdef MULTITOUCH + unsigned char mask[XIMaskLen(XI_LASTEVENT)]; + int xi_major = 2, xi_minor = 2, xi_opcode, xi_error, xi_event; + + if (!XQueryExtension(display, INAME, &xi_opcode, &xi_event, &xi_error)) { + fprintf(stderr, "xtrlock (version %s): No X Input extension\n", + program_version); + exit(1); + } + if (XIQueryVersion(display, &xi_major, &xi_minor) != Success || + xi_major * 10 + xi_minor < 22) { + fprintf(stderr,"xtrlock (version %s): Need XI 2.2\n", + program_version); + exit(1); + } + + evmask.mask = mask; + evmask.mask_len = sizeof(mask); + memset(mask, 0, sizeof(mask)); + evmask.deviceid = XIAllDevices; + XISetMask(mask, XI_HierarchyChanged); + XISelectEvents(display, DefaultRootWindow(display), &evmask, 1); +#endif + attrib.override_redirect= True; if (blank) { @@ -227,6 +285,10 @@ int main(int argc, char **argv){ } } +#ifdef MULTITOUCH + handle_multitouch(cursor); +#endif + for (;;) { XNextEvent(display,&ev); switch (ev.type) { @@ -265,6 +327,15 @@ int main(int argc, char **argv){ break; } break; +#if MULTITOUCH + case GenericEvent: + if (ev.xcookie.extension == xi_opcode && + XGetEventData(display,&ev.xcookie) && + ev.xcookie.evtype == XI_HierarchyChanged) { + handle_multitouch(cursor); + } + break; +#endif default: break; }