Критический баг в npm 5.7.0 «ломает» файловую систему Linux

Вышедшее 22 февраля обновление менеджера пакетов npm 5.7.0 произвольно изменяет права доступа в файловой системе Linux. Разработчикам приходится исправлять последствия вручную, выставляя доступы для критически важных файлов и папок. Пользователи думают, что проблема кроется в коммите 94227e1, передающем и исполняющем chown в некорректных директориях.

Проявления

Последствия бага можно увидеть при выполнении команд sudo npm от имени не корневого пользователя. Например, если вызвать sudo npm --help или sudo npm update -g, обе команды изменяют владельца /etc, /usr, /boot и других папок, необходимых для функционирования операционной системы. Им становится пользователь, запустивший npm.

Запуск npm update -g с правами root ничего не изменяет в системе:

drwxr-xr-x 10 root root 129 Feb 22 03:39 /usr

А вот результат этой же команды от имени не корневого пользователя (su jared):

drwxr-xr-x 10 jared jared 129 Feb 22 03:39 /usr

Владелец директории /usr был изменён с root:root на jared:jared. То же самое происходит и со случайным набором других папок.

При простом запуске npm не от имени суперпользователя менеджер пытается поменять владельца папки /boot, а затем «ломается»:

Error: EPERM: operation not permitted, scandir '/boot/initramfs-linux-fallback.img'
TypeError: Cannot read property 'get' of undefined
...

Error: EACCES: operation not permitted, chown '/boot/initramfs-linux-fallback.img'
TypeError: Cannot read property 'get' of undefined
...

В чём проблема?

Источником проблемы стал переход версии 5.7.0 на новую реализацию mkdir, сохраняющую исходные права доступа и владельца при запуске с правами root с использованием sudo. Буквально через несколько часов после обнаружения критической неисправности разработчики выпустили экстренное обновление npm 5.7.1.

Массовых проблем удалось избежать благодаря тому, что в репозитории выпуски npm 5.7.x были помечены как экспериментальные и не доставлялись через каналы обновления стабильных релизов. При этом на сайте анонс был опубликован в форме, не отличающейся от объявлений стабильных релизов, что ввело в заблуждение некоторых пользователей, которые попытались перевести на NPM 5.7 свои рабочие системы. Также интересно, что сообщение об ошибке с описанием проблемы было отправлено за неделю до релиза 5.7.0, но осталось без внимания разработчиков.

Как всё исправить?

Как сообщает OpenNET, в случае отсутствия резервной копии для восстановления всех изначальных прав доступа может потребоваться переустановка системы или восстановление прав на уровне пакетного менеджера с ручной корректировкой каталогов пользователей. Например, можно выполнить:

RPM:
   for p in $(rpm -qa); do rpm --setperms $p; do rpm --setugids $p; done

DEB:
   dpkg --get-selections | grep install | grep -v deinstall | cut -f1 | xargs apt-get --reinstall -y --force-yes install

FreeBSD:
   mtree -U -f /etc/mtree/BSD.root.dist
   mtree -U -f /etc/mtree/BSD.var.dist
   mtree -U -f /etc/mtree/BSD.include.dist
   mtree -U -f /etc/mtree/BSD.sendmail.dist
   mtree -U -f /etc/mtree/BSD.usr.dist

Источник: Reddit

Подобрали три теста для вас:
— А здесь можно применить блокчейн?
Серверы для котиков: выберите лучшее решение для проекта и проверьте себя.
Сложный тест по C# — проверьте свои знания.

Также рекомендуем: