forked from mirrors/linux
		
	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
					
				
					 2 changed files with 30 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -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 a new issue