Wiki
Clone wikicomp-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