- +

Автор: denkin Тема: Скрипт Microsoft в deb-пакет с Open R принудительно заменяет /bin/sh на bash  (Прочитано 118 раз)

Оффлайн denkin

  • Global Moderator
  • Старожил
  • *****
  • Сообщений: 1559
  • Репутация: +74/-2
    • Просмотр профиля
Цитировать
Компания Microsoft опубликовала deb-пакет (microsoft-r-open-mro-3.5.0) с инструментарием Open R (вариант языка R от Microsoft) для Debian и Ubuntu, в установочном сценарии которого обнаружена серия недопустимых оплошностей. В частности, скрипт настройки, вызываемый после установки пакета (postinstall), удаляет /bin/sh, после чего создаёт символическую ссылку /bin/sh на /bin/bash. Если в системе нет /bin/bash то /bin/sh остаётся удалённым и пользователь получает неработающее окружение.
Новость на Opennet.

Spoiler: Подробности • показать

"Примечательно, что на идентичный код удаления /bin/sh в RPM-пакетах пользователи обращали внимание ещё в 2016 году. В то время проблема осталась нерешённой, а представитель Microsoft лишь пояснил, что /bin/sh заменяется, так как в Ubuntu в качестве shell по умолчанию применяется dash, а shell-обвязка над Microsoft R Server может работать только в bash. На этот раз критика не осталась без внимания и инженеры из Microsoft обновили deb- и rpm-пакеты, удалив в скрипте postinstall строки замены /bin/sh, вместо которых задействованы dpkg-divert для DEB и update-alternatives для RPM.


   #!/bin/bash
 
   #TODO: Avoid hard code VERSION number in all scripts
   VERSION=`echo $DPKG_MAINTSCRIPT_PACKAGE | sed 's/[[:alpha:]|(|[:space:]]//g' | sed 's/\-*//' | awk  -F. '{print $1 "." $2 "." $3}'`
   INSTALL_PREFIX="/opt/microsoft/ropen/${VERSION}"
 
   echo $VERSION
 
   ln -s "${INSTALL_PREFIX}/lib64/R/bin/R" /usr/bin/R
   ln -s "${INSTALL_PREFIX}/lib64/R/bin/Rscript" /usr/bin/Rscript
 
   rm /bin/sh
   ln -s /bin/bash /bin/sh

Кроме того, в скриптах есть и другие ошибки, например, в случае наличия уже установленного оригинального R, установочный скрипт завершается ошибкой, а в случае удаления пакета Microsoft удаляет и исполняемые файлы оригинального R (/usr/bin/R, /usr/bin/Rscript). Скрипт prerm:


   #!/bin/bash
 
   VERSION=`echo $DPKG_MAINTSCRIPT_PACKAGE | sed 's/[[:alpha:]|(|[:space:]]//g' | sed 's/\-*//' | awk  -F. '{print $1 "." $2 "." $3}'`
   INSTALL_PREFIX="/opt/microsoft/ropen/${VERSION}/"
 
   rm /usr/bin/R
   rm /usr/bin/Rscript
   rm -rf "${INSTALL_PREFIX}/lib64/R/backup" "
(ц)