Праект па партаванні механізму ізаляцыі pledge для Linux

Аўтар стандартнай Сі-бібліятэкі Cosmopolitan і платформы Redbean абвясціў аб рэалізацыі механізма ізаляцыі pledge() для Linux. Першапачаткова pledge распрацаваны праектам OpenBSD і дазваляе выбарачна забараніць прыкладанням звароту да невыкарыстоўваных сістэмных выклікаў (для прыкладання фармуецца падабенства белага спісу сістэмных выклікаў, а астатнія выклікі забараняюцца). У адрозненне ад даступных у Linux механізмаў абмежавання доступу да сістэмных выклікаў, такіх як seccomp, механізм pledge першапачаткова распрацаваны з аглядкай на максімальнае спрашчэнне прымянення.

Якая завяршылася няўдачай ініцыятыва ізаляцыі прыкладанняў базавага асяроддзя OpenBSD з выкарыстаннем механізму systrace паказала, што ізаляцыя на ўзроўні асобных сістэмных выклікаў занадта складаная і працаёмкая. У якасці альтэрнатывы быў прапанаваны pledge, які дазваляў ствараць правілы ізаляцыі не ўнікаючы ў дэталі і маніпулюючы гатовымі класамі доступу. Напрыклад, прапануюцца класы stdio (увод/вывад), rpath (толькі чытанне файлаў), wpath (запіс файлаў), cpath (стварэнне файлаў), tmppath (праца з часавымі файламі), inet (сеткавыя сокеты), unix (unix-сокеты) , dns (рэзалвінг у DNS), getpw (доступ на чытанне да базы карыстальнікаў), ioctl (выклік ioctl), proc (кіраванне працэсамі), exec (запуск працэсаў) і id (кіраванне правамі доступу).

Правілы працы з сістэмнымі выклікамі задаюцца ў форме анатацый, якія ўключаюць спіс дазволеных класаў сістэмных выклікаў і масіў файлавых шляхоў, куды дазволены доступ. Пасля зборкі і запуску мадыфікаванага прыкладання, ядро ​​бярэ на сябе працу па кантролі захавання зададзеных правіл.

Асобна развіваецца рэалізацыя pledge для FreeBSD, якая адрозніваецца магчымасцю ізаляцыі прыкладанняў без занясення змен у іх код, у той час як у OpenBSD выклік pledge накіраваны на цесную інтэграцыю з базавым асяроддзем і даданне анатацый у код кожнага прыкладання.

Распрацоўнікі порта pledge для Linux скарысталіся прыкладам FreeBSD і замест занясення змен у код падрыхтавалі ўтыліту-надбудову pledge.com, якая дазваляе ўжыць абмежаванні без змены кода прыкладання. Напрыклад, для запуску ўтыліты curl з адкрыццям доступу толькі да класаў сістэмных выклікаў stdio, rpath, inet і threadstdio дастаткова выканаць "./pledge.com -p'

Утыліта pledge працуе ва ўсіх дыстрыбутывах Linux, пачынальна з RHEL6, і не патрабуе root-доступу. Дадаткова на базе бібліятэкі cosmopolitan падаецца API для кіравання абмежаваннямі ў кодзе праграм на мове Сі, які дазваляе ў тым ліку ствараць анклавы для выбарачнага абмежавання доступу ў прывязцы да вызначаных функцый прыкладання.

Рэалізацыя не патрабуе занясення змен у ядро ​​- абмежаванні pledge транслююцца ў правілы SECCOMP BPF і апрацоўваюцца пры дапамозе роднага для Linux механізму ізаляцыі сістэмных выклікаў. Напрыклад, выклік pledge(«stdio rpath», 0) будзе ператвораны ў BPF-фільтр static const struct sock_filter kFilter[] = { /* L0*/ * L0 * / BPF_STMT (BPF_LD | BPF_W | BPF_ABS, OFF (args [14])), / * L1 * / BPF_JUMP (BPF_JMP | BPF_JEQ | BPF_K, 1, 0 - 2, 2), / * L4 * / BPF_JUMP ( BPF_JMP | BPF_JEQ | BPF_K, 3, 0, 3 - 10), / * L0 * / BPF_STMT (BPF_LD | BPF_W | BPF_ABS, OFF (args [13])), / * L4 * / BPF_STMT (BPF_ALU | BPF_AND | BPF ~4x1), / * L5 * / BPF_JUMP (BPF_JMP | BPF_JEQ | BPF_K, 0, 80800 - 6, 1), / * L8 * / BPF_JUMP (BPF_JMP | BPF_JEQ | BPF_K, 7, 0, 7 - 2), / L0*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[13])), /* L8*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 8, 2 - 9, 0), /*L12*/ BPF_JUMP( | BPF_JEQ | BPF_K, 10, 0 - 10, 6), / * L12 * / BPF_JUMP (BPF_JMP | BPF_JEQ | BPF_K, 11, 0, 11 - 17), / * L0 * / BPF_STMT (BPF_RET | BPF_K /*L13*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)), /*L11*/ /* next filter */ };

Крыніца: opennet.ru

Дадаць каментар