[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <Z2E_tqgqXIwi5j4C@google.com>
Date: Tue, 17 Dec 2024 10:09:26 +0100
From: "Günther Noack" <gnoack@...gle.com>
To: Greg Kroah-Hartman <gregkh@...uxfoundation.org>
Cc: Jann Horn <jannh@...gle.com>, "Hanno Böck" <hanno@...eck.de>, Jiri Slaby <jirislaby@...nel.org>,
linux-hardening@...r.kernel.org, regressions@...ts.linux.dev,
linux-kernel@...r.kernel.org
Subject: Re: [PATCH] tty: Permit some TIOCL_SETSEL modes without CAP_SYS_ADMIN
FYI, I have tested this locally - it makes the mouse curser show up again in
Emacs. (I do also believe that is it fine security-wise, but will also very
happily add a Reviewed-By or Tested-By from Hanno or others in the next
iteration :))
—Günther
On Mon, Dec 16, 2024 at 03:07:23PM +0000, Günther Noack wrote:
> With this, processes without CAP_SYS_ADMIN are able to use TIOCLINUX with
> subcode TIOCL_SETSEL, in the selection modes TIOCL_SETPOINTER,
> TIOCL_SELCLEAR and TIOCL_SELMOUSEREPORT.
>
> TIOCL_SETSEL was previously changed to require CAP_SYS_ADMIN, as this IOCTL
> let callers change the selection buffer and could be used to simulate
> keypresses. These three TIOCL_SETSEL selection modes, however, are safe to
> use, as they do not modify the selection buffer.
>
> This fixes a mouse support regression that affected Emacs (invisible mouse
> cursor).
>
> Link: https://lore.kernel.org/r/ee3ec63269b43b34e1c90dd8c9743bf8@finder.org
> Fixes: 8d1b43f6a6df ("tty: Restrict access to TIOCLINUX' copy-and-paste subcommands")
> Signed-off-by: Günther Noack <gnoack@...gle.com>
> ---
> drivers/tty/vt/selection.c | 14 ++++++++++++++
> drivers/tty/vt/vt.c | 3 +--
> 2 files changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/tty/vt/selection.c b/drivers/tty/vt/selection.c
> index 564341f1a74f..0bd6544e30a6 100644
> --- a/drivers/tty/vt/selection.c
> +++ b/drivers/tty/vt/selection.c
> @@ -192,6 +192,20 @@ int set_selection_user(const struct tiocl_selection __user *sel,
> if (copy_from_user(&v, sel, sizeof(*sel)))
> return -EFAULT;
>
> + /*
> + * TIOCL_SELCLEAR, TIOCL_SELPOINTER and TIOCL_SELMOUSEREPORT are OK to
> + * use without CAP_SYS_ADMIN as they do not modify the selection.
> + */
> + switch (v.sel_mode) {
> + case TIOCL_SELCLEAR:
> + case TIOCL_SELPOINTER:
> + case TIOCL_SELMOUSEREPORT:
> + break;
> + default:
> + if (!capable(CAP_SYS_ADMIN))
> + return -EPERM;
> + }
> +
> return set_selection_kernel(&v, tty);
> }
>
> diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
> index 96842ce817af..ed65b3b80fbd 100644
> --- a/drivers/tty/vt/vt.c
> +++ b/drivers/tty/vt/vt.c
> @@ -3345,8 +3345,7 @@ int tioclinux(struct tty_struct *tty, unsigned long arg)
>
> switch (type) {
> case TIOCL_SETSEL:
> - if (!capable(CAP_SYS_ADMIN))
> - return -EPERM;
> + /* CAP_SYS_ADMIN check happens in set_selection_user(). */
> return set_selection_user(param, tty);
> case TIOCL_PASTESEL:
> if (!capable(CAP_SYS_ADMIN))
> --
> 2.47.1.613.gc27f4b7a9f-goog
>
Powered by blists - more mailing lists