reklama

Agresywny instalator Microsoftu przyłapany na psuciu Debiana: słowa krytyki pomogły

Strona główna Aktualności

O autorze

Hodowca maszyn wirtualnych i psów, poza tym stary linuksiarz, bonvivant i śmieszek. W 2012 roku napisał na DP o algorytmie haszowania Keccak i wciąż pamięta, jak on działa.

Microsoft nigdy nie był znany z dobrej współpracy jego oprogramowania z innymi systemami. Nie tylko zresztą o współpracę chodzi – każdy, kto instalował Windowsa na dysku zawierającym inne systemy dobrze wie, że instalator Microsoftu nawet nie próbuje zachować stanu aktualnego, jego sekwencja rozruchu nie przewiduje żadnych innych systemów na dysku. Tym razem jednak firma z Redmond posunęła się jeszcze dalej. Jej instalator oprogramowania na Linuksa nie tylko popełniał błędy techniczne, ale też usuwał systemowy interpreter powłoki sh.

O czym myśleli programiści pisząc ten skrypt instalacyjny, tego chyba nikt nie zgadnie. Pierwszy konsekwencje ich pomysłów zauważył matematyk Norbert Preining, który postanowił na swojej maszynie z Debianem zainstalować Microsoft Open R 3.5, otwartą implementację języka R. R jest ogromnie popularnym narzędziem do obliczeń statystycznych i wizualizacji wyników, a oferowana przez Microsoft dystrybucja wyróżnia się większą wydajnością od wersji GNU i mechanizmami gwarantującymi lepszą powtarzalność wyników.

Ze stron Microsoftu pobrać można Open R w wersjach na Windowsa, Ubuntu, RHEL-a, SLES-a i macOS-a. W rzeczywistości wszystkie wersje linuksowe są takie same. Nie są to paczki DEB czy RPM, lecz prostu tarball (.tar.gz) ze skryptem instalacyjnym. I właśnie o ten skrypt instalacyjny jest cała afera.

#!/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

Po pierwsze, jak łatwo zauważyć w przedstawionych przez Preininga fragmentach kodu, skrypt instalatora zakończy pracę z błędem, jeśli w systemie zainstalowana jest już inna, standardowa wersja R – linkowanie symboliczne nie pozwala na nadpisywanie istniejących plików.

Po drugie, skrypt ordynarnie usuwa domyślny interpreter powłoki sh, a następnie (czyżby nagle ktoś sobie przypomniał, jak działa linkowanie?) zastępuje go linkiem do interpretera bash.

#!/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/Rscrip
t rm -rf "${INSTALL_PREFIX}/lib64/R/backup"

Po trzecie, skrypt przeznaczono do deinstalacji Open R ot tak kasuje sobie linki, nie sprawdzając gdzie one faktycznie wskazują.

Matematyk zasugerował, aby w Microsofcie poczytali sobie o mechanizmie dpkg-divert w Debianie, pozwalającym poprawnie instalować w systemie różne wersje plików, jak również o samym budowaniu pakietów. To co bowiem zaprezentowano w skrypcie jest zdaniem Preininga taką demonstracją niekompetencji, że można tylko założyć, że zostało zrobione celowo.

Zawstydzające słowa przyniosły skutek. W ciągu dwóch dni od upublicznienia sprawy, Microsoft wydał poprawione wersje, które zachowują się poprawnie. To wciąż tylko tarballe, ale zakładamy, że dla użytkowników Open R nie będzie to stanowiło problemu. Ważne jest to, że po zainstalowaniu interpretera tego języka nie kończą z popsutym systemem.

© dobreprogramy
reklama

Komentarze

reklama