Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 633b4545 authored by Eric Paris's avatar Eric Paris Committed by Al Viro
Browse files

audit: only allow tasks to set their loginuid if it is -1



At the moment we allow tasks to set their loginuid if they have
CAP_AUDIT_CONTROL.  In reality we want tasks to set the loginuid when they
log in and it be impossible to ever reset.  We had to make it mutable even
after it was once set (with the CAP) because on update and admin might have
to restart sshd.  Now sshd would get his loginuid and the next user which
logged in using ssh would not be able to set his loginuid.

Systemd has changed how userspace works and allowed us to make the kernel
work the way it should.  With systemd users (even admins) are not supposed
to restart services directly.  The system will restart the service for
them.  Thus since systemd is going to loginuid==-1, sshd would get -1, and
sshd would be allowed to set a new loginuid without special permissions.

If an admin in this system were to manually start an sshd he is inserting
himself into the system chain of trust and thus, logically, it's his
loginuid that should be used!  Since we have old systems I make this a
Kconfig option.

Signed-off-by: default avatarEric Paris <eparis@redhat.com>
parent 0a300be6
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -1197,9 +1197,6 @@ static ssize_t proc_loginuid_write(struct file * file, const char __user * buf,
	ssize_t length;
	uid_t loginuid;

	if (!capable(CAP_AUDIT_CONTROL))
		return -EPERM;

	rcu_read_lock();
	if (current != pid_task(proc_pid(inode), PIDTYPE_PID)) {
		rcu_read_unlock();
+14 −0
Original line number Diff line number Diff line
@@ -372,6 +372,20 @@ config AUDIT_TREE
	depends on AUDITSYSCALL
	select FSNOTIFY

config AUDIT_LOGINUID_IMMUTABLE
	bool "Make audit loginuid immutable"
	depends on AUDIT
	help
	  The config option toggles if a task setting it's loginuid requires
	  CAP_SYS_AUDITCONTROL or if that task should require no special permissions
	  but should instead only allow setting its loginuid if it was never
	  previously set.  On systems which use systemd or a similar central
	  process to restart login services this should be set to true.  On older
	  systems in which an admin would typically have to directly stop and
	  start processes this should be set to false.  Setting this to true allows
	  one to drop potentially dangerous capabilites from the login tasks,
	  but may not be backwards compatible with older init systems.

source "kernel/irq/Kconfig"

menu "RCU Subsystem"
+10 −1
Original line number Diff line number Diff line
@@ -2173,9 +2173,18 @@ static atomic_t session_id = ATOMIC_INIT(0);
int audit_set_loginuid(uid_t loginuid)
{
	struct task_struct *task = current;
	unsigned int sessionid = atomic_inc_return(&session_id);
	struct audit_context *context = task->audit_context;
	unsigned int sessionid;

#ifdef CONFIG_AUDIT_LOGINUID_IMMUTABLE
	if (task->loginuid != -1)
		return -EPERM;
#else /* CONFIG_AUDIT_LOGINUID_IMMUTABLE */
	if (!capable(CAP_AUDIT_CONTROL))
		return -EPERM;
#endif  /* CONFIG_AUDIT_LOGINUID_IMMUTABLE */

	sessionid = atomic_inc_return(&session_id);
	if (context && context->in_syscall) {
		struct audit_buffer *ab;