Podstawy skryptów shell #1
Napisał: Patryk Krawaczyński
25/05/2017 w Bezpieczeństwo Brak komentarzy. (artykuł nr 612, ilość słów: 335)
B
ezpieczeństwo, jeśli chodzi o pisanie skryptów shell bywa różne. Większość użytkowników skupia się zazwyczaj na rozwiązaniu napotkanego problemu programistycznego lub automatyzacji żmudnego zadania. Nie doprowadzanie w kodzie do luk umożliwiających późniejszą ich eksploatację schodzi na drugi plan. Dlatego w tej serii zostanie opisanych kilka typowych błędów popełnianych w skryptach shell oraz sposoby, w jaki można je wykorzystać i nim zapobiec.
Ataki na zmienne środowiskowe
– są najczęstszym sposobem manipulowania zachowaniem obranego za cel skryptu. Szczególnie jeśli jego wykonanie jest zależne od wartości tych zmiennych. Mimo, że w dzisiejszych czasach ataki te powinny być mniej szkodliwe dla skryptów, ponieważ nie nadaje się im już atrybutów setuid! To nadal mogą spowodować nieprawidłowe zachowanie w systemie (sprawa ma się gorzej, jeśli to skrypt wywołuje programy z atrybutem suid). Ataki mogą być również szkodliwe w zastosowaniach wieloużytkownikowych, gdy jeden użytkownik jest w stanie przeprowadzić modyfikację skryptów innego użytkownika poprzez błąd lub niepoprawną konfigurację.
Popularną formą tego ataku jest modyfikacja zmiennej środowiskowej PATH
. Zmienna ta steruje tym, co zostanie wykonane podczas wpisania polecenia bez podania pełnej ścieżki. Np. polecenie date jest wykonywane w rzeczywistości poprzez ścieżkę /bin/date przy zmiennej PATH=/bin
. Spójrzmy teraz na skrypt /usr/bin/tempo.sh:
#!/bin/sh ls /tmp
Jeśli stworzymy teraz złośliwy skrypt o nazwie ls (echo "Pwned!"
) i umieścimy go w ścieżce /home/agresor/bin/ls i przed wykonaniem skryptu tempo.sh wykonamy polecenie:
export PATH=/home/agresor/bin:$PATH
To po wykonaniu skryptu tempo.sh zamiast zawartości katalogu tymczasowego otrzymamy:
agresor@darkstar:~$ ./tempo.sh Pnwed!
Ponieważ poddaliśmy manipulacji ścieżkę wyszukiwania to nasz złośliwy skrypt został wykonany jako pierwszy zamiast programu /bin/ls.
Zawsze należy pamiętać, aby podawać bezwzględne ścieżki podczas wykonywania skryptów. To samo tyczy się dostępu do zawartych w nich programach. Jeśli nasz skrypt do działania potrzebuje innych skryptów lub programów, które nie używają bezwzględnych ścieżek dostępu należy wyraźnie ustawić zmienną PATH
w naszym skrypcie, aby uniknąć późniejszych problemów z nadpisaniem:
agresor@darkstar:~$ cat /usr/bin/tempo.sh #!/bin/sh declare -r PATH=/bin export PATH ls /tmp agresor@darkstar:~$ echo $PATH /home/agresor/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin agresor@darkstar:~$ ./usr/bin/tempo.sh cpu_stats mc-agresor file09euhz fileKUOTKQ fileefD0Vb
Skrypt dzięki ustawieniu własnej zmiennej środowiskowej w postaci ścieżki przeszukiwania (która dodatkowo została oznaczona jako tylko do odczytu) nie wykonał złośliwego skryptu.
Więcej informacji: Ograniczenia z poziomu powłoki