Proiect pentru portarea mecanismului de izolare pledge pentru Linux

Autorul bibliotecii standard C Cosmopolitan și al platformei Redbean a anunțat implementarea mecanismului de izolare pledge() pentru Linux. Inițial, pledge a fost dezvoltat de proiectul OpenBSD și permite interzicerea selectivă a apelurilor de sistem neutilizate de către aplicații (creând o listă albă a apelurilor de sistem pentru aplicație, în timp ce celelalte apeluri sunt interzise). Spre deosebire de mecanismele disponibile în Linux pentru restricționarea accesului la apelurile de sistem, cum ar fi seccomp, mecanismul pledge a fost dezvoltat inițial cu scopul de a simplifica aplicarea acestuia.

Inițiativa eșuată de izolare a aplicațiilor din mediul de bază OpenBSD, utilizând mecanismul systrace, a arătat că izolarea la nivel de apeluri de sistem individuale este prea complicată și dificilă de implementat. Ca alternativă, a fost propus pledge, care permite crearea de reguli de izolare fără a detalia și manipulând clase de acces predefinite. De exemplu, sunt propuse clasele stdio (intrare/ieșire), rpath (doar citire a fișierelor), wpath (scriere a fișierelor), cpath (creare a fișierelor), tmppath (manipularea fișierelor temporare), inet (soci onete de rețea), unix (sockets unix), dns (rezolvarea în DNS), getpw (acces de citire la baza de date a utilizatorilor), ioctl (apel ioctl), proc (gestionarea proceselor), exec (lansarea proceselor) și id (gestionarea drepturilor de acces).

Regulile de lucru cu apelurile de sistem sunt definite sub formă de anotații, incluzând o listă de clase de apeluri de sistem permise și un tablou de căi ale fișierelor la care se permite accesul. După compilarea și lansarea aplicației modificate, nucleul se ocupă de controlul respectării regulilor stabilite.

Separat, se dezvoltă implementarea pledge pentru FreeBSD, care permite izolarea aplicațiilor fără a necesita modificări ale codului acestora, în timp ce în OpenBSD apelul pledge este destinat integrării strânse cu mediul de bază și adăugării de anotații în codul fiecărei aplicații.

Dezvoltatorii portului pledge pentru Linux au folosit ca exemplu FreeBSD și, în loc să facă modificări în cod, au pregătit o utilitate de tip overlay numită pledge.com, care permite aplicarea restricțiilor fără a modifica codul aplicației. De exemplu, pentru a rula utilitarul curl cu acces deschis doar la clasele de apeluri de sistem stdio, rpath, inet și threadstdio, este suficient să executați „./pledge.com -p 'stdio rpath inet thread' curl http://example.com”.

Utilitarul pledge funcționează pe toate distribuțiile Linux, începând cu RHEL6, și nu necesită acces root. În plus, pe baza bibliotecii cosmopolitan, există o API pentru gestionarea restricțiilor în codul programelor scrise în C, care permite, printre altele, crearea de enclave pentru restricționarea selectivă a accesului în funcție de anumite funcții ale aplicației.

Implementarea nu necesită modificări în nucleul sistemului — restricțiile pledge sunt traduse în reguli SECCOMP BPF și sunt procesate prin intermediul mecanismului nativ pentru Linux de izolare a apelurilor de sistem. De exemplu, apelul pledge("stdio rpath", 0) va fi transformat într-un filtru BPF static const struct sock_filter kFilter[] = { /* L0*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, syscall, 0, 14 - 1), /* L1*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[0])), /* L2*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 2, 4 - 3, 0), /* L3*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 10, 0, 13 - 4), /* L4*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[1])), /* L5*/ BPF_STMT(BPF_ALU | BPF_AND | BPF_K, ~0x80800), /* L6*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 1, 8 - 7, 0), /* L7*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 2, 0, 13 - 8), /* L8*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[2])), /* L9*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 0, 12 - 10, 0), /*L10*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 6, 12 - 11, 0), /*L11*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 17, 0, 13 - 11), /*L12*/ BPF_STMT(BPF_RET | BPF_K, SECCOMP_RET_ALLOW), /*L13*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)), /*L14*/ /* next filter */ };

Sursa: opennet.ro

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster