SĂŒsteemihalduri systemd arendajate seas arutatakse kĂŒsimust, kuidas vĂ€hendada libsystemd raamatukogu sĂ”ltuvusi, mis on seotud mitte ainult systemd komponentidega, vaid ka paljude vĂ€liste rakendustega. NĂ€iteks Fedora's kasutavad rohkem kui 150 paketti libsystemd sĂ”ltuvusi. Arutelu algataja arvab, et lisanduvate kolmandate osapoolte raamatukogude, mida systemd arendajad ei kontrolli, toomine libsystemd-sse suurendab oluliselt rĂŒnnakupinda kolmandate osapoolte raamatukogude kompromiteerimise korral, nagu juhtus liblzma raamatukoguga.
Lisaks liblzmale ja glibc-le laaditakse libsystemd ka libzstd, liblz4 ja libgcrypt raamatukogud, mille turvalisuse tagamine on kriitilise tĂ€htsusega. Libsystemd-s antakse juurdepÀÀs 12 pĂ”hiteenusele (sd-bus, sd-daemon, sd-device, sd-event, sd-hwdb, sd-id128, sd-journal, sd-login, sd-netlink, sd-network, sd-path ja sd-resolve) ning olukord, kus rakendus, mis nĂ€iteks kasutab libsystemd-d ainult sd_notify funktsiooni kutsumiseks, et informeerida systemd-d oleku muutusest vĂ”i sd_journal-i logisse andmete salvestamiseks, seondub kĂ”igi teiste raamatukogude ja API töötlejatega. Ăks lahendus on jagada libsystemd mitmeks eraldi raamatukoguks, mis vastutavad eraldi API-de eest, mis vĂ”imaldab tuua kolmandate osapoolte sĂ”ltuvusi ainult seal, kus neid on vaja.
Systemd arendajad ei pea jagamist otstarbekaks, kuna libsystemd-s olevad töötlejad on omavahel seotud. Jagamine nĂ”uab tohutut tööd ja toob kas efektiivsuse kaotuse vĂ”i koodi dubleerimise vajaduse. Libsystemd-s mĂ€luhulga vĂ€hendamiseks vĂ”eti hiljuti kasutusele muudatus, et implementatsioonis laaditaks liblzma, libzstd ja liblz4 raamatukogusid dĂŒnaamiliselt lĂ€bi dlopen() kutsumise, juhul kui nende funktsioonid on tĂ”eliselt vajalikud. Sarnane muudatus rakendatakse jĂ€rgmisel vĂ€ljaandel ka libgcrypt jaoks.
Selline lahendus on saanud kriitikaks, kuna selge ja mÀrgatav seondumine on asendatud vÀhem nÀhtava kolmandate osapoolte raamatukogude laadimisega, mis raskendab diagnostikat, kuna libsystemd API-kutsumise ja vÀlistest raamatukogudest funktsioonide kutsumise vaheline seos ei ole enam ilmne. Dlopen() kasutusele vÔtmine enda iseloomu ei muuda, vaid varjab lihtsalt vÀliseid komponente hooldajatelt ja kasutajatelt.
Lenart Pottering vĂ€ljendas kindlat vastuolu ideele jagada libsystemd mitmeks teegiks, kuna see samm muudaks koodi ĂŒhiskasutamise oluliselt keerulisemaks ja nĂ”uaks kĂ”ikide sisemiste töötlejate viimist avalikku staatusele vĂ”i nende eraldi staatiliselt iga teegi sisse kompileerimist. Esimesel juhul tekivad probleemid API stabiilsuse ja nimede ruumidega, teisel juhul suurendab see suurust koodi dubleerimise tĂ”ttu.
JĂ€rgmiseks vĂ€ljaandeks rakendatud vĂ€limiste teekide laadimine ainult vajaduse korral vaadatakse Lenarti poolt optimistlikult. Probleemi, millega kaasneb andmete saamise keerukus dĂŒnaamiliselt laaditud teekide osas, pakutakse lahendada, lisades ELF-failidesse tĂ€iendavaid vĂ€lju teabe kohta sarnaste dĂŒnaamiliste sĂ”ltuvuste kohta, mida suudavad töödelda silurid ning mis kuvatakse utiliidi readelf vĂ€ljundis.
Mis puudutab suurt hulka rakendusi, mis on seotud libsystemd-iga, siis soovitas Lenart rakenduste arendajatel mitte pĂŒĂŒda laadida libsystemd-d ainult ĂŒhe funktsiooni pĂ€rast, vaid rakendada protokolli töötlejat rakenduse tasemel. NĂ€iteks sd_notify() funktsionaalsuse rakendamine on piisavalt triviaalne ja vĂ”ib mahtuda mĂ”nesse koodireatesse, kasutades UNIX-sokette (AF_UNIX). Selline eraldi rakendus sd_notify on saadaval OpenSSH jaoks alates 2017. aastast ning hiljuti on see aktsepteeritud ĂŒlekantava haru OpenSSH 9.8 koosseisu, mille vĂ€ljaandmine on planeeritud suve keskpaiku.
Allikas: opennet.ru
