tty: Allow TIOCSTI to be disabled
TIOCSTI continues its long history of being used in privilege escalation attacks[1]. Prior attempts to provide a mechanism to disable this have devolved into discussions around creating full-blown LSMs to provide arbitrary ioctl filtering, which is hugely over-engineered -- only TIOCSTI is being used this way. 3 years ago OpenBSD entirely removed TIOCSTI[2], Android has had it filtered for longer[3], and the tools that had historically used TIOCSTI either do not need it, are not commonly built with it, or have had its use removed. Provide a simple CONFIG and global sysctl to disable this for the system builders who have wanted this functionality for literally decades now, much like the ldisc_autoload CONFIG and sysctl. [1] https://lore.kernel.org/linux-hardening/Y0m9l52AKmw6Yxi1@hostpad [2] https://undeadly.org/cgi?action=article;sid=20170701132619 [3] https://lore.kernel.org/lkml/CAFJ0LnFGRuEEn1tCLhoki8ZyWrKfktbF+rwwN7WzyC_kBFoQVA@mail.gmail.com/ Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Jiri Slaby <jirislaby@kernel.org> Cc: Simon Brand <simon.brand@postadigitale.de> Signed-off-by: Kees Cook <keescook@chromium.org> Link: https://lore.kernel.org/r/20221022182949.2684794-2-keescook@chromium.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
5fd8c2d3de
commit
83efeeeb3d
|
@ -149,6 +149,25 @@ config LEGACY_PTY_COUNT
|
|||
When not in use, each legacy PTY occupies 12 bytes on 32-bit
|
||||
architectures and 24 bytes on 64-bit architectures.
|
||||
|
||||
config LEGACY_TIOCSTI
|
||||
bool "Allow legacy TIOCSTI usage"
|
||||
default y
|
||||
help
|
||||
Historically the kernel has allowed TIOCSTI, which will push
|
||||
characters into a controlling TTY. This continues to be used
|
||||
as a malicious privilege escalation mechanism, and provides no
|
||||
meaningful real-world utility any more. Its use is considered
|
||||
a dangerous legacy operation, and can be disabled on most
|
||||
systems.
|
||||
|
||||
Say 'Y here only if you have confirmed that your system's
|
||||
userspace depends on this functionality to continue operating
|
||||
normally.
|
||||
|
||||
This functionality can be changed at runtime with the
|
||||
dev.tty.legacy_tiocsti sysctl. This configuration option sets
|
||||
the default value of the sysctl.
|
||||
|
||||
config LDISC_AUTOLOAD
|
||||
bool "Automatically load TTY Line Disciplines"
|
||||
default y
|
||||
|
|
|
@ -2268,11 +2268,15 @@ static int tty_fasync(int fd, struct file *filp, int on)
|
|||
* * Called functions take tty_ldiscs_lock
|
||||
* * current->signal->tty check is safe without locks
|
||||
*/
|
||||
static bool tty_legacy_tiocsti __read_mostly = IS_ENABLED(CONFIG_LEGACY_TIOCSTI);
|
||||
static int tiocsti(struct tty_struct *tty, char __user *p)
|
||||
{
|
||||
char ch, mbz = 0;
|
||||
struct tty_ldisc *ld;
|
||||
|
||||
if (!tty_legacy_tiocsti)
|
||||
return -EIO;
|
||||
|
||||
if ((current->signal->tty != tty) && !capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
if (get_user(ch, p))
|
||||
|
@ -3573,6 +3577,13 @@ void console_sysfs_notify(void)
|
|||
}
|
||||
|
||||
static struct ctl_table tty_table[] = {
|
||||
{
|
||||
.procname = "legacy_tiocsti",
|
||||
.data = &tty_legacy_tiocsti,
|
||||
.maxlen = sizeof(tty_legacy_tiocsti),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dobool,
|
||||
},
|
||||
{
|
||||
.procname = "ldisc_autoload",
|
||||
.data = &tty_ldisc_autoload,
|
||||
|
|
Loading…
Reference in New Issue