Wiki

Clone wiki

comp-house.repo / abuse-rpm-scripts

Иногда приходится ставить в систему rpm от производителей коммерческого проприетарного софта.

С некоторых пор уже взял за правило смотреть, что там делается в скриптах установки и каждый раз неприятные сюрпризы. Здесь некоторые из них.

Driftsight

1) Скрипты зашифрованы.

Вот как выглядит скрипт, автоматически запускаемый после установки в пакете:

 cat POSTIN 
#!/bin/sh
set -e
mkdir /tmp/alien.$$
perl -pe '$_=unpack("u",$_)' << '__EOF__' > /tmp/alien.$$/script
M(R$O8FEN+V)A<V@*"G=H:6QE(')E860@;&EN93L@9&\*("!54T52240]8&5C
...................
Здесь много таких же упакованных строк
...................
M:&\@(B1L:6YE(B!\(&%W:R`M1B(Z(B`G>R!P<FEN="`D,R!])V`*("!54T52
__EOF__
#chmod 755 /tmp/alien.$$/script
/tmp/alien.$$/script "$@"
rm -f /tmp/alien.$$/script
rmdir /tmp/alien.$$

Нетрудно заметить, что скрипт временно распаковывается, выполняется и удаляется, что само по себе нехорошо, ибо непрозрачно.

В распакованном виде скрипт выглядит еще подозрительнее:

cat script 
#!/bin/bash

while read line; do
  USERID=`echo "$line" | awk -F":" '{ print $3 }'`
  USERNAME=`echo "$line" | awk -F":" '{ print $1 }'`
  if [ "$USERID" -ge 500 ]; then
    USERHOME=`su "$USERNAME" -c "env | grep ^\"HOME=\""`
    if [ ! -z "$USERHOME" ]; then
      USERHOME=`echo "$USERHOME" | awk -F"=" '{ print $2 }'`
      if [ -d "$USERHOME" ]; then
        LIST_USERNAME=( "${LIST_USERNAME[@]}" "$USERNAME");
      fi
    fi
  fi
done < /etc/passwd

Дальше в этом скрипте для сформированного списка пользователей осуществляется регистрация mime-типов файлов.

Довольно ненадежный и некорректный способ получить список пользователей в компьютере.

Во первых, uid пользователей в совремнных дистрах начинаются с 1000, а не с 500.

Во вторых, переходить под пользователя и парсить его переменные окружения в надежде найти HOME тем более глупо. Ведь тоже самое написано в самом /etc/passwd (раз уж вы залезли в него своими ручонками)!

Что мешало сделать этот код более простым и безбажным, непонятно. Все необходимое ведь уже есть в самом скрипте:

while read line; do
  USERID=`echo "$line" | awk -F":" '{ print $3 }'`
  USERNAME=`echo "$line" | awk -F":" '{ print $1 }'`
  if [ "$USERID" -ge 999 ]; then
    USERHOME=`echo $line | awk -F":" '{ print $6 }'`
      if [ -d "$USERHOME" ]; then
        LIST_USERNAME=( "${LIST_USERNAME[@]}" "$USERNAME");
      fi
  fi
done < /etc/passwd

В третьих, какой смысл парсить пользователей при инсталляции, если можно все это делать при первом запуске пользователем или командой из меню? А так, получается, что все пользователи, которых добавили позже, пролетают мимо этого скрипта.

В четвертых, зачем вообще дергать установки пользователей при установке программы? Откуда такое желание лазить по чужим хомякам, в чужие конфиги? В конце концов домашние каталоги могут быть зашифрованы и вообще недоступны администратору!

Updated