Торстен Кукук (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.

// cc-by opennet.ru
// converted with crypt’s opennet autoreposter <<<

  • cryptOP
    link
    fedilink
    arrow-up
    0
    ·
    3 years ago

    было приятно узнать, что FreeBSD лишена проблемы by design.

    FreeBSD and macOS both support utmpx only, not traditional utmp. But they do support 64-bit timestamps at least on 64-bit architectures, because the ut_tv field of struct utmpx is a struct timeval, which on these systems uses 64-bit or 32-bit timestamps depending on the architecture. FreeBSD has a semi-traditional implementation of getutxent that reads a file, but the on-disk format is a separate struct that their libc manually converts to struct utmpx, so it doesn't matter that struct utmpx is different between 32-bit and 64-bit programs. (This is in contrast to glibc where struct utmp, struct utmpx, and the on-disk format are all identical.)
    
  • Александр
    link
    fedilink
    arrow-up
    0
    ·
    3 years ago

    Торстен Кукук

    Ещё более гомосексуальный апгрейд Тима Кука?

    • cryptOP
      link
      fedilink
      arrow-up
      0
      ·
      3 years ago

      с малазийского это переводится кукух (муж кукушки то есть). но сложно сказать.

  • cocucka
    link
    fedilink
    arrow-up
    0
    ·
    3 years ago

    Линукс-программисты — петухи

  • X512
    link
    fedilink
    arrow-up
    0
    ·
    3 years ago

    Лезть программам в файлы напрямую без энкапсуляции (например библиотекой со стандартным API) было изначально плохой идеей. В этом плане Windows разумнее устроен.

    • cryptOP
      link
      fedilink
      arrow-up
      0
      ·
      3 years ago

      а разве glibc сама по себе не является вот этим самым API, который отделяет прикладные программы от файла?

      • X512
        link
        fedilink
        arrow-up
        0
        ·
        3 years ago

        glibc умеет читать /var/run/utmp? Тогда в чём проблема и почему предлагают новый API через libsystemd?

      • X512
        link
        fedilink
        arrow-up
        0
        ·
        3 years ago

        При записи несколькими программами в один и тот же файл всё может сломаться. Или по крайней мере не забисаться один из результатов.

      • cryptOP
        link
        fedilink
        arrow-up
        0
        ·
        3 years ago

        Файлы в юниксах и есть API

        тут надо признать, что под этим имеются ввиду файлы, которые можно читать при помощи вызовов glibc. а если это какой-то кастомный utmp-бинарный формат, то это не особо и UNIX-way. это как бинарные журналы systemd.

        p.s.

        а аватарка твоя отстой. пришлось тебя пока заигнорить, чтобы не портила вид. так вот рендомно включил ответы в топике, почитал, ответил.

        • X512
          link
          fedilink
          arrow-up
          0
          ·
          3 years ago

          а аватарка твоя отстой. пришлось тебя пока заигнорить, чтобы не портила вид.

          Аватарок бояться – в интернет не ходить.

          • cryptOP
            link
            fedilink
            arrow-up
            0
            ·
            3 years ago

            а я особо и не хожу

          • cryptOP
            link
            fedilink
            arrow-up
            0
            ·
            3 years ago

            а напомни мне, как там в виндовс обстоит дело с комбинированными бинарниками 32/64 бита? емнип, у них же было какое-то решение?

            что-то я не могу разобраться, как фотошоп комбинирует сразу 32 и 64 версию.

            • X512
              link
              fedilink
              arrow-up
              0
              ·
              3 years ago

              а напомни мне, как там в виндовс обстоит дело с комбинированными бинарниками 32/64 бита?

              Никак. Windows так не умеет. Умеет только комбинировать 16 битные DOS бинарники, которые обычно пишут “This program can’t be run in DOS mode.” и выходят.

        • TheAnonymous
          link
          fedilink
          arrow-up
          0
          ·
          3 years ago

          «а аватарка твоя отстой. пришлось тебя пока заигнорить, чтобы не портила вид» Какие мы нежные! Зы: у тебя адблока нет что ли?

          • cryptOP
            link
            fedilink
            arrow-up
            0
            ·
            3 years ago

            после переезда в этот инстанс для клуба еще не поставил. думал, что не понадобится.

            • TheAnonymous
              link
              fedilink
              arrow-up
              0
              ·
              3 years ago

              А причем здесь клуб, ты настолько Ъ, на другие сайты в интернете не ходишь?

  • TheAnonymous
    link
    fedilink
    arrow-up
    0
    ·
    3 years ago

    «так как это приведёт к изменению ABI Glibc и нарушению совместимости с приложениями» И поэтому решили вообще выпилить эти файлы, так то совместимость сохранится