Inicijativa za smanjenje ovisnosti u libsystemd

Među programerima sistemskog menadžera systemd vodi se rasprava o smanjenju zavisnosti biblioteke libsystemd, koja je povezana ne samo s komponentama systemd, već i s mnogim vanjskim aplikacijama. Na primjer, u Fedori više od 150 paketa koristi libsystemd u svojim zavisnostima. Inicijator rasprave smatra da uvođenje dodatnih vanjskih biblioteka u libsystemd, koje ne kontrolišu programeri systemd, značajno povećava površinu napada u slučaju kompromitacije vanjskih biblioteka, kao što se dogodilo s bibliotekom liblzma.

Pored liblzma i glibc, u libsystemd se takođe učitavaju biblioteke libzstd, liblz4 i libgcrypt, održavanje sigurnosti kojih postaje kritično važno. U libsystemd je omogućen pristup 12 osnovnih API-ja (sd-bus, sd-daemon, sd-device, sd-event, sd-hwdb, sd-id128, sd-journal, sd-login, sd-netlink, sd-network, sd-path i sd-resolve) i nastaje situacija u kojoj aplikacija, na primjer, koristi libsystemd samo radi poziva funkcije sd_notify za obaveštavanje systemd o promeni stanja ili sd_journal za zapis podataka u log, povezuje se sa svim ostalim bibliotekama i API obradnicima. Kao rešenje predlaže se podela libsystemd na nekoliko zasebnih biblioteka, odgovornih za posebne API-je, što će omogućiti učitavanje vanjskih zavisnosti samo tamo gde su potrebne.

Programeri systemd smatraju podelu neekonomičnom, jer su povezivači prisutni u libsystemd međusobno povezani. Podela bi zahtevala ogroman trud i dovela bi ili do gubitka efikasnosti ili do potrebe za dupliciranjem koda. Radi smanjenja zauzetog prostora u libsystemd, nedavno je donesena promena u implementaciji dinamičkog učitavanja biblioteka liblzma, libzstd i liblz4 uz pomoć poziva dlopen(), u situacijama kada su njihove funkcije zaista potrebne. Slična promena biće implementirana i za libgcrypt počevši od sledećeg izdanja.

Ovo rešenje je postalo predmet kritike, jer će umesto eksplicitnog i uočljivog povezivanja, učitavanje vanjskih biblioteka sada biti nejasno, što će otežati dijagnostiku, jer nije očigledna povezanost API poziva libsystemd s pozivima funkcija iz vanjskih biblioteka. Sam prelazak na učitavanje uz pomoć dlopen() ne menja arhitekturu, već samo skriva vanjske komponente od održavaoca i korisnika.

Lejnart Potering izrazio je snažno neslaganje s idejom razdvajanja libsystemd na više biblioteka, jer bi taj korak značajno otežao zajedničko korištenje koda unutar systemd i zahtijevao bi prevesti sve interne rukovaoce u javne ili ih zasebno statički skompajlirati u svaku biblioteku. U prvom slučaju došlo bi do problema s održavanjem stabilnosti API-ja i prostora imena, dok bi u drugom došlo do povećanja veličine zbog dupliciranja koda.

Implementacija učitavanja vanjskih biblioteka samo po potrebi za sljedeće izdanje smatra se optimalnom strategijom prema Lejnartu. Problem s otežanim pristupom podacima o dinamički učitavanim bibliotekama predlaže se riješiti dodavanjem dodatnih polja u ELF datoteke koja sadrže informacije o takvim dinamičkim zavisnostima, a koja se mogu obraditi od strane debagera i prikazati u izlazu alata readelf.

Što se tiče povezivanja velikog broja aplikacija s libsystemd, Lejnart je preporučio programerima aplikacija da ne pokušavaju učitati libsystemd zbog jedne funkcije, već da implementiraju rukovaoca protokola na razini aplikacije. Na primjer, implementacija funkcionalnosti sd_notify() je relativno trivijalna i može stati u nekoliko redaka koda koristeći UNIX sokete (AF_UNIX). Takva odvojena implementacija sd_notify dostupna je za OpenSSH od 2017. godine, a nedavno je prihvaćena u prenosivoj grani OpenSSH 9.8, čije je izdavanje planirano za sredinu ljeta.

Izvor: opennet.ru

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster