Для збавення Glibc ад праблемы 2038 прапанавана спыніць выкарыстанне utmp

Торстэн Кукук (Thorsten Kukuk), лідэр групы па развіцці тэхналогій будучыні ў кампаніі SUSE (Future Technology Team, развівае openSUSE MicroOS і SLE Micro), раней 10 гадоў які кіраваў праектам SUSE LINUX Enterprise Server, прапанаваў пазбавіцца ад файла /var/run/utmp у дыстрыбутывах для поўнага вырашэння праблемы 2038 года ў Glibc. Усе прыкладанні, якія выкарыстоўваюць utmp, wtmp і lastlog, прапануецца перавесці на атрыманне спісу карыстальнікаў пры дапамозе systemd-logind.

19 студзеня 2038 года адбудзецца перапаўненне лічыльнікаў эпахальнага часу, зададзеных 32-разрадным тыпам time_t. У бібліятэцы Glibc, нягледзячы на ​​ўкараненне 64-разраднага тыпу time_t, для захавання сумяшчальнасці з 32-разраднымі прыкладаннямі прасторы карыстача ў некаторых выпадках на 64-разрадных платформах працягвае ўжывацца 32-разрадны тып time_t. Адным з такіх выпадкаў з'яўляецца файл /var/run/utmp, які захоўвае дадзеныя аб карыстачах, у дадзены момант якія працуюць у сістэме. Поле з часам у utmp задаецца з выкарыстаннем 32-разраднага значэння time_t.

Проста замяніць поле з часам у utmp з 32-разраднага на 64-разрадны тып не атрымаецца, бо гэта прывядзе да змены ABI Glibc (зменіцца тып у функцыях, падобных login(), getutid() і utmpname()) і парушэнню сумяшчальнасці з прыкладаннямі, якія выкарыстоўваюць utmp, у ліку якіх w, who, uptime, login, su, sudo, useradd, systemd, sysvinit, tcsh, xterm дысплейныя менеджэры, emacs, openssh, qemu, samba, rsyslog і да т.п. З-за багацці магчымых падводных камянёў і працаёмкасці ідэя замены ў utmp разраднасці тыпу time_t была адхіленая распрацоўшчыкамі Glibc. Па той жа прычыне быў адкінуты варыянт з выкарыстаннем наяўнай у структуры utmp вольнай прасторы для дадання дадатковага 64-разраднага поля для часу.

Акрамя таго, змена разраднасці тыпу ў utmp не вырашае іншыя наяўныя праблемы, ад якіх таксама жадалася бы пазбавіцца. Напрыклад, для запісу ў utmp патрабуюцца спецыяльныя правы, што патрабуе прадастаўлення працэсам дадатковых прывілеяў. Яшчэ адна праблема злучана з тым, што архітэктура utmp дапушчае здзяйсненне лакальнымі карыстачамі DoS-нападаў, якія прыводзяць да парушэння працы сэрвісу utmp праз маніпуляцыі з блакіроўкамі на файл, з-за чаго нельга быць упэўненым, што змесціва utmp адлюстроўвае рэальны стан у сістэме. Для апрацоўкі доступу да utmp прапаноўвалася выкарыстоўваць дадатковы фонавы працэс, але для падобных задач ужо існуе працэс systemd-logind і запуск яшчэ аднаго спецыялізаванага працэсу не з'яўляецца мэтазгодным (прыкладанням давядзецца перадаваць дадзеныя адначасова ў два апрацоўшчыка).

Пры гэтым нават пры рашэнні праблемы з DoS-нападамі змесціва utmp застаецца толькі інфармацыйным, не якія гарантуюць адлюстраванне рэальнай рэчаіснасці. Напрыклад, розныя эмулятары і мультыплексары тэрміналаў па-рознаму адлюстроўваюць свой стан - запуск пяці тэрміналаў GNOME прывядзе да адлюстравання ў utmp аднаго карыстача, а запуск пяці тэрміналаў konsole або xterm у KDE - шасці. Аналагічна адрозніваюцца паводзіны screen і tmux, у першым выпадку кожны сеанс улічваецца як асобны карыстач, а ў другім адлюстроўваецца толькі адзін карыстач на ўсе сеансы.

У выніку ў якасці найболей простага рашэння прапануецца перавесці ўсе прыкладанні на выкарыстанне ўжо існага альтэрнатыўнага сэрвісу systemd-logind і пасля таго як не застанецца актуальных праграм, якія звяртаюцца да utmp, спыніць запіс у utmp. Для замены wtmp прапануецца падрыхтаваць праграмныя інтэрфейсы для запісу і чытанні інфармацыі аб карыстачах пры дапамозе systemd-journald. У кодавую базу наступнага выпуску systemd 254 ужо ўключаны неабходныя функцыі для падавання якія замяняюць utmp дадзеных праз libsystemd з выкарыстаннем API sd-login.h або праз DBUS.

Крыніца: opennet.ru

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