Как проверить сценарий оболочки в & ldquo; безопасной среде & rdquo; избежать вреда моему компьютеру?

Еще одно исправление для пользовательских скриптов: определите соответствующие переменные среды внутри вашего скрипта.

Вы можете использовать фрагмент, подобный следующему, чтобы сделать это:

getXuser() {
        user=`pinky -fw | awk '{ if ($2 == ":'$displaynum'" || $(NF) == ":'$displaynum'" ) { print $1; exit; } }'`
        if [ x"$user" = x"" ]; then
                startx=`pgrep -n startx`
                if [ x"$startx" != x"" ]; then
                        user=`ps -o user --no-headers $startx`
                fi
        fi
        if [ x"$user" = x"" ]; then
               user=$(pinky -fw | awk '{ print $1; exit; }')
        fi
        if [ x"$user" != x"" ]; then
                userhome=`getent passwd $user | cut -d: -f6`
                export XAUTHORITY=$userhome/.Xauthority
        else
                export XAUTHORITY=""
        fi
        export XUSER=$user
}


for x in /tmp/.X11-unix/*; do
   displaynum=`echo $x | sed s#/tmp/.X11-unix/X##`
   getXuser;
      if [ x"$XAUTHORITY" != x"" ]; then
        export DISPLAY=":$displaynum"
      fi
done

(на основе функции ACPI getXuser)

Если файл .desktop все еще не найден не работает, вы можете попробовать обернуть ваш pkexec commandline во фрагмент sh, например:

Exec=sh -c "pkexec --user root script_that_needs_root.sh"

Последняя проблема - известная ошибка, по-видимому:

http: / /bugs.debian.org/cgi-bin/bugreport.cgi?bug=690339

https://bugzilla.xfce.org/show_bug.cgi?id=9373

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=650038

https: //bugzilla.gnome. орг / show_bug.cgi? ID = 686059

29
задан 07.05.2019, 00:36

7 ответов

Я не эксперт в этом, но я бы порекомендовал использовать strace и docker.

Итак, сначала создайте контейнер Docker, следуя инструкциям в этого ответа . Но дополнение в том, что strace скажет вам, какие системные вызовы сделаны. Или цитата:

strace - это диагностическая, отладочная и обучающая утилита для пользователя для Linux. Он используется для мониторинга и вмешательства во взаимодействие между процессами и ядром Linux, которое включает системные вызовы, доставку сигналов и изменения состояния процессов.

Вы можете объединить эти команды в

docker exec -it ubuntu_container strace bash ./42FileChecker.sh
4
ответ дан 25.10.2019, 12:06
  • 1
    Так что это будет проходить через каждую строку скрипта (шаг за шагом), а также делать все это внутри контейнера, что означает, что все команды не будут делать ничего для моей системы, но будут выполняться как обычно. Я правильно понимаю? – Jammy Lee 09.05.2019, 03:04
  • 2
    @nicholas да док-контейнер - это отдельная машина для вашей защиты, программа находится в песочнице. Strace предоставит вам все операции, которые приложение выполняет с этим компьютером, от открытия файлов до настройки сетевых подключений. – twobeers 09.05.2019, 10:52
  • 3
    Да, это именно то, что я искал, Стрейс в сочетании с Докером. – user2344996 09.05.2019, 23:01

Если вы не уверены в том, что делает скрипт, вам лучше не запускать его, пока вы не уверены, что он делает. Способы уменьшения радиуса повреждения плохого сценария включают запуск его с использованием нового пользователя, запуск его в контейнере или запуск на виртуальной машине. Но это первое утверждение остается в силе: если вы не уверены, что что-то делает, не запускайте его, пока не сделаете.

42
ответ дан 25.10.2019, 12:06
  • 1
    С другой стороны, сценарии похожи на EULA: да, вы должны прочитать и понять каждую строку, прежде чем продать свою душу, но не так ли? – Tshepang 08.05.2019, 17:03
  • 2
    @ PeterA.Schneider, но EULA ничего не делает, пока не предстанет перед судом. Запуск скрипта сразу влияет на ваш компьютер. Это не так много о чтении каждой строки; это больше о & quot; Размышления о доверии Доверие & quot; и зная и доверяя источнику сценария. – sverre 09.05.2019, 00:04

Как сказал @ctt, вероятно, хорошей идеей будет сначала запустить его в какой-нибудь песочнице. Использование ВМ, вероятно, самое простое решение. Multipass довольно прост.

Установить мультипасс (если вы еще этого не сделали):

sudo snap install multipass --beta --classic

Вращать новую виртуальную машину:

multipass launch --name myvm

Войти в свою новую виртуальную машину:

multipass shell myvm

Затем запустите ваш скрипт (внутри вашего виртуального компьютера):

multipass@myvm:~$ git clone https://github.com/jgigault/42FileChecker ~/42FileChecker && cd ~/42FileChecker && bash ./42FileChecker.sh
29
ответ дан 25.10.2019, 12:06
  • 1
    Этот подход небезопасен. После того, как вы запустите скрипт в песочнице, как вы узнаете, был ли он безопасным? Это может иметь вредные последствия, которые вы не можете легко сказать. Вредоносные программы не обязательно всплывают и говорят: «Хаха, понял!». Кроме того, вредоносный сценарий может легко вести себя безобидно, находясь в песочнице или виртуальной машине, а затем вести себя злонамеренно на вашем реальном компьютере. (Например, обнаружение виртуальной машины - это такая же вещь, как и машинная идентификация.) – Howard 07.05.2019, 18:27
  • 2
    Это отличный момент. Если вы хотите проверить скрипт на наличие вредоносных программ, это не является эффективным решением. Это способ тестирования функциональности без загрязнения вашей хост-системы. – sverre 07.05.2019, 19:21
  • 3
    Вы можете выполнить полное сравнение с помощью элемента «control» VM. – Howard 08.05.2019, 06:55
  • 4
    @mckenzm: Но если это вредоносное ПО, вполне возможно, что оно решит ничего не делать, пока не получит доступ к чему-то, что выглядит сочно. – Yann Vernier 08.05.2019, 20:03

Соответствующая информация для предоставления ответа, к сожалению, содержится только в вашем комментарии:

Я изучаю C на курсе Ecole 42. Функции, которые я выполняю, должны пройти через эту проверку норм. Мне нужно установить 42FileChecker в Ubuntu, чтобы запустить эту проверку норм.

Таким образом, ситуация такова, что на практике у вас есть возможность пропустить курс или вы можете запустить скрипт для выполнения нормативных проверок ваших источников. Разговор с вашим инструктором вряд ли возможен из-за отсутствия первого (в любом случае это не было бы возможным вариантом, ни одна школа не собирается менять свою процедуру, потому что один ученик не доволен этим).
[111 ] Поэтому вопрос, что делать, чтобы ограничить возможный ущерб от этого сценария, даже не возникает. Это не случайный сценарий, по которому возбужденная девушка с большой грудью отправила вам электронное письмо, и вам нужно запустить , чтобы увидеть ее фотографию .
Вы делаете класс программирования. Это , где этот сценарий вступил в игру. Вопрос в том, хотите ли вы выполнить условия, необходимые для успешного прохождения курса.

Однако, если вы действительно обеспокоены, все еще есть возможность запустить сценарий в контейнере или на виртуальной машине и поместить ваши источники в общую папку или в общую сетевую папку, доступную для контейнера / виртуальной машины. Это в значительной степени идет по пути полной паранойи, но опять же виртуализация не так уж и сложна в наши дни, поэтому она не стоит очень дорого.

Исключая маловероятную возможность действительно сурового эксплойта, содержащегося в этом скрипте, входя в систему под учетной записью любого пользователя без полномочий root (который у вас вряд ли есть, если вы не можете сделать иначе в Ubuntu) и избегая ввода [ 110] ни по какой очевидной причине в значительной степени предотвращает 99% всех плохих вещей, которые могли бы произойти в любом случае. Например, форматирование жесткого диска, о котором вы беспокоитесь. Обычный пользователь просто не может этого сделать. Худшее, что может случиться, - это сценарий, удаляющий домашний каталог пользователя. Так что, не проблема, правда.

2
ответ дан 25.10.2019, 12:06

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

Чтобы установить докер:

sudo apt-get install docker.io

Чтобы загрузить новый контейнер Ubuntu Bionic:

docker pull ubuntu:bionic

После этого войдите в контейнер

docker run -it ubuntu:bionic

и выполнить хитрую операцию в нем:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker && cd ~/42FileChecker && bash ./42FileChecker.sh
5
ответ дан 25.10.2019, 12:06
  • 1
    Еще одно преимущество Docker, которое может помочь определить, что делает скрипт, заключается в том, что вы можете запустить docker diff, чтобы посмотреть, какие изменения были внесены в файловую систему с момента запуска контейнера. Недостатком использования Docker является то, что контейнер не является полной копией хост-системы. Упоминаемый здесь образ Ubuntu содержит только минимальную установку Ubuntu. – Robert Rossney 08.05.2019, 10:44
  • 2
    Вместо docker run ubuntu вы должны запустить docker run -it ubuntu:bionic -it предоставляет вам интерактивный терминал в контейнере, а bionic фактически запускает нужную вам версию вместо стандартной latest. – lucid_dreamer 08.05.2019, 10:47
  • 3
    Мне нравится этот ответ лучший из тех, что я видел. Тем не менее, кажется, что хитрый сценарий может все еще злоупотреблять вашей системой. Это может быть тайный майнинг биткойнов и т. Д. В идеале можно использовать дополнительные флаги, возможно --memory, --network и, возможно, другие, чтобы действительно заблокировать скрипт. – DTing 08.05.2019, 18:51
  • 4
    Если вы действительно параноик, объедините этот ответ со вторым лучшим ответом. Запустите Docker внутри виртуальной машины и заблокируйте все. – Veles 08.05.2019, 18:52

Подумайте об использовании режима отладки, запустив скрипт следующим образом:

$ bash -x scriptname

Дополнительная полезная информация Bash

Режим отладки не остановит выполнение сценарием чего-либо плохо, но он позволит вам пройтись по сценарию построчно и изучить эффекты. Вы также можете проверить скрипт на наличие некоторых типичных ошибок и / или эксплойтов, например, поищите в сценариях любое вхождение rm и внимательно посмотрите на эти команды. Многие из этих инструментов имеют встроенную помощь для их тестирования, например, По умолчанию rm не удаляет каталог, для этого ему нужна опция -r, -R или --recursive.

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

3
ответ дан 25.10.2019, 12:06
  • 1
    -x может использоваться для отладки (и я использую его!), но он не позволит вам шаг за шагом проходить скрипт. Это даст вам своего рода «след» как он выполняет сценарий на полной скорости. – Jeffrey Roosendaal 10.05.2019, 01:43

Поскольку школа, которую вы посещаете, опубликовала сценарии, лучшее место, чтобы высказать ваши опасения - это ваши инструкторы.

При этом мы можем помочь вам расшифровать код построчно. Вероятно, для любого человека здесь нецелесообразно анализировать весь код.

У вас есть 40 bash-скриптов с общим количеством строк в 5 360. Я объединил их вместе и искал команды bash / shell, которыми можно злоупотреблять. Кажется, что все они используются нормально :

$ cat /tmp/sshellcheck.mrg | grep " rm "

      rm -rf "$RETURNPATH"/tmp/*
      rm -f "$RETURNPATH"/.mynorminette
    rm -f $LOGFILENAME
    rm -f $LOGFILENAME
      rm -f .mymoulitest
        rm -f "${RETURNPATH}/tmp/${FILEN}"

$ cat /tmp/sshellcheck.mrg | grep -i kill

  function check_kill_by_name
          kill $PROCESSID0
  declare -a CHK_MINISHELL_AUTHORIZED_FUNCS='(malloc free access open close read write opendir readdir closedir getcwd chdir stat lstat fstat fork execve wait waitpid wait3 wait4 signal kill exit main)'
        check_kill_by_name "${PROGNAME}"
      kill -0 "${CURRENT_CHILD_PROCESS_PID}" 2>/dev/null && kill "${CURRENT_CHILD_PROCESS_PID}" 2>/dev/null
      display_error "killed pid: ${CURRENT_CHILD_PROCESS_PID}"
    check_kill_by_name "$PROGNAME $PROGARGS"
        check_kill_by_name "$PROGNAME $PROGARGS"
        kill ${PID} 2>/dev/null

$ cat /tmp/sshellcheck.mrg | grep -i root

      "check_configure_select ROOT" "Root folder:          /"\
      'ROOT')
        echo "'${ALLOWED_FILES}' must be placed at root folder but was found here:" >>"${LOGFILENAME}"
        printf "%s" "'${ALLOWED_FILES}' must be placed at root folder"

$ cat /tmp/sshellcheck.mrg | grep -i sudo

$ 
  • Нет команды rm -rf / для очистки всего раздела жесткого диска.
  • Нет требования, чтобы sudo использовалось для запуска скрипта.
  • Сценарий фактически гарантирует, что в проверенных файлах используются только авторизованные функции C.
  • Быстрый просмотр кода bash / shell показывает, что он написан профессионально и за ним легко следовать.
  • Использование shellcheck для объединенных включаемых файлов выявляет только три синтаксические ошибки.
  • Имена авторов определены, и у основного автора даже есть его фотография на его github странице.
  • Хотя в жизни нет никаких гарантий, 42FileChecker кажется безопасным для использования.

Это не читаемые человеком скрипты bash, о которых вам нужно так сильно беспокоиться. Это скомпилированные двоичные объекты, которые вы не можете прочитать, которые вызывают беспокойство. Например, программа под названием «блестящая оживленная сфера» может нарисовать что-то подобное на вашем экране, но в фоновом режиме она может стереть все ваши файлы.


Оригинальный ответ

Лучше спросить автора сценария, что он делает. В самом деле, вы можете почти дословно опубликовать свой вопрос, как показано выше.

Также спросите автора:

  • Какие файлы обновляются?
  • Что произойдет, если произойдет сбой из-за сбоя питания или ошибки программы?
  • Может ли мини Резервное копирование будет выполнено первым?

И любые другие хорошие вопросы, которые вы можете придумать.


Правка 1 - Беспокойство по поводу злонамеренного автора.

Вы должны использовать программное обеспечение только с большим количеством хороших публичных обзоров. В качестве авторов, которым вы доверяете здесь, в Ask Ubuntu, таких как Серж, Джейкоб, Колин Кинг и т. Д. Другие уважаемые сайты, такие как Ask Ubuntu и их уважаемые участники, также должны считаться «не вредоносными».

Преимущество «уважаемых авторов» здесь, в Ask Ubuntu, заключается в том, что они ставят свою самооценку на «очки репутации». Если бы они намеренно написали код, который «украл» или «испортил» данные, они бы быстро потеряли свою репутацию. Действительно, авторы могут страдать от "гнева модов" и быть отстраненными от работы и / или лишить 10 000 очков репутации.


Правка 2 - Не следуйте всем инструкциям

Я более подробно изучил инструкции вашего bash-скрипта:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker &&
    cd ~/42FileChecker &&
    bash ./42FileChecker.sh

«Безопасный» метод - это только запустите первую строку:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker

Это загружает сценарии, но не запускает их. Затем используйте nautilus (файловый менеджер) для проверки установленных каталогов и файлов. Очень быстро вы обнаружите, что есть коллекция сценариев bash, написанных группой студентов во Франции.

Целью скриптов является компиляция и тестирование программ на Си на предмет неправильных функций и утечек памяти.

11
ответ дан 25.10.2019, 12:06
  • 1
    Да, но я думал о ситуациях, когда автор мог делать что-то злонамеренное умышленно. – mVChr 07.05.2019, 02:48
  • 2
    @nicholas Я ответил на ваш комментарий, пересмотрев ответ. – Robert Rossney 07.05.2019, 03:30
  • 3
    Я изучаю C на курсе Ecole 42. Функции, которые я выполняю, должны пройти через эту проверку норм. Мне нужно установить 42FileChecker в Ubuntu, чтобы запустить эту проверку норм. Я полагаю, что сейчас мне просто нужно доверять этому сценарию, но мне нужно было знать, как сделать «безопасный запуск» первого сценария, потому что я не так хорош в поисках человека. Спасибо за помощь. Я просто запусту ВМ в следующий раз. – eyquem 07.05.2019, 07:59
  • 4
    @nicholas Строка 24 из ~/42FileChecker/includes/display/display_credits.sh утверждает, что работа Норминетт является зависимостью: norminette (42 born2code) http://www.42.fr. Я прочитал это прошлой ночью, и поэтому я написал, что это была школа (школа) во Франции, которая опубликовала 42FileChecker . Из того, что я просмотрел код до сих пор, я не буду беспокоиться о его запуске. Кроме того, в shellcheck сообщается об очень небольшом количестве синтаксических ошибок, что удивительно для сценария bash из 5 360 строк. Многие профессионально опубликованные скрипты bash имеют много синтаксических ошибок. – Robert Rossney 08.05.2019, 02:39
  • 5
    @nicholas С точки зрения безопасности, использование среды и сценариев, предоставляемых для класса, вероятно, является лучшим подходом. Это также исключает возможность поведения, отличного от официальной версии курса, что может стать неожиданностью во время сдачи. Вы уверены, что нет удаленного доступа к этому компьютеру, возможно, с использованием предоставляемой кампусом службы VPN или SSH с другого компьютера, к которому вы можете получить удаленный доступ? – eyquem 08.05.2019, 04:51

Теги

Похожие вопросы