Lai atbrīvotu Glibc no 2038 problēmas, tiek ierosināts pārtraukt utmp izmantošanu

Torstens Kukuks, SUSE nākotnes tehnoloģiju izstrādes grupas vadītājs (Future Technology Team, izstrādā openSUSE MicroOS un SLE Micro), kurš iepriekš 10 gadus vadīja SUSE LINUX Enterprise Server projektu, ieteica atbrīvoties no /var/run/utmp faila. izplatījumos, lai pilnībā risinātu 2038. gada problēmu Glibc. Visas lietojumprogrammas, kas izmanto utmp, wtmp un lastlog, ir ierosināts pārveidot, lai iegūtu lietotāju sarakstu, izmantojot systemd-logind.

19. gada 2038. janvārī tiks pārpildīti epohālo laika skaitītāji, kas noteikti 32 bitu tipa time_t. Glibc, neskatoties uz 64 bitu tipa time_t ieviešanu, dažos gadījumos turpina izmantot 32 bitu time_t tipu 64 bitu platformās, lai saglabātu saderību ar 32 bitu lietotāja telpas lietojumprogrammām. Viens no šādiem gadījumiem ir /var/run/utmp fails, kurā tiek glabāti dati par lietotājiem, kuri pašlaik ir pieteikušies sistēmā. Laika lauks utmp ir norādīts, izmantojot 32 bitu vērtību time_t.

Vienkārša laika lauka aizstāšana utmp formātā no 32 bitu uz 64 bitu tipu nedarbosies, jo tas izraisīs izmaiņas Glibc ABI (tips mainīsies tādās funkcijās kā login(), getutid() un utmpname ()) un saderības pārkāpšana ar lietojumprogrammām, kas izmanto utmp, tostarp w, who, uptime, login, su, sudo, useradd, systemd, sysvinit, tcsh, xterm displeja pārvaldnieki, emacs, openssh, qemu, samba, rsyslog utt. Iespējamo kļūmju pārpilnības un sarežģītības dēļ Glibc izstrādātāji noraidīja ideju par time_t tipa aizstāšanu utmp. Tā paša iemesla dēļ tika atmesta iespēja izmantot pieejamo brīvo vietu utmp struktūrā, lai pievienotu papildu 64 bitu laika lauku.

Turklāt tipa bitu dziļuma maiņa utmp neatrisina citas esošās problēmas, no kurām es arī vēlētos atbrīvoties. Piemēram, rakstīšanai uz utmp ir nepieciešamas īpašas tiesības, kas prasa, lai procesiem tiktu piešķirtas papildu privilēģijas. Vēl viena problēma ir tā, ka utmp arhitektūra ļauj vietējiem lietotājiem veikt DoS uzbrukumus, izraisot utmp pakalpojuma darbības traucējumus, manipulējot ar failu bloķēšanu, kā rezultātā nav iespējams pārliecināties, vai utmp saturs atspoguļo reālo stāvokli sistēmā. Tika ierosināts izmantot papildu fona procesu, lai apstrādātu piekļuvi utmp, taču šādiem uzdevumiem jau pastāv systemd-logind process, un nav ieteicams palaist citu specializētu procesu (lietojumprogrammām būs jāpārsūta dati uz diviem apstrādātājiem vienlaikus).

Tajā pašā laikā, pat risinot problēmu ar DoS uzbrukumiem, utmp saturs paliek tikai informatīvs un negarantē realitātes atspoguļojumu. Piemēram, dažādi emulatori un termināļa multipleksori atspoguļo savu stāvokli atšķirīgi — palaižot piecus GNOME termināļus, viens lietotājs tiks atspoguļots utmp, un, palaižot piecus konsoles vai xterm termināļus KDE, tiks parādīti seši. Ekrāna un tmux darbība ir līdzīga: pirmajā gadījumā katra sesija tiek skaitīta kā atsevišķs lietotājs, bet otrajā gadījumā visās sesijās tiek atspoguļots tikai viens lietotājs.

Rezultātā kā vienkāršākais risinājums tiek piedāvāts pārsūtīt visas lietojumprogrammas, lai izmantotu jau esošo alternatīvo systemd-logind pakalpojumu, un pēc tam, kad nav nevienas pašreizējās programmas, kas piekļūst utmp, pārtraukt ierakstīšanu uz utmp. Lai aizstātu wtmp, tiek piedāvāts sagatavot programmatūras saskarnes informācijas rakstīšanai un lasīšanai par lietotājiem, izmantojot systemd-journald. Koda bāzē nākamajam systemd 254 laidienam jau ir iekļauta nepieciešamā funkcionalitāte, lai nodrošinātu utmp aizstāšanas datus, izmantojot libsystemd, izmantojot sd-login.h API vai DBUS.

Avots: opennet.ru

Pievieno komentāru