Ito ay pinlano na i-port ang pledge isolation mechanism sa Linux

Kamakailan lamang, inanunsyo ng may-akda ng Cosmopolitan C standard library at ng Redbean platform ang pagpapatupad ng pledge() isolation mechanism para sa Linux.

Orihinal na binuo ng proyektong OpenBSD , pinapayagan ka ng pledge na piliing pagbawalan ang mga application sa pag-access sa mga hindi nagamit na system call (lumilikha ng whitelist ng mga system call para sa application at pagbabawal sa iba pang mga tawag). Hindi tulad ng mga mekanismo ng pagkontrol sa access ng syscall na magagamit sa Linux, tulad ng seccomp, ang pledge ay dinisenyo mula sa simula upang maging madaling gamitin hangga't maaari.

Ang nabigong inisyatiba upang ihiwalay ang mga application sa OpenBSD base environment gamit ang mekanismo ng systrace ay nagpakita na ang paghihiwalay sa antas ng mga indibidwal na tawag sa system ay masyadong kumplikado at nakakaubos ng oras.

Bilang kahalili, iminungkahi ang pledge, na nagpapahintulot sa paglikha ng mga panuntunan sa paghihiwalay nang hindi kinakailangang idetalye at manipulahin ang mga inihandang klase ng access.

Halimbawa, ang mga klase na inaalok ay stdio (input/output), rpath (read only files), wpath (write files), cpath (lumikha ng mga file), tmppath (work with temporary files), inet (sockets network), unix (unix sockets). ), dns (DNS resolution), getpw (read access sa user database), ioctl (ioctl call), proc (process control), exec (startup process), at id (permission control).

Ang mga patakaran para sa pagtatrabaho sa mga system call ay tinukoy sa anyo ng mga anotasyon na kinabibilangan ng isang listahan ng mga pinapayagang klase ng system call at isang array ng mga path ng file kung saan pinahihintulutan ang pag-access. Pagkatapos i-compile at patakbuhin ang binagong aplikasyon, ang kernel ang namamahala sa gawain ng pagsubaybay sa pagsunod sa mga tinukoy na patakaran.

Hiwalay, ang pagpapatupad ng pledge para sa FreeBSD ay binuo, na nakikilala sa pamamagitan ng kakayahang ihiwalay ang mga application nang hindi gumagawa ng mga pagbabago sa kanilang code, habang sa OpenBSD ang pledge call ay naglalayong mahigpit na pagsasama sa base na kapaligiran at ang pagdaragdag ng mga anotasyon sa code ng bawat isa.

Ang pledge ay parang ipinagbabawal na prutas na pinagnanasaan nating lahat kapag sinabi ng amo na dapat nating gamitin ang mga bagay tulad ng Linux. Bakit mahalaga iyon? Ito ay dahil ang pledge() ay talagang ginagawang nauunawaan ang seguridad. Ang Linux ay hindi pa talaga nagkaroon ng layer ng seguridad na naiintindihan ng mga mortal.

Sinundan ng mga developer ng Linux pledge port ang halimbawa ng FreeBSD at, sa halip na gumawa ng mga pagbabago sa code, naghanda sila ng karagdagang utility mula sa pledge.com na nagbibigay-daan sa iyong maglapat ng mga paghihigpit nang hindi binabago ang iyong application code. Halimbawa, para patakbuhin ang curl utility na may access lamang sa mga system call class na stdio, rpath, inet, at threadstdio, patakbuhin lamang ang `./pledge.com -p 'stdio rpath inet thread' curl http://example.com`.

Gumagana ang utility sa lahat ng distribusyon ng Linux mula RHEL6 pataas at hindi nangangailangan ng root access. Bukod pa rito, batay sa cosmopolitan library, mayroong API na ibinibigay para sa pamamahala ng mga paghihigpit sa C program code, na nagpapahintulot, bukod sa iba pang mga bagay, sa paglikha ng mga enclave upang piliing paghigpitan ang access sa mga partikular na function ng application.

Mayroong ilang mga developer sa nakaraan na sinubukan ito. Hindi ko na banggitin ang mga pangalan, dahil karamihan sa mga proyektong ito ay hindi nakumpleto. Pagdating sa SECOMP, ipinapaliwanag lang ng mga online na tutorial kung paano i-whitelist ang mga tawag sa system, kaya nawawalan ng interes ang karamihan sa mga tao bago malaman kung paano mag-filter ng mga argumento. Ang mga proyektong sumulong ay mayroon ding mga oversight tulad ng pagpayag na baguhin ang setuid/setgid/sticky bits. Samakatuwid, wala sa mga kasalukuyang alternatibo ang dapat gamitin. Sa tingin ko ang pagsisikap na ito ay naglalapit sa atin sa pagkakaroon ng pledge() kaysa dati.

Ang pagpapatupad ay hindi nangangailangan ng mga pagbabago sa kernel: ang mga hadlang sa utility ay isinasalin sa mga panuntunan ng SECCOMP BPF at pinoproseso gamit ang native system call isolation mechanism ng Linux. Halimbawa, ang pagtawag sa promise("stdio rpath", 0) ay magko-convert sa isang BPF filter

Panghuli, kung interesado kang matuto nang higit pa, makikita mo ang mga detalye sa sumusunod na link.


Idagdag bilang ginustong mapagkukunan sa Google