История изменений
Исправление 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
у трейси.