Tegin ühele Linux-arvutile alltoodud programmi abil security-testi.
Programmi põhimõte on selles, et teha nii sügavat kataloogipuud,
kui võimalik ning vaadata millise kännu taha asi kinni jääb.
Edastan antud testi tulemused aruteluks:
SÜSTEEM:
Masin: ALPHA-server DS-10, 10Gb SCSI-ketas, 128M OP-mälu
OS: AlphaLinux RedHat 6.2
KERNEL: 2.2.16
Kettapilt: BSD4-tüüpi disklabel
a: ~20Mb (boot-partition)
b: ~600Mb (swap)
d: / 250M (ext2fs)
e: /usr 3.5G (ext2fs)
f: /var 1G (ext2fs)
g: /tmp 1G (ext2fs)
h: /cache 2.5G (ext2fs)
Eeltegevused programmi testimiseks:
PS1='$ '
(et vältida ettetulevaid shelli jamasid)
Alltoodud programmi käivitamisel /usr/users/ml-kataloogis ml-õigustes
tehti üksteise sisse 8123 kataloogi ning programm lõppes veateatega:
mkdir: cannot allocate memory
Konsoolile tuli kerneli veateade:
ext2fs: /dev/sda5 (/usr) inode limit reached
df-käsk näitas, et inode'e oli kasutatud vaid 10%.
Siiski ei õnnestunud ei tavakasutaja õigustes ega ka root-õigustes
seda kataloogipuud kustutada. cd-ga sügavusele 8100 minnes osutus
/-kataloog kättesaamatuks, kuid välja tulles oli jälle kõik ok.
SINGLE-USER-MODE'i minnes (shutdown -h now) osutus, et failisüsteem
oli OK. Samuti oli sealt võimalik see kataloogipuu maha kustutada.
Failisüsteem jäi ka pärast OK.
KÜSIMUSED:
1) Kas keegi on veel sama probleemiga kokku puutunud? Kommentaarid.
2) On keegi leidnud edukat lahendusviisi antud probleemile (kuidas
lahendada olukord ilma masinat ümber paigaldamata)?
Allpool on toodud programm, millega ülaltoodud olukordi tekitada.
Kõike head!
Margus Liiv <m...@kungla.ee>
======================================================================
---lõikekoht----------------kalastaja.c-----------lõikekoht-----------
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
int main(void)
{
int i=0;
while(1) {
i++;
if(mkdir("aaaa",0777)<0) {
printf("n=%d\n",i);
perror("mkdir");
exit(1);
}
if(chdir("aaaa")<0) {
printf("n=%d\n",i);
perror("chdir");
exit(1);
}
}
return(0);
}
------------lõikekoht-----------------lõikekoht----------lõikekoht----
(while test -d aaaa; do mv aaaa a && cd a; done)
rm -r a
--
vix
MAXPATHLEN ja sõbrad ei luba liiga pika täisnimega failiga opereerida.
inodega seotud anomaalia on samas üllatav. ise olen siiani umbes
sellise skriptiga kataloogid maha saanud:
while true
do
mv kataloog/kataloog abi
rmdir kataloog
mv abi kataloog
done
heno
> Alltoodud programmi käivitamisel /usr/users/ml-kataloogis ml-õigustes
> tehti üksteise sisse 8123 kataloogi ning programm lõppes veateatega:
> mkdir: cannot allocate memory
> Konsoolile tuli kerneli veateade:
> ext2fs: /dev/sda5 (/usr) inode limit reached
Spekuleerin:
Failisüsteemi draiveris on vast igale failisüsteemile eraldatud mingi
puhver hetkel kasutuses olevate node'ide hoidmiseks. Et minna juurest
mingisse alamkataloogi, on vaja kõigi vahepealsete kataloogide node'id
sinna puhvrisse kirja panna. Kui see täis saab, siis ongi paha.
Single-user mode elab natuke sügavama puu üle, sest siis pole kedagi
teist sama failisüsteemi kallal müramas (kellele osa puhvriruumi ära
kulub).
Muidugi oleks võimalik seda spekulatsiooni sortsus tuhnimisega kinnitada
või ümber lükata...
--
Ahto Truu (ah...@aprote.ee)