Вышедшее 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