memfd_secret(2) System Calls Manual memfd_secret(2) NUME memfd_secret - creeaza un fiier anonim bazat pe RAM pentru a accesa regiuni de memorie secrete BIBLIOTECA Biblioteca C standard (libc, -lc) REZUMAT #include /* Definirea constantelor SYS_* */ #include int syscall(SYS_memfd_secret, unsigned int flags); Nota: glibc nu ofera nicio funcie invaluitoare pentru memfd_secret(), fiind necesara utilizarea syscall(2). DESCRIERE memfd_secret() creeaza un fiier anonim bazat pe RAM i returneaza un descriptor de fiier care face referire la acesta. Fiierul ofera o modalitate de a crea i de a accesa regiuni de memorie cu o protecie mai puternica decat fiierele obinuite bazate pe RAM i harile de memorie anonime. Odata ce toate referinele deschise la fiier sunt inchise, acesta este eliberat automat. Dimensiunea iniiala a fiierului este stabilita la 0. In urma apelului, dimensiunea fiierului ar trebui sa fie stabilita utilizand ftruncate(2). Zonele de memorie care susin fiierul creat cu memfd_secret(2) sunt vizibile numai pentru procesele care au acces la descriptorul de fiier. Regiunea de memorie este eliminata din tabelele de pagini ale nucleului i numai tabelele de pagini ale proceselor care dein descriptorul de fiier cartografiaza memoria fizica corespunzatoare; (astfel, paginile din regiune nu pot fi accesate de catre nucleul insui, astfel incat, de exemplu, indicatorii catre regiune nu pot fi trecui in apelurile de sistem). Urmatoarele valori pot fi combinate in mod binar OR in flags pentru a controla comportamentul lui memfd_secret(): FD_CLOEXEC Activeaza fanionul ,,close-on-exec" pe noul descriptor de fiier, ceea ce face ca regiunea sa fie eliminata din proces la execve(2). A se vedea descrierea fanionului O_CLOEXEC in open(2). Ca valoare de retur, memfd_secret() returneaza un nou descriptor de fiier care se refera la un fiier anonim. Acest descriptor de fiier este deschis atat pentru citire, cat i pentru scriere (O_RDWR), iar O_LARGEFILE este definit pentru descriptorul de fiier. In ceea ce privete fork(2) i execve(2), se aplica semantica obinuita pentru descriptorul de fiier creat de memfd_secret(). O copie a descriptorului de fiier este motenita de procesul-copil creat de fork(2) i se refera la acelai fiier. Descriptorul de fiier este pastrat de execve(2), cu excepia cazului in care nu a fost activat fanionul ,,close-on-exec". Regiunea de memorie este blocata in memorie in acelai mod ca i in cazul mlock(2), astfel incat nu va fi niciodata scrisa in spaiul de interschimb, iar hibernarea este inhibata atata timp cat exista descrieri memfd_secret(). Cu toate acestea, implementarea lui memfd_secret() nu va incerca sa populeze intregul interval in timpul apelului mmap(2) care ataeaza regiunea in spaiul de adrese al procesului; in schimb, paginile sunt alocate efectiv doar pe masura ce sunt introduse prin eroare. Cantitatea de memorie permisa pentru harile de memorie ale descriptorului de fiier se supune acelorai reguli ca i mlock(2) i nu poate depai RLIMIT_MEMLOCK. VALOAREA RETURNATA In caz de succes, memfd_secret() returneaza un nou descriptor de fiier. In caz de eroare, se returneaza -1, iar errno este configurata pentru a indica eroarea. ERORI-IEIRE EINVAL flags include bii necunoscui. EMFILE Limita per proces a numarului de descriptori de fiiere deschise a fost atinsa. EMFILE Limita la nivel de sistem a numarului total de fiiere deschise a fost atinsa. ENOMEM Nu a existat suficienta memorie pentru a crea un nou fiier anonim. ENOSYS memfd_secret() nu este implementat pe aceasta arhitectura sau nu a fost activat in linia de comanda a nucleului cu secretmem_enable=1. STANDARDE Linux. ISTORIC Linux 5.14. NOTE Apelul de sistem memfd_secret() este conceput pentru a permite unui proces din spaiul utilizatorului sa creeze un interval de memorie inaccesibil pentru oricine altcineva, inclusiv pentru nucleu. Nu exista o garanie de 100% ca nucleul nu va putea accesa intervale de memorie susinute de memfd_secret() in orice circumstane, dar, cu toate acestea, este mult mai greu de a extrage date din aceste regiuni. memfd_secret() asigura urmatoarele protecii: o Protecie imbunataita (impreuna cu toate celelalte sisteme de prevenire a atacurilor din nucleu) impotriva atacurilor ROP. Absena oricarei primitive in interiorul nucleului pentru accesarea memoriei susinute de memfd_secret() inseamna ca atacul ROP cu un singur gadget (dispozitiv) nu poate funciona pentru a realiza extragerea de date. Atacatorul ar trebui sa gaseasca suficiente gadget-uri ROP pentru a reconstrui intrarile lipsa din tabelul de pagini, ceea ce sporete in mod semnificativ dificultatea atacului, in special atunci cand exista alte protecii, cum ar fi limitarea dimensiunii stivei in nucleu i organizarea aleatorie a spaiului de adrese. o Impiedicai expunerile de memorie in spaiul utilizatorului intre procese. Odata ce o regiune pentru o cartografiere de memorie memfd_secret() este alocata, utilizatorul nu o poate trece accidental in nucleu pentru a fi transmisa undeva. Paginile de memorie din aceasta regiune nu pot fi accesate prin intermediul harii directe i sunt interzise in get_user_pages. o Protejai-va impotriva defectelor de nucleu exploatate. Pentru a accesa zonele de memorie susinute de memfd_secret(), un atac la nivelul nucleului ar trebui fie sa parcurga tabelele de pagini i sa creeze altele noi, fie sa genereze un nou proces privilegiat in spaiul utilizatorului pentru a efectua extragerea de secrete utilizand ptrace(2). Modul in care memfd_secret() aloca i blocheaza memoria poate avea un impact asupra performanelor generale ale sistemului; prin urmare, apelul de sistem este dezactivat in mod implicit i este disponibil numai daca administratorul de sistem l-a activat folosind parametrul de nucleu ,,secretmem.enable=y". Pentru a preveni eventualele scurgeri de date din regiunile de memorie susinute de memfd_secret() dintr-o imagine de hibernare, hibernarea este impiedicata atunci cand exista utilizatori memfd_secret() activi. CONSULTAI I fcntl(2), ftruncate(2), mlock(2), memfd_create(2), mmap(2), setrlimit(2) 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.06 31 octombrie 2023 memfd_secret(2)