LINUX.ORG.RU

История изменений

Исправление OlegUP, (текущая версия) :

Не выйдет наверное, я нашел функцию в ядре, которая сравнивает и выдаёт cap’ы. Такой кусок кода в функции int cap_bprm_creds_from_file(struct linux_binprm *bprm, const struct file *file):

https://elixir.bootlin.com/linux/v6.13.5/source/security/commoncap.c#L918

	if ((is_setid || __cap_gained(permitted, new, old)) &&
	    ((bprm->unsafe & ~LSM_UNSAFE_PTRACE) ||
	     !ptracer_capable(current, new->user_ns))) {
		/* downgrade; they get no more than they had, and maybe less */
		if (!ns_capable(new->user_ns, CAP_SETUID) ||
		    (bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS)) {
			new->euid = new->uid;
			new->egid = new->gid;
		}
		new->cap_permitted = cap_intersect(new->cap_permitted,
						   old->cap_permitted);
	}

Почитав код можно понять, что в предыдущем посте комментаторы были абсолютно правы, ядро не дает трассировать трэйсеру не позволенные ему capabilities у трейси.

Исходная версия OlegUP, :

Не выйдет наверное, я нашел функцию в ядре, которая сравнивает cap’ы. Такой кусок кода в функции int cap_bprm_creds_from_file(struct linux_binprm *bprm, const struct file *file):

https://elixir.bootlin.com/linux/v6.13.5/source/security/commoncap.c#L918

	if ((is_setid || __cap_gained(permitted, new, old)) &&
	    ((bprm->unsafe & ~LSM_UNSAFE_PTRACE) ||
	     !ptracer_capable(current, new->user_ns))) {
		/* downgrade; they get no more than they had, and maybe less */
		if (!ns_capable(new->user_ns, CAP_SETUID) ||
		    (bprm->unsafe & LSM_UNSAFE_NO_NEW_PRIVS)) {
			new->euid = new->uid;
			new->egid = new->gid;
		}
		new->cap_permitted = cap_intersect(new->cap_permitted,
						   old->cap_permitted);
	}

Почитав код можно понять, что в предыдущем посте комментаторы были абсолютно правы, ядро не дает трассировать трэйсеру не позволенные ему capabilities у трейси.