Capacitai(7) Miscellaneous Information Manual Capacitai(7) NUME capacitai - prezentare generala a capacitailor Linux DESCRIERE In scopul efectuarii verificarii permisiunilor, implementarile tradiionale UNIX disting doua categorii de procese: procese privilegiate (al caror ID utilizator efectiv este 0, denumit superutilizator sau root) i procese neprivilegiate (al caror UID efectiv este diferit de zero). Procesele privilegiate ocolesc toate verificarile de permisiuni ale nucleului, in timp ce procesele neprivilegiate sunt supuse unei verificari complete a permisiunilor pe baza acreditarilor procesului (de obicei: UID efectiv, GID efectiv i lista suplimentara de grupuri). Incepand cu Linux 2.2, Linux imparte privilegiile asociate in mod tradiional cu superutilizatorul in unitai distincte, cunoscute sub numele de capabilities(capacitai), care pot fi activate i dezactivate independent. Capacitaile sunt un atribut per-fir de execuie. Lista capacitailor Urmatoarea lista prezinta capacitaile implementate pe Linux i operaiile sau comportamentele pe care le permite fiecare capacitate: CAP_AUDIT_CONTROL (incepand cu Linux 2.6.11) Activeaza i dezactiveaza auditarea nucleului; modifica regulile de filtrare a auditarii; recupereaza starea auditarii i regulile de filtrare. CAP_AUDIT_READ (incepand cu Linux 3.16) Permite citirea jurnalului de auditare prin intermediul unui soclu multicast netlink. CAP_AUDIT_WRITE (incepand cu Linux 2.6.11) Scrie inregistrari in jurnalul de auditare al nucleului. CAP_BLOCK_SUSPEND (incepand cu Linux 3.5) Utilizeaza caracteristici care pot bloca suspendarea sistemului (epoll(7) EPOLLWAKEUP, /proc/sys/wake_lock). CAP_BPF (incepand cu Linux 5.8) Utilizeaza operaii BPF privilegiate; a se vedea bpf(2) i bpf-helpers(7). Aceasta capacitate a fost adaugata in Linux 5.8 pentru a separa funcionalitatea BPF de capacitatea supraincarcata CAP_SYS_ADMIN. CAP_CHECKPOINT_RESTORE (incepand cu Linux 5.9) o Actualizeaza /proc/sys/kernel/ns_last_pid (a se vedea pid_namespaces(7)); o utilizeaza funcia set_tid din clone3(2); o citete coninutul legaturilor simbolice din /proc/pid/map_files pentru alte procese. Aceasta capacitate a fost adaugata in Linux 5.9 pentru a separa funcionalitatea punct de control/restaurare de capacitatea supraincarcata CAP_SYS_ADMIN. CAP_CHOWN Efectueaza modificari arbitrare ale UID-urilor i GID-urilor fiierelor (consultai chown(2)). CAP_DAC_OVERRIDE Ocolete verificarea permisiunilor de citire, scriere i executare a fiierelor. (DAC este o abreviere de la ,,discretionary access control" - control discreionar al accesului). CAP_DAC_READ_SEARCH o Ocolete verificarea permisiunilor de citire a fiierelor i verificarea permisiunilor de citire i executare a directoarelor; o invoca open_by_handle_at(2); o utilizeaza fanionul linkat(2) AT_EMPTY_PATH pentru a crea o legatura catre un fiier la care se face referire printr-un descriptor de fiier. CAP_FOWNER o Ocolete verificarile permisiunilor pentru operaiile care, in mod normal, necesita ca UID-ul sistemului de fiiere al procesului sa coincida cu UID-ul fiierului (de exemplu, chmod(2), utime(2)), excluzand acele operaii acoperite de CAP_DAC_OVERRIDE i CAP_DAC_READ_SEARCH; o definete fanioanele de nod-i (a se vedea FS_IOC_SETFLAGS(2const)) pe fiiere arbitrare; o configureaza listele de control al accesului (ACL) pe fiiere arbitrare; o ignora bitul lipicios al directorului la tergerea fiierului; o modifica atributele extinse ale utilizatorului pe directorul lipicios deinut de orice utilizator; o specifica O_NOATIME pentru fiiere arbitrare in open(2) i fcntl(2). CAP_FSETID o Nu terge biii de mod set-user-ID i set-group-ID atunci cand un fiier este modificat; o activeaza bitul set-group-ID pentru un fiier al carui GID nu corespunde sistemului de fiiere sau niciunuia dintre GID-urile suplimentare ale procesului apelant. CAP_IPC_LOCK o Blocheaza memoria (mlock(2), mlockall(2), mmap(2), shmctl(2)); o Aloca memorie folosind pagini enorme (memfd_create(2), mmap(2), shmctl(2)). CAP_IPC_OWNER Ocolete verificarile permisiunilor pentru operaiile asupra obiectelor IPC System V. CAP_KILL Ocolete verificarile permisiunilor pentru trimiterea semnalelor (consultai kill(2)). Aceasta include utilizarea operaiei ioctl(2) KDSIGACCEPT. CAP_LEASE (incepand cu Linux 2.4) Stabilete inchirieri(leases) pe fiiere arbitrare (consultai fcntl(2)). CAP_LINUX_IMMUTABLE Definete fanioanele de nod-i FS_APPEND_FL i FS_IMMUTABLE_FL (a se vedea FS_IOC_SETFLAGS(2const)). CAP_MAC_ADMIN (incepand cu Linux 2.6.25) Permite modificarea configuraiei sau a starii MAC. Implementata pentru Smack Linux Security Module (LSM). CAP_MAC_OVERRIDE (incepand cu Linux 2.6.25) Suprascrie controlul accesului obligatoriu (MAC). Implementata pentru Smack LSM. CAP_MKNOD (incepand cu Linux 2.4) Creeaza fiiere speciale utilizand mknod(2). CAP_NET_ADMIN Efectueaza diverse operaii legate de reea: o configurarea interfeei; o administrarea de firewall IP, mascare i contorizare; o modifica tabelele de direcionare; o sa se conecteze la orice adresa pentru proxing transparent; o stabilete tipul de serviciu (TOS); o terge statisticile controlorului; o definete modul promiscuu; o activeaza modul de multidifuzare(multicasting); o utilizeaza setsockopt(2) pentru a defini urmatoarele opiuni de soclu: SO_DEBUG, SO_MARK, SO_PRIORITY (pentru o prioritate in afara intervalului 0-6), SO_RCVBUFFORCE i SO_SNDBUFFORCE. CAP_NET_BIND_SERVICE Asociaza un soclu la porturile privilegiate ale domeniului Internet (numere de porturi mai mici de 1024). CAP_NET_BROADCAST (Nefolosita) Efectueaza difuzari (broadcasts) de soclu i asculta ,,multicasts". CAP_NET_RAW o Utilizeaza socluri RAW i PACKET; o sa se conecteze la orice adresa pentru proxing transparent. CAP_PERFMON (incepand cu Linux 5.8) Utilizeaza diverse mecanisme de monitorizare a performanei, inclusiv: o apelul perf_event_open(2); o utilizeaza diverse operaii BPF care au implicaii asupra performanei. Aceasta capacitate a fost adaugata in Linux 5.8 pentru a separa funcionalitatea de monitorizare a performanei de capacitatea supraincarcata CAP_SYS_ADMIN. Consultai i fiierul sursa al nucleului Documentation/admin-guide/perf-security.rst. CAP_SETGID o Efectueaza manipulari arbitrare ale GID-urilor de proces i ale listei suplimentare de GID-uri; o falsifica GID atunci cand paseaza acreditarile soclului prin intermediul soclurilor de domeniu UNIX; o scrie o corespondena ID de grup intr-un spaiu de nume al utilizatorului [a se vedea user_namespaces(7)]. CAP_SETFCAP (incepand cu Linux 2.6.24) Definete capacitai arbitrare pe un fiier. Incepand cu Linux 5.12, aceasta capacitate este de asemenea necesara pentru cartografierea ID-ului utilizatorului 0 intr-un nou spaiu de nume al utilizatorului; pentru detalii, consultai user_namespaces(7). CAP_SETPCAP In cazul in care sunt acceptate capacitaile de fiier (de exemplu, incepand cu Linux 2.6.24): adauga orice capacitate din setul limitator al firului apelant la setul sau motenit; renuna la capacitaile din setul limitator (prin prctl(2) PR_CAPBSET_DROP); efectueaza modificari ale fanioanelor securebits. In cazul in care capacitaile de fiier nu sunt acceptate (de exemplu, inainte de Linux 2.6.24): acorda sau elimina orice capacitate din setul de capacitai permise ale apelantului catre sau de la orice alt proces; (aceasta proprietate a CAP_SETPCAP nu este disponibila atunci cand nucleul este configurat pentru a oferi suport capacitailor de fiier, deoarece CAP_SETPCAP are o semantica complet diferita pentru astfel de nuclee). CAP_SETUID o Efectueaza manipulari arbitrare ale UID-urilor proceselor (setuid(2), setreuid(2), setresuid(2), setfsuid(2)); o falsifica UID atunci cand paseaza acreditarile soclului prin intermediul soclurilor de domeniu UNIX; o scrie o corespondena ID utilizator intr-un spaiu de nume utilizator [a se vedea user_namespaces(7)]. CAP_SYS_ADMIN Nota: aceasta capacitate este supraincarcata; a se vedea mai jos seciunea Note pentru dezvoltatorii nucleului. o Efectueaza o serie de operaii de administrare a sistemului, inclusiv: quotactl(2), mount(2), umount(2), pivot_root(2), swapon(2), swapoff(2), sethostname(2) i setdomainname(2); o efectueaza operaii privilegiate syslog(2) (incepand cu Linux 2.6.37, CAP_SYSLOG trebuie sa fie utilizata pentru a permite astfel de operaii); o executa comanda VM86_REQUEST_IRQ vm86(2); o acceseaza aceeai funcionalitate de punct de control/restaurare care este reglementata de CAP_CHECKPOINT_RESTORE (dar pentru accesarea acestei funcionalitai este preferata aceasta din urma capacitate, mai slaba). o efectueaza aceleai operaii BPF ca i cele reglementate de CAP_BPF (dar aceasta din urma capacitate, mai slaba, este preferata pentru accesarea funcionalitaii respective). o utilizeaza aceleai mecanisme de monitorizare a performanelor ca i cele reglementate de CAP_PERFMON (dar pentru accesarea acestei funcionalitai se prefera aceasta din urma capacitate, mai slaba). o efectueaza operaii IPC_SET i IPC_RMID pe obiecte IPC System V arbitrare; o suprascrie limita resurselor RLIMIT_NPROC; o efectueaza operaii asupra atributelor extinse trusted i security [a se vedea xattr(7)]; o utilizeaza lookup_dcookie(2); o utilizeaza ioprio_set(2) pentru a atribui clasele de planificare I/O IOPRIO_CLASS_RT i (inainte de Linux 2.6.25) IOPRIO_CLASS_IDLE; o falsifica PID atunci cand paseaza acreditarile soclului prin intermediul soclurilor de domeniu UNIX; o depaete /proc/sys/fs/file-max, limita la nivel de sistem a numarului de fiiere deschise, in apelurile sistemului care deschid fiiere (de exemplu, accept(2), execve(2), open(2), pipe(2)); o utilizeaza fanioanele CLONE_* care creeaza noi spaii de nume cu clone(2) i unshare(2) (dar, de la Linux 3.8, crearea de spaii de nume de utilizator nu necesita nicio capacitate); o acceseaza informaiile privilegiate ale evenimentului perf; o apeleaza setns(2) (necesita CAP_SYS_ADMIN in spaiul de nume target); o apeleaza fanotify_init(2); o efectueaza operaii privilegiate KEYCTL_CHOWN i KEYCTL_SETPERM keyctl(2); o efectueaza operaia madvise(2) MADV_HWPOISON; o utilizeaza TIOCSTI ioctl(2) pentru a introduce caractere in coada de intrare a unui alt terminal decat terminalul de control al apelantului; o utilizeaza apelul de sistem invechit nfsservctl(2); o utilizeaza apelul de sistem invechit bdflush(2); o efectueaza diverse operaii privilegiate ioctl(2) cu dispozitive de blocuri; o efectueaza diverse operaii privilegiate ioctl(2) cu sistemul de fiiere; o efectueaza operaii privilegiate ioctl(2) pe dispozitivul /dev/random (consultai random(4)); o instaleaza un filtru seccomp(2) fara a fi necesar sa defineasca mai intai atributul firului no_new_privs; o modifica regulile de autorizare/respingere pentru grupurile de control ale dispozitivelor; o utilizeaza operaia ptrace(2) PTRACE_SECCOMP_GET_FILTER pentru a descarca filtrele seccomp ale urmei(traseului) o utilizai operaia ptrace(2) PTRACE_SETOPTIONS pentru a suspenda proteciile seccomp ale traseului (de exemplu, fanionul PTRACE_O_SUSPEND_SECCOMP); o efectueaza operaii administrative asupra mai multor controlori de dispozitive; o modifica valorile de curtoazie ale autogrupului prin scrierea in /proc/pid/autogroup [a se vedea sched(7)]. CAP_SYS_BOOT Utilizeaza reboot(2) i kexec_load(2). CAP_SYS_CHROOT o Utilizeaza chroot(2); o modifica spaiile de nume de montare utilizand setns(2). CAP_SYS_MODULE o Incarca i descarca module ale nucleului (a se vedea init_module(2) i delete_module(2)); o inainte de Linux 2.6.25: renuna la capacitaile din setul de delimitare a capacitailor la nivel de sistem. CAP_SYS_NICE o Reduce valoarea de curtoazie (nice) a procesului (nice(2), setpriority(2)) i modifica valoarea de curtoazie pentru procesele arbitrare; o stabilete politici de planificare in timp real pentru procesul apelant i stabilete politici de planificare i prioritai pentru procese arbitrare (sched_setscheduler(2), sched_setparam(2), sched_setattr(2)); o stabilete afinitatea CPU pentru procese arbitrare (sched_setaffinity(2)); o stabilete clasa de planificare a In/Ie i prioritatea pentru procese arbitrare (ioprio_set(2)); o aplica migrate_pages(2) la procese arbitrare i permite migrarea proceselor catre noduri arbitrare; o aplica move_pages(2) pe procese arbitrare; o utilizeaza fanionul MPOL_MF_MOVE_ALL cu mbind(2) i move_pages(2). CAP_SYS_PACCT Utilizeaza acct(2). CAP_SYS_PTRACE o Urmarete procese arbitrare folosind ptrace(2); o inspecteaza informaii sensibile ale altor procese prin intermediul /proc (de exemplu, citirea /proc/pid/maps, /proc/pid/mem sau citirea legaturilor simbolice /proc/pid/exe, /proc/pid/fd/*); o aplica get_robust_list(2) pe procese arbitrare; o transfera date catre sau din memoria unor procese arbitrare utilizand process_vm_readv(2) i process_vm_writev(2); o inspecteaza procesele utilizand kcmp(2); o efectueaza alte operaii privilegiate de inspecie a proceselor i depanare. (Consultai utilizarile funciei nucleului ptrace_may_access().) CAP_SYS_RAWIO o Efectueaza operaii ale portului de In/Ie (iopl(2) i ioperm(2)); o acceseaza /proc/kcore; o utilizeaza operaia FIBMAP ioctl(2); o deschide dispozitive pentru accesarea registrelor specifice modelului x86 (MSR, vezi msr(4)); o actualizeaza /proc/sys/vm/mmap_min_addr; o creeaza corespondene de memorie la adrese sub valoarea specificata de /proc/sys/vm/mmap_min_addr; o cartografiaza fiierele in /proc/bus/pci; o deschide /dev/mem i /dev/kmem; o efectueaza diverse comenzi pentru dispozitive SCSI; o efectueaza anumite operaii pe dispozitive hpsa(4) i cciss(4); o efectueaza o serie de operaii specifice dispozitivelor pe alte dispozitive. CAP_SYS_RESOURCE o Utilizeaza spaiul rezervat pe sistemele de fiiere ext2; o face apeluri ioctl(2) care controleaza jurnalizarea ext3; o suprascrie limitele cotelor de disc; o crete limitele resurselor (a se vedea setrlimit(2)); o suprascrie limita resurselor RLIMIT_NPROC; o suprascrie numarul maxim de console in alocarea consolelor; o suprascrie numarul maxim de aranjamente de tastatura; o permite intreruperi mai mari de 64hz de la ceasul in timp real; o ridica limita msg_qbytes pentru o coada de mesaje System V peste limita din /proc/sys/kernel/msgmnb (consultai msgop(2) i msgctl(2)); o permite ca limita de resurse RLIMIT_NOFILE privind numarul de descriptori de fiiere ,,in zbor" sa fie ocolita atunci cand se transmit descriptori de fiiere unui alt proces prin intermediul unui soclu de domeniu UNIX [a se vedea unix(7)]; o suprascrie limita /proc/sys/fs/pipe-size-max atunci cand se stabilete capacitatea unei conducte utilizand comanda F_SETPIPE_SZ fcntl(2); o utilizeaza F_SETPIPE_SZ pentru a crete capacitatea unei conducte peste limita specificata de /proc/sys/fs/pipe-max-size; o suprascrie limitele /proc/sys/fs/mqueue/queues_max, /proc/sys/fs/mqueue/msg_max i /proc/sys/fs/mqueue/msgsize_max la crearea cozilor de mesaje POSIX (consultai mq_overview(7)); o utilizeaza operaia prctl(2) PR_SET_MM; o stabilete /proc/pid/oom_score_adj la o valoare mai mica decat ultima valoare stabilita de un proces cu CAP_SYS_RESOURCE. CAP_SYS_TIME Regleaza ceasul sistemului (settimeofday(2), stime(2), adjtimex(2)); regleaza ceasul in timp real (hardware). CAP_SYS_TTY_CONFIG Utilizeaza vhangup(2); utilizeaza diverse operaii privilegiate ioctl(2) pe terminale virtuale. CAP_SYSLOG (incepand cu Linux 2.6.37) o Efectueaza operaii privilegiate syslog(2). Consultai syslog(2) pentru informaii privind operaiile care necesita privilegii. o Vizualizeaza adresele nucleului expuse prin /proc i alte interfee atunci cand /proc/sys/kernel/kptr_restrict are valoarea 1. (Consultai discuia despre kptr_restrict in proc(5).) CAP_WAKE_ALARM (incepand cu Linux 3.0) Declaneaza ceva care va trezi sistemul (definete temporizatoarele CLOCK_REALTIME_ALARM i CLOCK_BOOTTIME_ALARM). Implementarea trecuta i actuala O implementare completa a capacitailor necesita urmatoarele: o Pentru toate operaiile privilegiate, nucleul trebuie sa verifice daca firul are capacitatea necesara in setul sau efectiv. o Nucleul trebuie sa furnizeze apeluri de sistem care sa permita modificarea i recuperarea seturilor de capacitai ale unui fir. o Sistemul de fiiere trebuie sa permita ataarea de capacitai la un fiier executabil, astfel incat un proces sa obina aceste capacitai atunci cand fiierul este executat. Inainte de Linux 2.6.24, doar primele doua dintre aceste cerine sunt indeplinite; incepand cu Linux 2.6.24, toate cele trei cerine sunt indeplinite. Note pentru dezvoltatorii nucleului Cand adaugai o noua caracteristica a nucleului care ar trebui sa fie reglementata de o capacitate, luai in considerare urmatoarele puncte. o Scopul capacitailor este de a impari puterea superutilizatorului in pari, astfel incat, daca un program care are una sau mai multe capacitai este compromis, puterea sa de a provoca daune sistemului sa fie mai mica decat a aceluiai program care ruleaza cu privilegii de root. o Putei alege fie sa creai o noua capacitate pentru noua caracteristica, fie sa asociai caracteristica cu una dintre capacitaile existente. Pentru a menine setul de capacitai la o dimensiune gestionabila, ultima opiune este preferabila, cu excepia cazului in care exista motive imperioase pentru a alege prima opiune; (exista i o limita tehnica: dimensiunea seturilor de capacitai este limitata in prezent la 64 de bii). o Pentru a determina ce capacitate existenta ar putea fi cel mai bine asociata cu noua caracteristica, revizuii lista de capacitai de mai sus pentru a gasi un ,,silo" (un grup) in care noua caracteristica se incadreaza cel mai bine. O abordare de urmat este de a determina daca exista alte caracteristici care necesita capacitai care vor fi intotdeauna utilizate impreuna cu noua caracteristica. Daca noua caracteristica este inutila fara aceste alte caracteristici, ar trebui sa utilizai aceeai capacitate ca i celelalte caracteristici. o Nu alegei capacitatea CAP_SYS_ADMIN daca o putei evita! O mare parte din verificarile de capacitate existente sunt asociate cu aceasta capacitate (a se vedea lista pariala de mai sus). Aceasta poate fi numita in mod plauzibil ,,noua radacina", deoarece, pe de o parte, confera o gama larga de puteri, iar pe de alta parte, domeniul sau larg de aplicare inseamna ca aceasta este capacitatea care este necesara pentru multe programe privilegiate. Nu inrautaii problema. Singurele caracteristici noi care ar trebui asociate cu CAP_SYS_ADMIN sunt cele care aproape corespund utilizarilor existente in acel ,,silo" (grup). o Daca ai stabilit ca este cu adevarat necesar sa creai o noua capacitate pentru caracteristica dvs., nu o creai sau numii-o ca fiind o capacitate ,,de unica folosina". Astfel, de exemplu, adaugarea caracteristicii foarte specifice CAP_SYS_PACCT a fost probabil o greeala. In schimb, incercai sa identificai i sa denumii noua dvs. capacitate ca un ,,silo" (grup) mai larg in care s-ar putea incadra alte cazuri de utilizare viitoare conexe. Seturi de capacitai pentru fire Fiecare fir are urmatoarele seturi de capacitai care conin zero sau mai multe dintre capacitaile de mai sus: Permitted (permis) Acesta este un superset limitativ pentru capacitaile efective pe care firul le poate prelua. Este, de asemenea, un superset limitativ pentru capacitaile care pot fi adaugate la setul motenit de un fir care nu are capacitatea CAP_SETPCAP in setul sau efectiv. In cazul in care un fir de execuie renuna la o capacitate din setul sau permis, acesta nu o poate redobandi niciodata (cu excepia cazului in care execve(2)s fie un program set-user-ID-root, fie un program ale carui capacitai de fiier asociate acorda aceasta capacitate). Inheritable (motenibil) Acesta este un set de capacitai pastrate de-a lungul unui execve(2). Capacitaile motenite raman motenite atunci cand se executa orice program, iar capacitaile motenite sunt adaugate la setul permis atunci cand se executa un program care are biii corespunzatori activai in setul motenit al fiierului. Deoarece capacitaile motenite nu sunt, in general, pastrate in execve(2) atunci cand se ruleaza ca utilizator non-root, aplicaiile care doresc sa ruleze programe ajutatoare cu capacitai ridicate ar trebui sa ia in considerare utilizarea capacitailor ambientale, descrise mai jos. Effective (efectiv) Acesta este setul de capacitai utilizate de nucleu pentru a efectua verificari ale permisiunilor pentru fir. Bounding (limitare) (per-fir incepand cu Linux 2.6.25) Setul de limitare a capacitailor este un mecanism care poate fi utilizat pentru a limita capacitaile care sunt obinute in timpul execve(2). Incepand cu Linux 2.6.25, acesta este un set de capacitai pentru fiecare fir. In nucleele mai vechi, setul de limitare a capacitailor era un atribut la nivel de sistem partajat de toate firele din sistem. Pentru mai multe detalii, a se vedea mai jos seciunea Setul de limitare a capacitailor. Ambient (ambiental) (incepand cu Linux 4.3) Acesta este un set de capacitai care sunt pastrate pe parcursul unei execve(2) a unui program care nu este privilegiat. Setul de capacitai ambientale respecta invariantul conform caruia nicio capacitate nu poate fi ambientala daca nu este permisa i motenita. Setul de capacitai ambientale poate fi modificat direct utilizand prctl(2). Capacitaile ambientale sunt reduse automat daca oricare dintre capacitaile permise sau motenite corespunzatoare este redusa. Executarea unui program care modifica UID-ul sau GID-ul datorita biilor set-user-ID sau set-group-ID sau execuia unui program care are orice capacitate de fiier activata va terge setul ambiental. Capacitaile ambientale sunt adaugate la setul permis i atribuite setului efectiv atunci cand este apelat execve(2). Daca capacitaile ambientale determina creterea capacitailor permise i efective ale unui proces in timpul unui apel execve(2), acest lucru nu declaneaza modul de execuie securizat descris in ld.so(8). Un copil creat prin fork(2) motenete copii ale seturilor de capacitai ale parintelui sau. Pentru detalii privind modul in care execve(2) afecteaza capacitaile, consultai seciunea Transformarea capacitailor in timpul execve() de mai jos. Folosind capset(2), un fir ii poate manipula propriile seturi de capacitai; a se vedea mai jos seciunea Ajustarea programatica a seturilor de capacitai. Incepand cu Linux 3.2, fiierul /proc/sys/kernel/cap_last_cap expune valoarea numerica a celei mai inalte capacitai acceptate de nucleul care ruleaza; aceasta poate fi utilizata pentru a determina cel mai inalt bit care poate fi activat intr-un set de capacitai. Capacitai de fiier Incepand cu Linux 2.6.24, nucleul accepta asocierea seturilor de capacitai cu un fiier executabil utilizand setcap(8). Seturile de capacitai ale fiierului sunt stocate intr-un atribut extins (a se vedea setxattr(2) i xattr(7)) numit security.capability. Seturile de capacitai ale fiierului, impreuna cu seturile de capacitai ale firului, determina capacitaile unui fir dupa un execve(2). Cele trei seturi de capacitai de fiier sunt: Permitted (cunoscut anterior ca forced (forat)): Aceste capacitai sunt permise automat firului, indiferent de capacitaile motenite ale firului. Inheritable (cunoscut anterior ca allowed (permis)): Acest set este combinat printr-un I logic cu setul motenit al firului pentru a determina ce capacitai motenite sunt activate in setul permis al firului dupa execve(2). Effective: Acesta nu este un set, ci mai degraba un singur bit. Daca acest bit este activat, atunci in timpul unui execve(2) toate noile capacitai permise pentru firul de execuie sunt, de asemenea, adaugate in setul efectiv. Daca acest bit nu este activat, atunci dupa un execve(2), niciuna dintre noile capacitai permise nu se afla in noul set efectiv. Activarea bitului de capacitate efectiva a fiierului implica faptul ca orice capacitate permisa sau motenita a fiierului care determina un fir de execuie sa dobandeasca capacitatea permisa corespunzatoare in timpul unui execve(2) (a se vedea seciunea Transformarea capacitailor in timpul execve() de mai jos) va dobandi i capacitatea respectiva in setul sau efectiv. Prin urmare, atunci cand se atribuie capacitai unui fiier (setcap(8), cap_set_file(3), cap_set_fd(3)), daca se specifica faptul ca fanionul efectiv este activat pentru orice capacitate, atunci fanionul efectiv trebuie, de asemenea, sa fie specificat ca activat pentru toate celelalte capacitai pentru care este activat fanionul permis sau motenit corespunzator. Versiunea extinsa a atributelor capacitaii fiierului Pentru a permite extensibilitatea, nucleul accepta o schema de codare a unui numar de versiune in interiorul atributului extins security.capability care este utilizat pentru implementarea capacitailor fiierelor. Aceste numere de versiune sunt interne implementarii i nu sunt vizibile direct pentru aplicaiile din spaiul utilizatorului. Pana in prezent, sunt acceptate urmatoarele versiuni: VFS_CAP_REVISION_1 Aceasta a fost implementarea originala a capacitailor de fiier, care suporta mati pe 32 de bii pentru capacitaile de fiier. VFS_CAP_REVISION_2 (incepand cu Linux 2.6.25) Aceasta versiune permite matile de capacitai ale fiierelor care au o dimensiune de 64 de bii i a fost necesara deoarece numarul capacitailor acceptate a crescut peste 32. In mod transparent, nucleul continua sa susina executarea fiierelor care au mati de capacitai versiunea 1 pe 32 de bii, dar atunci cand adauga capacitai fiierelor care nu aveau anterior capacitai sau modifica capacitaile fiierelor existente, utilizeaza in mod automat schema versiunea 2 (sau posibil schema versiunea 3, dupa cum se descrie mai jos). VFS_CAP_REVISION_3 (incepand cu Linux 4.14) Capacitaile de fiier ale versiunii 3 sunt furnizate pentru a oferi suport capacitailor de fiier cu spaii de nume (descrise mai jos). La fel ca in cazul capacitailor fiierelor din versiunea 2, matile capacitailor din versiunea 3 au o dimensiune de 64 de bii. Dar, in plus, ID-ul utilizatorului radacina al spaiului de nume este codificat in atributul extins security.capability; (ID-ul de utilizator radacina al unui spaiu de nume este valoarea la care ID-ul de utilizator 0 din interiorul acelui spaiu de nume corespunde in spaiul de nume al utilizatorului iniial). Capacitaile fiierelor versiunea 3 sunt concepute pentru a coexista cu capacitaile versiunii 2; adica, pe un sistem Linux modern, pot exista unele fiiere cu capacitai versiunea 2, in timp ce altele au capacitai versiunea 3. Inainte de Linux 4.14, singurul tip de atribut extins de capacitate de fiier care putea fi ataat unui fiier era un atribut VFS_CAP_REVISION_2. Incepand cu Linux 4.14, versiunea atributului extins security.capability care este ataata unui fiier depinde de circumstanele in care a fost creat atributul. Incepand cu Linux 4.14, un atribut extins security.capability este creat automat ca (sau convertit in) un atribut versiunea 3 (VFS_CAP_REVISION_3) daca ambele situaii de mai jos sunt adevarate: o Firul care scrie atributul se afla intr-un spaiu de nume de utilizator neiniial; (mai precis: firul se afla intr-un alt spaiu de nume al utilizatorului decat cel din care a fost montat sistemul de fiiere subiacent). o Firul are capacitatea CAP_SETFCAP asupra nodului-i al fiierului, ceea ce inseamna ca (a) firul are capacitatea CAP_SETFCAP in propriul sau spaiu de nume al utilizatorului; i (b) UID i GID ale nodului-i al fiierului au corespondene in spaiul de nume al utilizatorului scriitorului. Cand se creeaza un atribut extins VFS_CAP_REVISION_3 security.capability, ID-ul de utilizator radacina al spaiului de nume de utilizator al firului de creare este salvat in atributul extins. In schimb, crearea sau modificarea unui atribut extins security.capability dintr-un fir privilegiat (CAP_SETFCAP) care se afla in spaiul de nume in care a fost montat sistemul de fiiere subiacent (aceasta inseamna in mod normal spaiul de nume iniial al utilizatorului) are ca rezultat automat crearea unui atribut versiunea 2 (VFS_CAP_REVISION_2). Reinei ca crearea unui atribut extins security.capability versiunea 3 este automata. Cu alte cuvinte, atunci cand o aplicaie din spaiul utilizatorului scrie (setxattr(2)) un atribut security.capability in formatul versiunea 2, nucleul va crea automat un atribut versiunea 3 daca atributul este creat in circumstanele descrise mai sus. In mod corespunzator, atunci cand un atribut security.capability versiunea 3 este recuperat (getxattr(2)) de catre un proces care se afla intr-un spaiu de nume al utilizatorului care a fost creat de ID-ul utilizatorului radacina (sau de un descendent al acestui spaiu de nume al utilizatorului), atributul returnat este (automat) simplificat pentru a aparea ca un atribut versiunea 2 (i anume, valoarea returnata are dimensiunea unui atribut versiunea 2 i nu include ID-ul utilizatorului radacina). Aceste conversii automate inseamna ca nu sunt necesare modificari ale instrumentelor din spaiul utilizatorului (de exemplu, setcap(1) i getcap(1)) pentru ca aceste instrumente sa poata fi utilizate pentru a crea i a extrage atribute security.capability versiunea 3. Reinei ca un fiier poate avea asociat un atribut extins security.capability versiunea 2 sau versiunea 3, dar nu ambele: crearea sau modificarea atributului extins security.capability va modifica automat versiunea in funcie de circumstanele in care atributul extins este creat sau modificat. Transformarea capacitailor in timpul execve() In timpul unui execve(2), nucleul calculeaza noile capacitai ale procesului utilizand urmatorul algoritm: P'(ambient) = (fiierul este privilegiat) ? 0 : P(ambient) P'(permitted) = (P(inheritable) & F(inheritable)) | (F(permitted) & P(bounding)) | P'(ambient) P'(effective) = F(effective) ? P'(permitted) : P'(ambient) P'(inheritable) = P(inheritable) [adica neschimbata] P'(bounding) = P(bounding) [adica neschimbata] unde: P() indica valoarea capacitaii unui fir de execuie stabilita inainte de execve(2) P'() indica valoarea capacitaii unui fir de execuie stabilita dupa execve(2) F() indica un set de capacitai de fiier Reinei urmatoarele detalii referitoare la regulile de transformare a capacitailor de mai sus: o Setul de capacitai ambientale este prezent doar incepand cu Linux 4.3. Atunci cand se determina transformarea setului ambiental in timpul execve(2), un fiier privilegiat este unul care are capacitai sau are bitul set-user-ID sau set-group-ID activat. o Inainte de Linux 2.6.25, setul de limitare era un atribut la nivel de sistem partajat de toate firele. Aceasta valoare la nivel de sistem era utilizata pentru a calcula noul set permis in timpul execve(2) in acelai mod ca cel prezentat mai sus pentru P(bounding). Nota: in timpul tranziiilor de capacitate descrise mai sus, capacitaile de fiier pot fi ignorate (tratate ca fiind goale) din aceleai motive pentru care sunt ignorai biii set-user-ID i set-group-ID; a se vedea execve(2). Capacitaile de fiier sunt ignorate in mod similar daca nucleul a fost iniiat cu opiunea no_file_caps. Nota: in conformitate cu regulile de mai sus, daca un proces cu ID-uri de utilizator diferite de zero executa un execve(2), toate capacitaile care sunt prezente in seturile sale permise i efective vor fi terse. Pentru tratamentul capacitailor atunci cand un proces cu un ID utilizator zero efectueaza un execve(2), a se vedea seciunea Capacitai i executarea de programe de catre root de mai jos. Verificarea siguranei pentru binarele cu capacitai reduse Un binar ,,capability-dumb" este o aplicaie care a fost marcata pentru a avea capacitai de fiier, dar care nu a fost convertita pentru a utiliza API-ul libcap(3) pentru a-i manipula capacitaile (cu alte cuvinte, acesta este un program tradiional set-user-ID-root care a fost schimbat pentru a utiliza capacitaile fiierului, dar al carui cod nu a fost modificat pentru a inelege capacitaile). Pentru astfel de aplicaii, bitul de capacitate efectiva este definit pe fiier, astfel incat capacitaile permise ale fiierului sunt activate automat in setul efectiv al procesului atunci cand se executa fiierul. Nucleul recunoate un fiier al carui bit de capacitate efectiva este definit ca fiind ,,capability-dumb" in scopul verificarii descrise aici. Atunci cand se executa un binar ,,capability-dumb", nucleul verifica daca procesul a obinut toate capacitaile permise care au fost specificate in setul permis al fiierului, dupa ce au fost efectuate transformarile de capacitai descrise mai sus; (motivul tipic pentru care acest lucru ar putea sa nu se intample este ca setul de limitare a capacitailor a mascat unele dintre capacitaile din setul permis al fiierului). In cazul in care procesul nu a obinut setul complet de capacitai permise ale fiierului, atunci execve(2) eueaza cu eroarea EPERM. Acest lucru previne posibilele riscuri de securitate care ar putea aparea atunci cand o aplicaie cu capacitai insuficiente este executata cu mai puine privilegii decat are nevoie. Reinei ca, prin definiie, aplicaia insai nu ar putea recunoate aceasta problema, deoarece nu utilizeaza API-ul libcap(3). Capacitai i executarea de programe de catre root Pentru a reflecta semantica tradiionala UNIX, nucleul efectueaza un tratament special al capacitailor fiierelor atunci cand un proces cu UID 0 (root) executa un program i atunci cand este executat un program set-user-ID-root. Dupa efectuarea oricaror modificari ale ID-ului efectiv al procesului care au fost declanate de bitul de mod set-user-ID al binarului - de exemplu, schimbarea ID-ului efectiv al utilizatorului la 0 (root) deoarece a fost executat un program set-user-ID-root - nucleul calculeaza seturile de capacitai ale fiierelor dupa cum urmeaza: (1) Daca ID-ul de utilizator real sau efectiv al procesului este 0 (root), atunci seturile de fiiere motenite i permise sunt ignorate; in schimb, acestea sunt considerate in mod teoretic ca fiind toate unu (adica toate capacitaile activate). Exista o excepie de la acest comportament, descrisa in seciunea Programele set-user-ID-root care au capacitai de fiier de mai jos. (2) Daca ID-ul de utilizator efectiv al procesului este 0 (root) sau bitul efectiv al fiierului este de fapt activat, atunci bitul efectiv al fiierului este definit noional ca fiind unu (activat). Aceste valori noionale pentru seturile de capacitai ale fiierului sunt apoi utilizate conform descrierii de mai sus pentru a calcula transformarea capacitailor procesului in timpul execve(2). Astfel, atunci cand un proces cu UID-uri diferite de zero apeleaza execve(2) pe un program set-user-ID-root care nu are capacitai ataate, sau atunci cand un proces ale carui UID-uri reale i efective sunt zero apeleaza execve(2) pe un program, calculul noilor capacitai permise ale procesului se simplifica la: P'(permitted) = P(inheritable) | P(bounding) P'(effective) = P'(permitted) In consecina, procesul obine toate capacitaile din seturile sale de capacitai permise i efective, cu excepia celor mascate de setul de limitare a capacitailor; (in calculul lui P'(permitted), termenul P'(ambient) poate fi simplificat, deoarece este prin definiie un subset propriu al lui P(inheritable)). Tratamentele speciale ale ID-ului de utilizator 0 (root) descrise in aceasta subseciune pot fi dezactivate utilizand mecanismul ,,securebits" descris mai jos. Programele set-user-ID-root care au capacitai de fiier Exista o excepie de la comportamentul descris la punctul Capacitai i executarea de programe de catre root de mai sus. Daca (a) binarul care este executat are ataate capacitai i (b) ID-ul de utilizator real al procesului nu este 0 (root) i (c) ID-ul de utilizator efectiv al procesului este este 0 (root), atunci biii de capacitate ai fiierului sunt onorai (adica nu sunt considerai teoretic ca fiind toi unu). Modul obinuit in care poate aparea aceasta situaie este atunci cand se executa un program set-UID-root care are, de asemenea, capacitai de fiier. Atunci cand se executa un astfel de program, procesul obine doar capacitaile acordate de program (i anume, nu toate capacitaile, aa cum s-ar intampla in cazul executarii unui program set-user-ID-root care nu are asociate capacitai de fiier). Reinei ca se pot atribui seturi de capacitai goale unui fiier de program i, astfel, este posibil sa se creeze un program set-user-ID-root care modifica set-user-ID-ul efectiv i salvat al procesului care executa programul la 0, dar nu confera nicio capacitate procesului respectiv. Setul de limitare a capacitailor Setul de limitare a capacitailor este un mecanism de securitate care poate fi utilizat pentru a limita capacitaile care pot fi obinute in timpul unei execve(2). Setul de limitare este utilizat in urmatoarele moduri: o In timpul unei operaii execve(2), setul de limitare a capacitailor este combinat cu I logic cu setul de capacitai permise ale fiierului, iar rezultatul acestei operaii este atribuit setului de capacitai permise ale firului. Setul de limitare a capacitailor impune astfel o limita asupra capacitailor permise care pot fi acordate de un fiier executabil. o (Incepand cu Linux 2.6.25) Setul de limitare a capacitailor acioneaza ca un superset limitativ pentru capacitaile pe care un fir le poate adauga la setul sau motenit utilizand capset(2). Aceasta inseamna ca, daca o capacitate nu se afla in setul limitativ, atunci un fir de execuie nu poate adauga aceasta capacitate la setul sau motenit, chiar daca se afla in capacitaile sale permise, i, prin urmare, nu poate pastra aceasta capacitate in setul sau permis atunci cand se apeleaza execve(2) pe un fiier care are capacitatea in setul sau motenit. Reinei ca setul delimitator mascheaza capacitaile permise ale fiierului, dar nu i capacitaile motenite. In cazul in care un fir de execuie menine o capacitate in setul sau motenit care nu se afla in setul sau limitativ, atunci acesta poate obine in continuare acea capacitate in setul sau permis prin executarea unui fiier care are capacitatea respectiva in setul sau motenit. In funcie de versiunea nucleului, setul de limitare a capacitaii este fie un atribut la nivel de sistem, fie un atribut per proces. Setul de limitare a capacitailor de la Linux 2.6.25 incoace Incepand cu Linux 2.6.25, setul de limitare a capacitailor este un atribut per-fir; (setul de delimitare a capacitailor la nivelul intregului sistem descris mai jos nu mai exista). Setul de limitare este motenit la fork(2) de la parintele firului i este pastrat pe parcursul unui execve(2). Un fir de execuie poate elimina capacitai din setul sau de limitare a capacitailor utilizand operaia prctl(2) PR_CAPBSET_DROP, cu condiia sa aiba capacitatea CAP_SETPCAP. Odata ce o capacitate a fost eliminata din setul limitator, aceasta nu mai poate fi readusa in acel set. Un fir de execuie poate determina daca o capacitate se afla in setul sau limitator utilizand operaia prctl(2) PR_CAPBSET_READ. Eliminarea capacitailor din setul de limitare este acceptata numai daca capacitaile de fiier sunt compilate in nucleu. Inainte de Linux 2.6.33, capacitaile de fiier erau o caracteristica opionala configurabila prin opiunea CONFIG_SECURITY_FILE_CAPABILITIES. Incepand cu Linux 2.6.33, opiunea de configurare a fost eliminata, iar capacitaile de fiier fac intotdeauna parte din nucleu. Atunci cand capacitaile de fiier sunt compilate in nucleu, procesul init (stramoul tuturor proceselor) incepe cu un set de limitare complet. In cazul in care capacitaile de fiier nu sunt compilate in nucleu, atunci init incepe cu un set de limitare complet minus CAP_SETPCAP, deoarece aceasta capacitate are o semnificaie diferita atunci cand nu exista capacitai de fiier. Eliminarea unei capacitai din setul limitator nu o elimina din setul motenit al firului. Cu toate acestea, impiedica adaugarea in viitor a capacitaii inapoi in setul motenit al firului. Setul de limitare a capacitailor inainte de Linux 2.6.25 Inainte de Linux 2.6.25, setul de limitare a capacitailor este un atribut la nivel de sistem care afecteaza toate firele din sistem. Setul de limitare este accesibil prin intermediul fiierului /proc/sys/kernel/cap-bound; (in mod confuz, acest parametru al matii de bii este exprimat ca numar zecimal cu semn in /proc/sys/kernel/cap-bound). Numai procesul init poate stabili capacitai in setul de limitare a capacitailor; in afara de acesta, superutilizatorul (mai precis: un proces cu capacitatea CAP_SYS_MODULE) poate doar terge capacitai din acest set. Intr-un sistem standard, setul de limitare a capacitailor mascheaza intotdeauna capacitatea CAP_SETPCAP. Pentru a elimina aceasta restricie (periculos!), modificai definiia lui CAP_INIT_EFF_SET in include/linux/capability.h i reconstruii nucleul. In Linux 2.2.11 a fost adaugata funcia de set de limitare a capacitailor la nivel de sistem. Efectul modificarilor ID-ului utilizatorului asupra capacitailor Pentru a pastra semantica tradiionala pentru tranziiile intre ID-uri de utilizator 0 i diferite de zero, nucleul efectueaza urmatoarele modificari ale seturilor de capacitai ale unui fir de execuie la modificarile ID-urilor de utilizator reale, efective, salvate i ale sistemului de fiiere ale firului de execuie (utilizand setuid(2), setresuid(2) sau similar): o In cazul in care unul sau mai multe dintre ID-urile de utilizator ale setului real, efectiv sau salvat au fost anterior 0 i, ca urmare a modificarilor UID, toate aceste ID-uri au o valoare diferita de zero, atunci toate capacitaile sunt terse din seturile de capacitai permise, efective i ambientale. o Daca ID-ul efectiv al utilizatorului este schimbat de la 0 la diferit de zero, atunci toate capacitaile sunt terse din setul efectiv. o Daca ID-ul utilizatorului efectiv este schimbat de la diferit de zero la 0, atunci setul permis este copiat in setul efectiv. o Daca ID-ul utilizatorului sistemului de fiiere este schimbat de la 0 la diferit de zero (a se vedea setfsuid(2)), urmatoarele capacitai sunt terse din setul efectiv: CAP_CHOWN, CAP_DAC_OVERRIDE, CAP_DAC_READ_SEARCH, CAP_FOWNER, CAP_FSETID, CAP_LINUX_IMMUTABLE (incepand cu Linux 2.6.30), CAP_MAC_OVERRIDE i CAP_MKNOD (incepand cu Linux 2.6.30). Daca UID-ul sistemului de fiiere este schimbat de la diferit de zero la 0, atunci oricare dintre aceste capacitai care sunt activate in setul permis sunt activate in setul efectiv. Daca un fir care are o valoare 0 pentru unul sau mai multe dintre ID-urile sale de utilizator dorete sa impiedice tergerea setului sau de capacitai permise atunci cand ii restabilete toate ID-urile de utilizator la valori diferite de zero, acesta poate face acest lucru utilizand fanionul ,,securebits" SECBIT_KEEP_CAPS descris mai jos. Ajustarea programatica a seturilor de capacitai Un fir de execuie ii poate recupera i modifica seturile de capacitai permise, efective i motenite utilizand apelurile de sistem capget(2) i capset(2). Cu toate acestea, in acest scop este preferata utilizarea apelurilor cap_get_proc(3) i cap_set_proc(3), ambele furnizate in pachetul libcap. Urmatoarele reguli guverneaza modificarile aduse seturilor de capacitai ale firelor de execuie: o Daca apelantul nu are capacitatea CAP_SETPCAP, noul set motenit trebuie sa fie un subset al combinaiei dintre seturile motenite i permise existente. o (De la Linux 2.6.25) Noul set motenit trebuie sa fie un subset al combinaiei dintre setul motenit existent i setul de limitare a capacitailor. o Noul set permis trebuie sa fie un subset al setului permis existent (de exemplu, nu este posibil sa se dobandeasca capacitai permise pe care firul nu le are in prezent). o Noul set efectiv trebuie sa fie un subset al noului set permis. Fanioanele ,,securebits": stabilirea unui mediu exclusiv pentru capacitai Incepand cu Linux 2.6.26, i cu un nucleu in care sunt activate capacitaile de fiier, Linux implementeaza un set de fanioane securebits per-fir care pot fi utilizate pentru a dezactiva gestionarea speciala a capacitailor pentru UID 0 (root). Aceste fanioane sunt dupa cum urmeaza: SECBIT_KEEP_CAPS Definirea acestui fanion permite unui fir care are unul sau mai multe UID-uri 0 sa pastreze capacitaile din setul sau permis atunci cand ii schimba toate UID-urile la valori diferite de zero. Daca acest fanion nu este definit, atunci o astfel de schimbare de UID face ca firul sa piarda toate capacitaile permise. Acest fanion este intotdeauna eliminat in cazul unui apel execve(2). Reinei ca, chiar daca fanionul SECBIT_KEEP_CAPS este activat, capacitaile efective ale unui fir sunt terse atunci cand acesta ii schimba UID-ul efectiv la o valoare diferita de zero. Cu toate acestea, daca firul de execuie a activat acest fanion i UID-ul sau efectiv este deja diferit de zero, iar firul de execuie trece ulterior toate celelalte UID-uri la valori diferite de zero, capacitaile efective nu vor fi terse. Activarea fanionului SECBIT_KEEP_CAPS este ignorata daca este activat fanionul SECBIT_NO_SETUID_FIXUP; (cel din urma fanion ofera un superset al efectului primului fanion). Acest fanion ofera aceeai funcionalitate ca i vechea operaie prctl(2) PR_SET_KEEPCAPS. SECBIT_NO_SETUID_FIXUP Activarea acestui fanion impiedica nucleul sa ajusteze seturile de capacitai permise, efective i ambientale ale procesului atunci cand UID-urile efective i de sistem de fiiere ale firului sunt schimbate intre valori zero i diferite de zero. Consultai Efectul modificarilor ID-ului utilizatorului asupra capacitailor de mai sus. SECBIT_NOROOT Daca acest bit este activat, atunci nucleul nu acorda capacitai atunci cand este executat un program set-user-ID-root sau cand un proces cu un UID efectiv sau real de 0 apeleaza execve(2); (a se vedea seciunea Capacitai i executarea de programe de catre root de mai sus). SECBIT_NO_CAP_AMBIENT_RAISE Activarea acestui fanion nu permite creterea capacitailor ambientale prin operaia prctl(2) PR_CAP_AMBIENT_RAISE. Fiecare dintre fanioanele ,,de baza" de mai sus are un fanion ,,blocat" insoitor. Activarea oricarui fanion ,,blocat" este ireversibila i are ca efect impiedicarea modificarilor ulterioare ale fanionului ,,de baza" corespunzator. Indicatoarele blocate sunt: SECBIT_KEEP_CAPS_LOCKED, SECBIT_NO_SETUID_FIXUP_LOCKED, SECBIT_NOROOT_LOCKED i SECBIT_NO_CAP_AMBIENT_RAISE_LOCKED. Fanioanele securebits pot fi modificate i recuperate utilizand operaiile prctl(2) PR_SET_SECUREBITS i PR_GET_SECUREBITS. Capacitatea CAP_SETPCAP este necesara pentru modificarea fanioanelor. Reinei ca constantele SECBIT_* sunt disponibile numai dupa includerea fiierului antet . Fanioanele securebits sunt motenite de procesele copii. In timpul unui execve(2), toate fanioanele sunt pastrate, cu excepia SECBIT_KEEP_CAPS care este intotdeauna ters. O aplicaie poate utiliza urmatorul apel pentru a se bloca, impreuna cu toi descendenii sai, intr-un mediu in care singura modalitate de a obine capacitai este prin executarea unui program cu capacitai de fiier asociate: prctl(PR_SET_SECUREBITS, /* SECBIT_KEEP_CAPS off */ SECBIT_KEEP_CAPS_LOCKED | SECBIT_NO_SETUID_FIXUP | SECBIT_NO_SETUID_FIXUP_LOCKED | SECBIT_NOROOT | SECBIT_NOROOT_LOCKED); /* Definirea/blocarea SECBIT_NO_CAP_AMBIENT_RAISE nu este necesara */ Programele "set-user-ID-root" per spaiu de nume de utilizator Un program set-user-ID al carui UID se potrivete cu UID-ul care a creat un spaiu de nume de utilizator va conferi capacitai in seturile permise i efective ale procesului atunci cand este executat de orice proces din interiorul acelui spaiu de nume sau al oricarui spaiu de nume de utilizator descendent. Regulile privind transformarea capacitailor procesului in timpul execve(2) sunt exact cele descrise in Transformarea capacitailor in timpul execve() i Capacitaile i executarea de programe de catre root de mai sus, cu diferena ca, in ultima subseciune, ,,root" este UID-ul creatorului spaiului de nume al utilizatorului. Capacitai de fiiere plasate in spaii de nume Capacitaile de fiier tradiionale (adica versiunea 2) asociaza doar un set de mati de capacitai cu un fiier binar executabil. Atunci cand un proces executa un fiier binar cu astfel de capacitai, acesta obine capacitaile asociate (in cadrul spaiului sau de nume de utilizator) conform regulilor descrise la punctul Transformarea capacitailor in timpul execve() de mai sus. Deoarece capacitaile de fiier ale versiunii 2 confera capacitai procesului executant indiferent de spaiul de nume al utilizatorului in care acesta se afla, numai procesele privilegiate sunt autorizate sa asocieze capacitai cu un fiier. Aici, ,,privilegiat" inseamna un proces care are capacitatea CAP_SETFCAP in spaiul de nume al utilizatorului in care a fost montat sistemul de fiiere (in mod normal, spaiul de nume al utilizatorului iniial). Aceasta limitare face ca capacitaile fiierelor sa fie inutile pentru anumite cazuri de utilizare. De exemplu, in containerele cu spaiu de nume de utilizator, poate fi de dorit sa se poata crea un binar care sa confere capacitai numai proceselor executate in interiorul containerului respectiv, dar nu i proceselor care sunt executate in afara containerului. Linux 4.14 a adaugat aa-numitele capacitai de fiier cu spaii de nume pentru a oferi suport pentru astfel de cazuri de utilizare. Capacitaile de fiier cu spaii de nume sunt inregistrate ca atribute extinse security.capability versiunea 3 (adica, VFS_CAP_REVISION_3). Un astfel de atribut este creat automat in circumstanele descrise la Versiunea extinsa a atributelor capacitaii fiierului de mai sus. Atunci cand este creat un atribut extins security.capability versiunea 3, nucleul inregistreaza nu numai matile de capacitate in atributul extins, ci i ID-ul utilizatorului radacina al spaiului de nume. Ca i in cazul unui binar care are capacitai de fiier VFS_CAP_REVISION_2, un binar cu capacitai de fiier VFS_CAP_REVISION_3 confera capacitai unui proces in timpul execve(). Cu toate acestea, capacitaile sunt conferite numai daca binarul este executat de un proces care se afla intr-un spaiu de nume al utilizatorului al carui UID 0 corespunde ID-ului utilizatorului root care este salvat in atributul extins sau atunci cand este executat de un proces care se afla intr-un descendent al unui astfel de spaiu de nume. Interaciunea cu spaiile de nume ale utilizatorilor Pentru informaii suplimentare privind interaciunea dintre capacitai i spaiile de nume ale utilizatorilor, consultai user_namespaces(7). STANDARDE Nu exista standarde care sa reglementeze capacitaile, dar implementarea capacitailor Linux se bazeaza pe proiectul de standard POSIX.1e retras . NOTE Atunci cand incercai sa strace(1) binarii care au capacitai (sau binarii set-user-ID-root), este posibil sa gasii utila opiunea -u . Ceva precum: $ sudo strace -o trace.log -u ceci ./prog_meu_privat De la Linux 2.5.27 la Linux 2.6.26, capacitaile erau o componenta opionala a nucleului i puteau fi activate/dezactivate prin opiunea de configurare a nucleului CONFIG_SECURITY_CAPABILITIES. Fiierul /proc/pid/task/TID/status poate fi utilizat pentru a vizualiza seturile de capacitai ale unui fir. Fiierul /proc/pid/status arata seturile de capacitai ale firului principal al unui proces. Inainte de Linux 3.8, capacitaile inexistente erau afiate ca fiind activate (1) in aceste seturi. Incepand cu Linux 3.8, toate capacitaile inexistente (peste CAP_LAST_CAP) sunt afiate ca fiind dezactivate (0). Pachetul libcap ofera o suita de rutine pentru definirea i obinerea capacitailor care este mai confortabila i mai puin susceptibila de schimbare decat interfaa oferita de capset(2) i capget(2). Acest pachet furnizeaza i programele setcap(8) i getcap(8). Acesta poate fi gasit la adresa . Inainte de Linux 2.6.24 i de la Linux 2.6.24 la Linux 2.6.32, daca capacitaile de fiier nu sunt activate, un fir cu capacitatea CAP_SETPCAP poate manipula capacitaile altor fire decat el. Cu toate acestea, acest lucru este posibil doar teoretic, deoarece niciun fir nu are CAP_SETPCAP in niciunul dintre aceste cazuri: o In implementarea anterioara versiunii 2.6.25, setul de limitare a capacitailor la nivel de sistem, /proc/sys/kernel/cap-bound, mascheaza intotdeauna capacitatea CAP_SETPCAP, iar acest lucru nu poate fi schimbat fara modificarea sursei nucleului i reconstruirea nucleului. o In cazul in care capacitaile de fiier sunt dezactivate (de exemplu, opiunea CONFIG_SECURITY_FILE_CAPABILITIES a nucleului este dezactivata), atunci init incepe cu capacitatea CAP_SETPCAP eliminata din setul sau de limitare per-proces, iar acest set de limitare este motenit de toate celelalte procese create in sistem. CONSULTAI I capsh(1), setpriv(1), prctl(2), setfsuid(2), cap_clear(3), cap_copy_ext(3), cap_from_text(3), cap_get_file(3), cap_get_proc(3), cap_init(3), capgetp(3), capsetp(3), libcap(3), proc(5), credentials(7), pthreads(7), user_namespaces(7), captest(8), filecap(8), getcap(8), getpcaps(8), netcap(8), pscap(8), setcap(8) include/linux/capability.h in arborele sursa al nucleului Linux TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.18 8 februarie 2026 Capacitai(7)