Autori i bibliotekës standarte C, Cosmopolitan dhe platformës Redbean, shpalli zbatimin e mekanizmit të izolojës pledge() për Linux. Fillimisht, pledge është zhvilluar nga projekti OpenBSD dhe lejon që aplikacionet të ndalojnë selektivisht aksesin në thirrjet sistemike të pa përdorura (për aplikacionin krijohet një si listë e bardhë e thirrjeve sistemike, ndërsa thirrjet e tjera ndalohen). Ndryshe nga mekanizmat ekzistues në Linux për kufizimin e aksesit në thirrjet sistemike, të tilla si seccomp, mekanizmi pledge është zhvilluar fillimisht me synimin për thjeshtësimin maksimal të aplikimit.
Iniciativa e përfunduar me dështim e izolojës së aplikacioneve në mjedisin themelor OpenBSD duke përdorur mekanizmin systrace tregoi se izolimi në nivelin e thirrjeve të veçanta sistemike është shumë i komplikuar dhe punë intensive. Si një alternativë, u propozuar pledge, i cili lejonte krijimin e rregullave të izolojës pa u thelluar në detaje dhe duke manipuluar klasat e gatshme të aksesit. Për shembull, propozohet klasat stdio (hyrje/dalje), rpath (vetëm lexim të skedareve), wpath (shkrimi i skedareve), cpath (krijimi i skedareve), tmppath (puna me skedarë të përkohshëm), inet (socketet rrjetore), unix (socketet unix), dns (rezolvimi në DNS), getpw (akses në lexim në bazën e përdoruesve), ioctl (thirrja ioctl), proc (menaxhimi i proceseve), exec (ekzekutimi i proceseve) dhe id (menaxhimi i të drejtave të aksesit).
Rregullat për thirrjet sistemike përcaktohen në formën e aneksimeve, që përfshijnë një listë të klasave të lejuara të thirrjeve sistemike dhe një masë të rrugëve të skedareve, ku lejohet akses. Pas ndërtimit dhe ekzekutimit të aplikacionit të modifikuar, bërthama merr përsipër punën e kontrollit të respektimit të rregullave të caktuara.
Një implementim i veçantë i pledge zhvillohet për FreeBSD, i cili dallon për mundësinë e izolojës së aplikacioneve pa bërë ndryshime në kodin e tyre, ndërsa në OpenBSD thirrja pledge synon integrimin e ngushtë me mjedisin themelor dhe shtimin e aneksimeve në kodin çdo aplikacioni.
Zhvilluesit e portit pledge pĂ«r Linux kanĂ« marrĂ« shembullin nga FreeBSD dhe, nĂ« vend tĂ« ndryshimit tĂ« kodit, pĂ«rgatitĂ«n njĂ« utilitar tĂ« shtresuar pledge.com, qĂ« lejon aplikimin e kufizimeve pa ndryshuar kodin e aplikacionit. PĂ«r shembull, pĂ«r tĂ« ekzekutuar utilitarin curl me hapjen e aksesit vetĂ«m nĂ« klasat e thirrjeve sistemike stdio, rpath, inet dhe threadstdio, mjafton tĂ« ekzekutoni â./pledge.com -p âstdio rpath inet threadâ curl http://example.com.â
Utilitare pledge punon në të gjitha shpërndarjet e Linux, duke filluar nga RHEL6, dhe nuk kërkon akses si root. Për më tepër, mbi bazën e bibliotekës cosmopolitan ofrohet një API për menaxhimin e kufizimeve në kodin e programeve në gjuhën C, duke lejuar gjithashtu krijimin e enklavave për kufizimin selektiv të aksesit në lidhje me funksione të caktuara të aplikacionit.
Implementimi nuk kĂ«rkon ndryshime nĂ« bĂ«rthamĂ« â kufizimet pledge pĂ«rkthehen nĂ« rregulla SECCOMP BPF dhe trajtohen me mekanizmin e izolimit tĂ« thirrjeve sistemore qĂ« Ă«shtĂ« native pĂ«r Linux. PĂ«r shembull, thirrja pledge(«stdio rpath», 0) do tĂ« transformohet nĂ« filtrin 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 */ };
Burimi: opennet.ru
