From: Greg KH <gregkh@linuxfoundation.org>
To: Matt Brown <matt@nmatt.com>
Cc: serge@hallyn.com, jslaby@suse.com, akpm@linux-foundation.org,
jannh@google.com, keescook@chromium.org, jmorris@namei.org,
kernel-hardening@lists.openwall.com,
linux-security-module@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: [kernel-hardening] Re: [PATCH v6 2/2] security: tty: make TIOCSTI ioctl require CAP_SYS_ADMIN
Date: Thu, 18 May 2017 15:31:26 +0200 [thread overview]
Message-ID: <20170518133126.GA29952@kroah.com> (raw)
In-Reply-To: <20170505232018.28846-3-matt@nmatt.com>
On Fri, May 05, 2017 at 07:20:18PM -0400, Matt Brown wrote:
> This introduces the tiocsti_restrict sysctl, whose default is controlled via
> CONFIG_SECURITY_TIOCSTI_RESTRICT. When activated, this control restricts
> all TIOCSTI ioctl calls from non CAP_SYS_ADMIN users.
>
> This patch depends on patch 1/2
>
> This patch was inspired from GRKERNSEC_HARDEN_TTY.
>
> This patch would have prevented
> https://bugzilla.redhat.com/show_bug.cgi?id=1411256 under the following
> conditions:
> * non-privileged container
> * container run inside new user namespace
>
> Possible effects on userland:
>
> There could be a few user programs that would be effected by this
> change.
> See: <https://codesearch.debian.net/search?q=ioctl%5C%28.*TIOCSTI>
> notable programs are: agetty, csh, xemacs and tcsh
>
> However, I still believe that this change is worth it given that the
> Kconfig defaults to n. This will be a feature that is turned on for the
> same reason that people activate it when using grsecurity. Users of this
> opt-in feature will realize that they are choosing security over some OS
> features like unprivileged TIOCSTI ioctls, as should be clear in the
> Kconfig help message.
>
> Threat Model/Patch Rational:
>
> >From grsecurity's config for GRKERNSEC_HARDEN_TTY.
>
> | There are very few legitimate uses for this functionality and it
> | has made vulnerabilities in several 'su'-like programs possible in
> | the past. Even without these vulnerabilities, it provides an
> | attacker with an easy mechanism to move laterally among other
> | processes within the same user's compromised session.
>
> So if one process within a tty session becomes compromised it can follow
> that additional processes, that are thought to be in different security
> boundaries, can be compromised as a result. When using a program like su
> or sudo, these additional processes could be in a tty session where TTY file
> descriptors are indeed shared over privilege boundaries.
>
> This is also an excellent writeup about the issue:
> <http://www.halfdog.net/Security/2012/TtyPushbackPrivilegeEscalation/>
>
> When user namespaces are in use, the check for the capability
> CAP_SYS_ADMIN is done against the user namespace that originally opened
> the tty.
>
> Acked-by: Serge Hallyn <serge@hallyn.com>
> Reviewed-by: Kees Cook <keescook@chromium.org>
> Signed-off-by: Matt Brown <matt@nmatt.com>
> ---
> Documentation/sysctl/kernel.txt | 21 +++++++++++++++++++++
> drivers/tty/tty_io.c | 6 ++++++
> include/linux/tty.h | 2 ++
> kernel/sysctl.c | 12 ++++++++++++
> security/Kconfig | 13 +++++++++++++
> 5 files changed, 54 insertions(+)
>
> diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt
> index bac23c1..f7985cf 100644
> --- a/Documentation/sysctl/kernel.txt
> +++ b/Documentation/sysctl/kernel.txt
> @@ -89,6 +89,7 @@ show up in /proc/sys/kernel:
> - sysctl_writes_strict
> - tainted
> - threads-max
> +- tiocsti_restrict
> - unknown_nmi_panic
> - watchdog
> - watchdog_thresh
> @@ -987,6 +988,26 @@ available RAM pages threads-max is reduced accordingly.
>
> ==============================================================
>
> +tiocsti_restrict:
> +
> +This toggle indicates whether unprivileged users are prevented
> +from using the TIOCSTI ioctl to inject commands into other processes
> +which share a tty session.
> +
> +When tiocsti_restrict is set to (0) there are no restrictions(accept
> +the default restriction of only being able to injection commands into
> +one's own tty). When tiocsti_restrict is set to (1), users must
> +have CAP_SYS_ADMIN to use the TIOCSTI ioctl.
> +
> +When user namespaces are in use, the check for the capability
> +CAP_SYS_ADMIN is done against the user namespace that originally
> +opened the tty.
> +
> +The kernel config option CONFIG_SECURITY_TIOCSTI_RESTRICT sets the
> +default value of tiocsti_restrict.
> +
> +==============================================================
> +
> unknown_nmi_panic:
>
> The value in this file affects behavior of handling NMI. When the
> diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
> index c276814..fe68d14 100644
> --- a/drivers/tty/tty_io.c
> +++ b/drivers/tty/tty_io.c
> @@ -2297,11 +2297,17 @@ static int tty_fasync(int fd, struct file *filp, int on)
> * FIXME: may race normal receive processing
> */
>
> +int tiocsti_restrict = IS_ENABLED(CONFIG_SECURITY_TIOCSTI_RESTRICT);
> +
> static int tiocsti(struct tty_struct *tty, char __user *p)
> {
> char ch, mbz = 0;
> struct tty_ldisc *ld;
>
> + if (tiocsti_restrict && !ns_capable(tty->owner_user_ns,CAP_SYS_ADMIN)) {
> + pr_warn_ratelimited("TIOCSTI ioctl call blocked for non-privileged process\n");
> + return -EPERM;
Always follow the proper kernel coding style rules, as I don't want to
have someone else have to come along and fix up the error you have added
here :(
checkpatch.pl is your friend, really...
And why not do a warning with the device that caused the problem to
happen? dev_warn has a ratelimit I think right? "raw" printk messages
like this don't help in trying to track down what/who caused the issue.
And finally, can userspace see the namespace for the tty? Doesn't
things like checkpoint/restore need that in order to properly set the
tty connection back up when moving processes?
v7? :)
thanks,
greg k-h
WARNING: multiple messages have this Message-ID (diff)
From: gregkh@linuxfoundation.org (Greg KH)
To: linux-security-module@vger.kernel.org
Subject: [PATCH v6 2/2] security: tty: make TIOCSTI ioctl require CAP_SYS_ADMIN
Date: Thu, 18 May 2017 15:31:26 +0200 [thread overview]
Message-ID: <20170518133126.GA29952@kroah.com> (raw)
In-Reply-To: <20170505232018.28846-3-matt@nmatt.com>
On Fri, May 05, 2017 at 07:20:18PM -0400, Matt Brown wrote:
> This introduces the tiocsti_restrict sysctl, whose default is controlled via
> CONFIG_SECURITY_TIOCSTI_RESTRICT. When activated, this control restricts
> all TIOCSTI ioctl calls from non CAP_SYS_ADMIN users.
>
> This patch depends on patch 1/2
>
> This patch was inspired from GRKERNSEC_HARDEN_TTY.
>
> This patch would have prevented
> https://bugzilla.redhat.com/show_bug.cgi?id=1411256 under the following
> conditions:
> * non-privileged container
> * container run inside new user namespace
>
> Possible effects on userland:
>
> There could be a few user programs that would be effected by this
> change.
> See: <https://codesearch.debian.net/search?q=ioctl%5C%28.*TIOCSTI>
> notable programs are: agetty, csh, xemacs and tcsh
>
> However, I still believe that this change is worth it given that the
> Kconfig defaults to n. This will be a feature that is turned on for the
> same reason that people activate it when using grsecurity. Users of this
> opt-in feature will realize that they are choosing security over some OS
> features like unprivileged TIOCSTI ioctls, as should be clear in the
> Kconfig help message.
>
> Threat Model/Patch Rational:
>
> >From grsecurity's config for GRKERNSEC_HARDEN_TTY.
>
> | There are very few legitimate uses for this functionality and it
> | has made vulnerabilities in several 'su'-like programs possible in
> | the past. Even without these vulnerabilities, it provides an
> | attacker with an easy mechanism to move laterally among other
> | processes within the same user's compromised session.
>
> So if one process within a tty session becomes compromised it can follow
> that additional processes, that are thought to be in different security
> boundaries, can be compromised as a result. When using a program like su
> or sudo, these additional processes could be in a tty session where TTY file
> descriptors are indeed shared over privilege boundaries.
>
> This is also an excellent writeup about the issue:
> <http://www.halfdog.net/Security/2012/TtyPushbackPrivilegeEscalation/>
>
> When user namespaces are in use, the check for the capability
> CAP_SYS_ADMIN is done against the user namespace that originally opened
> the tty.
>
> Acked-by: Serge Hallyn <serge@hallyn.com>
> Reviewed-by: Kees Cook <keescook@chromium.org>
> Signed-off-by: Matt Brown <matt@nmatt.com>
> ---
> Documentation/sysctl/kernel.txt | 21 +++++++++++++++++++++
> drivers/tty/tty_io.c | 6 ++++++
> include/linux/tty.h | 2 ++
> kernel/sysctl.c | 12 ++++++++++++
> security/Kconfig | 13 +++++++++++++
> 5 files changed, 54 insertions(+)
>
> diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt
> index bac23c1..f7985cf 100644
> --- a/Documentation/sysctl/kernel.txt
> +++ b/Documentation/sysctl/kernel.txt
> @@ -89,6 +89,7 @@ show up in /proc/sys/kernel:
> - sysctl_writes_strict
> - tainted
> - threads-max
> +- tiocsti_restrict
> - unknown_nmi_panic
> - watchdog
> - watchdog_thresh
> @@ -987,6 +988,26 @@ available RAM pages threads-max is reduced accordingly.
>
> ==============================================================
>
> +tiocsti_restrict:
> +
> +This toggle indicates whether unprivileged users are prevented
> +from using the TIOCSTI ioctl to inject commands into other processes
> +which share a tty session.
> +
> +When tiocsti_restrict is set to (0) there are no restrictions(accept
> +the default restriction of only being able to injection commands into
> +one's own tty). When tiocsti_restrict is set to (1), users must
> +have CAP_SYS_ADMIN to use the TIOCSTI ioctl.
> +
> +When user namespaces are in use, the check for the capability
> +CAP_SYS_ADMIN is done against the user namespace that originally
> +opened the tty.
> +
> +The kernel config option CONFIG_SECURITY_TIOCSTI_RESTRICT sets the
> +default value of tiocsti_restrict.
> +
> +==============================================================
> +
> unknown_nmi_panic:
>
> The value in this file affects behavior of handling NMI. When the
> diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
> index c276814..fe68d14 100644
> --- a/drivers/tty/tty_io.c
> +++ b/drivers/tty/tty_io.c
> @@ -2297,11 +2297,17 @@ static int tty_fasync(int fd, struct file *filp, int on)
> * FIXME: may race normal receive processing
> */
>
> +int tiocsti_restrict = IS_ENABLED(CONFIG_SECURITY_TIOCSTI_RESTRICT);
> +
> static int tiocsti(struct tty_struct *tty, char __user *p)
> {
> char ch, mbz = 0;
> struct tty_ldisc *ld;
>
> + if (tiocsti_restrict && !ns_capable(tty->owner_user_ns,CAP_SYS_ADMIN)) {
> + pr_warn_ratelimited("TIOCSTI ioctl call blocked for non-privileged process\n");
> + return -EPERM;
Always follow the proper kernel coding style rules, as I don't want to
have someone else have to come along and fix up the error you have added
here :(
checkpatch.pl is your friend, really...
And why not do a warning with the device that caused the problem to
happen? dev_warn has a ratelimit I think right? "raw" printk messages
like this don't help in trying to track down what/who caused the issue.
And finally, can userspace see the namespace for the tty? Doesn't
things like checkpoint/restore need that in order to properly set the
tty connection back up when moving processes?
v7? :)
thanks,
greg k-h
--
To unsubscribe from this list: send the line "unsubscribe linux-security-module" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
WARNING: multiple messages have this Message-ID (diff)
From: Greg KH <gregkh@linuxfoundation.org>
To: Matt Brown <matt@nmatt.com>
Cc: serge@hallyn.com, jslaby@suse.com, akpm@linux-foundation.org,
jannh@google.com, keescook@chromium.org, jmorris@namei.org,
kernel-hardening@lists.openwall.com,
linux-security-module@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v6 2/2] security: tty: make TIOCSTI ioctl require CAP_SYS_ADMIN
Date: Thu, 18 May 2017 15:31:26 +0200 [thread overview]
Message-ID: <20170518133126.GA29952@kroah.com> (raw)
In-Reply-To: <20170505232018.28846-3-matt@nmatt.com>
On Fri, May 05, 2017 at 07:20:18PM -0400, Matt Brown wrote:
> This introduces the tiocsti_restrict sysctl, whose default is controlled via
> CONFIG_SECURITY_TIOCSTI_RESTRICT. When activated, this control restricts
> all TIOCSTI ioctl calls from non CAP_SYS_ADMIN users.
>
> This patch depends on patch 1/2
>
> This patch was inspired from GRKERNSEC_HARDEN_TTY.
>
> This patch would have prevented
> https://bugzilla.redhat.com/show_bug.cgi?id=1411256 under the following
> conditions:
> * non-privileged container
> * container run inside new user namespace
>
> Possible effects on userland:
>
> There could be a few user programs that would be effected by this
> change.
> See: <https://codesearch.debian.net/search?q=ioctl%5C%28.*TIOCSTI>
> notable programs are: agetty, csh, xemacs and tcsh
>
> However, I still believe that this change is worth it given that the
> Kconfig defaults to n. This will be a feature that is turned on for the
> same reason that people activate it when using grsecurity. Users of this
> opt-in feature will realize that they are choosing security over some OS
> features like unprivileged TIOCSTI ioctls, as should be clear in the
> Kconfig help message.
>
> Threat Model/Patch Rational:
>
> >From grsecurity's config for GRKERNSEC_HARDEN_TTY.
>
> | There are very few legitimate uses for this functionality and it
> | has made vulnerabilities in several 'su'-like programs possible in
> | the past. Even without these vulnerabilities, it provides an
> | attacker with an easy mechanism to move laterally among other
> | processes within the same user's compromised session.
>
> So if one process within a tty session becomes compromised it can follow
> that additional processes, that are thought to be in different security
> boundaries, can be compromised as a result. When using a program like su
> or sudo, these additional processes could be in a tty session where TTY file
> descriptors are indeed shared over privilege boundaries.
>
> This is also an excellent writeup about the issue:
> <http://www.halfdog.net/Security/2012/TtyPushbackPrivilegeEscalation/>
>
> When user namespaces are in use, the check for the capability
> CAP_SYS_ADMIN is done against the user namespace that originally opened
> the tty.
>
> Acked-by: Serge Hallyn <serge@hallyn.com>
> Reviewed-by: Kees Cook <keescook@chromium.org>
> Signed-off-by: Matt Brown <matt@nmatt.com>
> ---
> Documentation/sysctl/kernel.txt | 21 +++++++++++++++++++++
> drivers/tty/tty_io.c | 6 ++++++
> include/linux/tty.h | 2 ++
> kernel/sysctl.c | 12 ++++++++++++
> security/Kconfig | 13 +++++++++++++
> 5 files changed, 54 insertions(+)
>
> diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt
> index bac23c1..f7985cf 100644
> --- a/Documentation/sysctl/kernel.txt
> +++ b/Documentation/sysctl/kernel.txt
> @@ -89,6 +89,7 @@ show up in /proc/sys/kernel:
> - sysctl_writes_strict
> - tainted
> - threads-max
> +- tiocsti_restrict
> - unknown_nmi_panic
> - watchdog
> - watchdog_thresh
> @@ -987,6 +988,26 @@ available RAM pages threads-max is reduced accordingly.
>
> ==============================================================
>
> +tiocsti_restrict:
> +
> +This toggle indicates whether unprivileged users are prevented
> +from using the TIOCSTI ioctl to inject commands into other processes
> +which share a tty session.
> +
> +When tiocsti_restrict is set to (0) there are no restrictions(accept
> +the default restriction of only being able to injection commands into
> +one's own tty). When tiocsti_restrict is set to (1), users must
> +have CAP_SYS_ADMIN to use the TIOCSTI ioctl.
> +
> +When user namespaces are in use, the check for the capability
> +CAP_SYS_ADMIN is done against the user namespace that originally
> +opened the tty.
> +
> +The kernel config option CONFIG_SECURITY_TIOCSTI_RESTRICT sets the
> +default value of tiocsti_restrict.
> +
> +==============================================================
> +
> unknown_nmi_panic:
>
> The value in this file affects behavior of handling NMI. When the
> diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c
> index c276814..fe68d14 100644
> --- a/drivers/tty/tty_io.c
> +++ b/drivers/tty/tty_io.c
> @@ -2297,11 +2297,17 @@ static int tty_fasync(int fd, struct file *filp, int on)
> * FIXME: may race normal receive processing
> */
>
> +int tiocsti_restrict = IS_ENABLED(CONFIG_SECURITY_TIOCSTI_RESTRICT);
> +
> static int tiocsti(struct tty_struct *tty, char __user *p)
> {
> char ch, mbz = 0;
> struct tty_ldisc *ld;
>
> + if (tiocsti_restrict && !ns_capable(tty->owner_user_ns,CAP_SYS_ADMIN)) {
> + pr_warn_ratelimited("TIOCSTI ioctl call blocked for non-privileged process\n");
> + return -EPERM;
Always follow the proper kernel coding style rules, as I don't want to
have someone else have to come along and fix up the error you have added
here :(
checkpatch.pl is your friend, really...
And why not do a warning with the device that caused the problem to
happen? dev_warn has a ratelimit I think right? "raw" printk messages
like this don't help in trying to track down what/who caused the issue.
And finally, can userspace see the namespace for the tty? Doesn't
things like checkpoint/restore need that in order to properly set the
tty connection back up when moving processes?
v7? :)
thanks,
greg k-h
next prev parent reply other threads:[~2017-05-18 13:31 UTC|newest]
Thread overview: 77+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-05 23:20 [kernel-hardening] [PATCH v6 0/2] security: tty: make TIOCSTI ioctl require CAP_SYS_ADMIN Matt Brown
2017-05-05 23:20 ` Matt Brown
2017-05-05 23:20 ` Matt Brown
2017-05-05 23:20 ` [kernel-hardening] [PATCH v6 1/2] security: tty: Add owner user namespace to tty_struct Matt Brown
2017-05-05 23:20 ` Matt Brown
2017-05-05 23:20 ` Matt Brown
2017-05-05 23:20 ` [kernel-hardening] [PATCH v6 2/2] security: tty: make TIOCSTI ioctl require CAP_SYS_ADMIN Matt Brown
2017-05-05 23:20 ` Matt Brown
2017-05-05 23:20 ` Matt Brown
2017-05-18 13:31 ` Greg KH [this message]
2017-05-18 13:31 ` Greg KH
2017-05-18 13:31 ` Greg KH
2017-05-19 4:51 ` [kernel-hardening] " Matt Brown
2017-05-19 4:51 ` Matt Brown
2017-05-19 4:51 ` Matt Brown
2017-05-10 20:29 ` [kernel-hardening] Re: [PATCH v6 0/2] " Alan Cox
2017-05-10 20:29 ` Alan Cox
2017-05-10 20:29 ` Alan Cox
2017-05-10 21:02 ` [kernel-hardening] " Daniel Micay
2017-05-10 21:02 ` Daniel Micay
2017-05-13 19:52 ` Matt Brown
2017-05-13 19:52 ` Matt Brown
2017-05-13 19:52 ` Matt Brown
2017-05-15 4:45 ` [kernel-hardening] " Nicolas Belouin
2017-05-15 20:57 ` Alan Cox
2017-05-15 20:57 ` Alan Cox
2017-05-15 20:57 ` Alan Cox
2017-05-15 23:10 ` [kernel-hardening] " Peter Dolding
2017-05-15 23:10 ` Peter Dolding
2017-05-15 23:10 ` Peter Dolding
2017-05-16 4:15 ` [kernel-hardening] " Matt Brown
2017-05-16 4:15 ` Matt Brown
2017-05-16 4:15 ` Matt Brown
2017-05-16 9:01 ` [kernel-hardening] " Peter Dolding
2017-05-16 9:01 ` Peter Dolding
2017-05-16 9:01 ` Peter Dolding
2017-05-16 12:22 ` [kernel-hardening] " Matt Brown
2017-05-16 12:22 ` Matt Brown
2017-05-16 12:22 ` Matt Brown
2017-05-16 14:28 ` [kernel-hardening] " Kees Cook
2017-05-16 14:28 ` Kees Cook
2017-05-16 14:28 ` Kees Cook
2017-05-16 15:48 ` [kernel-hardening] " Serge E. Hallyn
2017-05-16 15:48 ` Serge E. Hallyn
2017-05-16 22:05 ` Peter Dolding
2017-05-16 22:05 ` Peter Dolding
2017-05-16 21:43 ` Peter Dolding
2017-05-16 21:43 ` Peter Dolding
2017-05-16 21:43 ` Peter Dolding
2017-05-16 21:54 ` [kernel-hardening] " Matt Brown
2017-05-16 21:54 ` Matt Brown
2017-05-16 21:54 ` Matt Brown
2017-05-17 16:41 ` [kernel-hardening] " Alan Cox
2017-05-17 16:41 ` Alan Cox
2017-05-17 16:41 ` Alan Cox
2017-05-17 18:25 ` [kernel-hardening] " Daniel Micay
2017-05-17 18:25 ` Daniel Micay
2017-05-17 23:04 ` Boris Lukashev
2017-05-18 3:18 ` Kees Cook
2017-05-18 3:18 ` Kees Cook
2017-05-19 2:48 ` Peter Dolding
2017-05-19 2:48 ` Peter Dolding
2017-05-19 4:08 ` Boris Lukashev
2017-05-19 14:33 ` Serge E. Hallyn
2017-05-19 14:33 ` Serge E. Hallyn
2017-05-29 10:42 ` Peter Dolding
2017-05-29 10:42 ` Peter Dolding
2017-05-30 15:52 ` Serge E. Hallyn
2017-05-30 15:52 ` Serge E. Hallyn
2017-05-30 21:52 ` Alan Cox
2017-05-30 21:52 ` Alan Cox
2017-05-31 11:27 ` Peter Dolding
2017-05-31 11:27 ` Peter Dolding
2017-05-31 14:36 ` Alan Cox
2017-05-31 14:36 ` Alan Cox
2017-05-31 15:32 ` Serge E. Hallyn
2017-05-31 15:32 ` Serge E. Hallyn
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170518133126.GA29952@kroah.com \
--to=gregkh@linuxfoundation.org \
--cc=akpm@linux-foundation.org \
--cc=jannh@google.com \
--cc=jmorris@namei.org \
--cc=jslaby@suse.com \
--cc=keescook@chromium.org \
--cc=kernel-hardening@lists.openwall.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
--cc=matt@nmatt.com \
--cc=serge@hallyn.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.