|
|
Bu makalenin farkl� dillerde bulundu�u adresler: English Castellano Deutsch Francais Nederlands Portugues Russian Turkce |
taraf�ndan Frédéric Raynal, Christophe Blaess, Christophe Grenier Yazar hakk�nda: Christophe Blaess ba��ms�z bir aeronotic m�hendisidir. Kendisi Linux hayran�d�r ve il�rerinin bir�o�unu Linux alt�nda yapmaktad�r. Linux Kaynakyaz�land�r�m Projesi (Linux Documentati�n Project) taraf�ndan yay�mlanan man sayfalar�n�n �evirilmesini y�netmektedir. Christophe Grenier ESIEA'da ��renci olarak 5. y�l�ndad�r ve ayn� zamanda burada sistem y�neticili�i yapmaktad�r. Bilgisayar g�venli�i konusunda �zel merak� vard�r. Frédéric Raynal, �evreyi kirletmedi�i, hormon kullan�lmad���, MSG veya hayvansal malzemeler kullan�lmad��� ve sadece tatl�dan olu�tu�u i�in Linux i�letim sistemini y�llard�r kullanmaktad�r. ��erik: |
�zet:
Serimizin be�inci makalesinin konusu multitasking'den dolay� ortaya ��kan g�venlik sorunlar� ile ilgilidir. Az rastlan�r ko�ullar alt�nda s�re�ler, sadece kendilerinin eri�ti�ine "inand���" kaynaklara (dosya, ayg�t, bellek) ayn� anda ba�ka s�re�ler de eri�mektedir. Bu durum, ortaya ��kar�lmas� zor olan hatalara ve ayn� zamanda sistemin genelinde g�venlik a��klar�n�n olu�mas�na neden olmaktad�r.
Az rastlan�r ku�ullar i�in genel ilke �udur : bir s�re� sistem kayna��n� sadece kendisi ula�mak istiyor. S�re�, ba�ka bir s�recin bu kayna�� kullan�p kullanmad���n� denetlemekte ve ondan sonra bu kayna��n kullan�m�n� ele ge�irmekte ve istedi�i gibi kullanmaktad�r. Problem, ilk s�recin kayna��n�n serbest olup olmad���n�n denetimi ile ger�ek kullan�ma ge�me zaman� aras�nda, ba�ka bir s�recin bu kayna�� kullanmak istedi�i durumda ortaya ��kmaktad�r. Sunu� duruma g�re de�i�iklik g�stermektedir. ��letim sistemleri teorisindeki klasik duruma g�re, her iki s�re� sonsuz d�ng�ye girer ve kilitlenirler. Pratikte ise, bu durum uygulamalar�n�n yanl�� �al��mas�na ve bir s�recin yanl���kla di�erinin haklar�ndan faydalanmas� durumunda ise, ger�ek g�venlik a��klar�na neden olmaktad�r.
Daha �nce kaynak olarak adland�rd���m�z seyin farkl� anlamlar� vard�r.
Az rastlan�r ko�ullar�n bir�o�u, �ekirde�in bellek alanlar�n�n kullan�m�yla ilgili
ortaya ��km��t�r ve d�zeltilmi�tir. Biz burada sistem uygulamalar�na odaklanaca��z ve
ilgilenece�imiz kaynaklar da dosya sistemindeki inode'lar olacakt�r. Bu sadece s�radan
dosyalar� de�il, ayn� zamanda /dev/
dizininde bulunan dosyalar arac�l��� ile
sistem ayg�tlar�n�n kullan�m�n� da kapsamaktad�r.
Genelde sistem g�venli�ine y�nelik yap�lan sald�r�lar, Set-UID
olan uygulamalara yap�lmaktad�r. Sald�r�y� yapan ki�i, program�n sahip
oldu�u kullan�c� haklar�ndan yararland��� s�rece program� kullanacakt�r.
Daha �nce anlatt���m�z g�venlik a��klar�na (bellek ta�mas�, bi�imlendirme
katarlarlar�, ...) kar��n, az rastlan�r ko�ullar�n ortaya ��kartt��� g�venlik a��klar�,
"�zel" program �al��t�r�lmas�na genellikle izin vermemektedir.
Sadece program �al��t��� s�rece,
program�n sahip oldu�u kaynaklardan yararlanmaya olanak sa�lamaktad�r.
Bu �ekilde yap�lan sald�r�lar sadece Set-UID olan uygulamalara de�il,
kullan�c�lar�n�n �al��t�rd��� "normal" uygulamalara y�nelik de yap�lmaktad�r.
Sald�rgan, genellikle pusuda yatmakta ve ba�ka bir kullan�c�n�n, �zellikle
"root" kullan�c�s�n�n ilgili program� �al��t�rmas�n� beklemektedir ki bu
program�n sahip oldu�u kaynaklar� kullanabilsin. Kaynak kullan�m� bir dosyaya yazma
(S�zgelimi, ~/.rhost
dosyas�na "+ +
" yazarak, herhangi bir
bilgisayardan bu bilgisayara
�ifresiz ve root haklar�na sahip olarak ula�abilmektedir.)
veya gizli yada �nemli bilgiler i�eren dosyalardan okuma (�nemli ticari bilgileri,
ki�isel sa�l�k bilgileri, �ifre dosyas� bilgileri, �zel anahtar bilgileri vs)
haklar�na sahip olmaktad�r.
�nceki makalelerde konu�ulan g�venlik a��klar�ndan farkl� olarak, bu g�venlik sorunu Set-UID olan uygulamalar�n�, sistem sunucular�n�n�, daemonlar�n�, k�saca hert�rl� uygulamay� tehtid etmektedir.
�lk olarak, Set-UID olan ve kullan�c�n�n dosyas�na bilgi yazacak bir program�n davran��lar�n� inceleyelim. Biz, s�zgelimi sendmail gibi, elektronik ileti g�nderici yaz�l�m program�n� da ele alabilirdik. Diyelim ki, kullan�c� bir dosya ad� ile bu dosyaya yaz�lacak bilgiyi programa parametre olarak verebilsin. Buna g�re program, kendisini �al��t�ran ki�inin yaz�lacak dosyan�n sahibi olup olmad���n� denetleyecektir. Ayr�ca, dosyan�n sistem dosyalar�ndan birine ba�lant� dosyas� olup olmad���n� da denetlemesi gerekecektir. Unutmamak gerekir ki, Set-UID olan bir program, istedi�i dosyay� de�i�tirme hakk�na sahiptir. Buna g�re, kendi ger�ek UID ile dosya sahibinin kullan�c� numaras�n� kar��la�t�rmak gerekecektir. �imdi ��yle bir program yazal�m :
1 /* ex_01.c */ 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <unistd.h> 5 #include <sys/stat.h> 6 #include <sys/types.h> 7 8 int 9 main (int argc, char * argv []) 10 { 11 struct stat st; 12 FILE * fp; 13 14 if (argc != 3) { 15 fprintf (stderr, "usage : %s file message\n", argv [0]); 16 exit(EXIT_FAILURE); 17 } 18 if (stat (argv [1], & st) < 0) { 19 fprintf (stderr, "can't find %s\n", argv [1]); 20 exit(EXIT_FAILURE); 21 } 22 if (st . st_uid != getuid ()) { 23 fprintf (stderr, "not the owner of %s \n", argv [1]); 24 exit(EXIT_FAILURE); 25 } 26 if (! S_ISREG (st . st_mode)) { 27 fprintf (stderr, "%s is not a normal file\n", argv[1]); 28 exit(EXIT_FAILURE); 29 } 30 31 if ((fp = fopen (argv [1], "w")) == NULL) { 32 fprintf (stderr, "Can't open\n"); 33 exit(EXIT_FAILURE); 34 } 35 fprintf (fp, "%s\n", argv [2]); 36 fclose (fp); 37 fprintf (stderr, "Write Ok\n"); 38 exit(EXIT_SUCCESS); 39 }
Daha �nceki makalede de anlatt���m�z gibi, Set-UID olan uygulaman�n ge�ici olarak sahip oldu�u haklar� bir yana b�rak�p, kendisini �a��ran kullan�c�n�n UID'si ile dosyay� a�may� denemesi daha iyi olacakt�r. Bu arada, yukar�daki program, bir daemon program�n, kullan�c�lara verdi�i hizmeti temsil etmektedir. Her zaman root olarak �al��arak kendi ger�ek UID'si yerine kullan�c� UID'sini denetleyebilir. Her neyse, ger�ek�i olmasa da sorunu anlamada ve g�venlik a����ndan "faydalanma" bak�m�ndan kolayl�k sa�lad��� i�in bu �emaya sad�k kalaca��z.
G�rd���n�z gibi program �al��t���nda, gerekli t�m denetimleri yerine getirmektedir, yani
dosyan�n var olup olmad���n�, kullan�c�ya ait olup olmad���n� ve s�radan bir dosya
olup olmad���n� denetlemektedir. Daha sonra dosya a��lmakta ve verilen bilgi i�ine
yaz�lmaktad�r. ��te, g�venlik a���� da burada ortaya ��kmaktad�r! Daha a��k olmak gerekirse,
g�venlik a����, stat()
fonksiyonu ile dosya �zelliklerini belirlemekle,
fopen()
fonksiyonu ile de dosyay� ger�ekten a�ma aras�nda
ge�en zaman dilimindedir. Bu zaman aral��� olduk�a k�sad�r, ancak sald�rgan, bu
a��ktan faydalanabilir ve dosyan�n �zelliklerini bu arada de�i�tirebilir. Sald�r�m�z�
kolayla�t�rmak ve bu arda gerekli de�i�ikli�i elle yapabilmek i�in, iki i�lem
aras�nda ge�en zaman� art�ral�m. Daha �nce bo� olan 30. sat�ra s�recin uykuya
yataca�� (bekleme) komutunu, a�a��daki gibi ekleyelim:
30 sleep (20);
�imdi, bir uygulama yapal�m. �lk �nce uygulamay� (program�), Set-UID root olarak
ayarlayal�m. Ayr�ca, �ifrelerinin bulundu�u /etc/shadow
dosyas�n�n bir
yede�ini alal�m. Bu �ok �nemlidir.
$ cc ex_01.c -Wall -o ex_01 $ su Password: # cp /etc/shadow /etc/shadow.bak # chown root.root ex_01 # chmod +s ex_01 # exit $ ls -l ex_01 -rwsrwsr-x 1 root root 15454 Jan 30 14:14 ex_01 $
Sald�rgan i�in her�ey haz�r. Kendi kullan�c�m�za ait bir dizindeyiz.
G�venlik a���� ve Set-UID root olan bir uygulamam�z (ex_01
) var.
Yapmak istedi�imiz �ey ise, /etc/shadow
�ifre dosyas�ndaki
root kullan�c�s�na ait �ifreyi, bo� bir �ifreyle de�i�tirmektir.
�lk �nce fic
ad�nda kendimize ait bir dosya yarat�yoruz:
$ rm -f fic $ touch fic
Daha sonra uygulamam�z� arka planda �al��t�r�yoruz. Programdan, ona verdi�imiz dosyaya gerekli bilgiyi yazmas�n� istiyoruz. Program, gerekli denetimleri yapt�ktan sonra, dosyaya yazmadan once biraz beklemektedir.
$ ./ex_01 fic "root::1:99999:::::" & [1] 4426
root
sat�r�n�n i�eri�i, shadow(5)
man sayfas�na
g�re haz�rlanm��t�r ve en �nemli k�sm�, �ifre yok anlam�na gelen ikinci alan�n
bo� olmas�d�r. Program beklemekte iken, fic
dosyas�n� silip,
/etc/shadow
dosyas�na bir simgesel (symbolic) veya ger�ek (physical) ba�lant�
yapmak (ikiside oluyor) i�in yakla��k 20 saniyemiz vard�r.
Bir hat�rlatma yapal�m, isteyen herkes bir dosyaya, kendisinin dosyada okuma hakk�
olmasa bile, kendi veya /tmp
dizininde ba�lant� yaratabilir
(bunu birazdan g�rece�iz). Dosyan�n bir kopyas�n�, ancak okuma hakk�
oldu�u zaman olu�turulabilmektedir.
$ rm -f fic $ ln -s /etc/shadow ./fic
Daha sonra kabuktan, ex_01
s�recini �n plana almas�n� istiyoruz ve program�n
sonlanmas�n� bekliyoruz:
$ fg ./ex_01 fic "root::1:99999:::::" Write Ok $
��te, her�ey bitti! /etc/shadow
dosyas�nda art�k, root kullan�c�s�na ait
�ifre alan� bo�, yani �ifre yok. �nanm�yor musunuz?
$ su # whoami root # cat /etc/shadow root::1:99999::::: #
Eski �ifre dosyas�n� yerine koyarak deneyimimizi tamamlayal�m:
# cp /etc/shadow.bak /etc/shadow cp: replace `/etc/shadow'? y #
Set-UID root olan bir uygulamada az rastlan�r ko�uldan dolay� ortaya ��kan g�venlik a����ndan faydalanmay� ba�ard�k. Tabii, dosyay� de�i�tirmek i�in 20 saniye zaman tan�makla program�n, bize olduk�a "yard�m�" dokundu. Ger�ek uygulamalarda ise, bu t�r zaman aral�klar� �ok k�sa olmaktad�r. Peki bunun i�in ne yap�labilir?
Genell prensip, denemeleri otomatik yapan kabuk programlar� kullanmak ve deneme say�s�n� y�zlerce, binlerce hatta onbinlerce kez tekrarlamak, yani aktif sald�r� y�ntemi kullan�lmaktad�r. G�venlik a����ndan faydalanabilme �ans�n� art�rmak, bizim durumuzda iki i�lem aras�ndaki zaman� art�rmak i�in �e�itli hilelerden faydalan�labilir. Buradaki ama�,dosya �zerindeki de�i�tirme i�lemini yerine getirmeden �nce, program� m�mk�n oldu�u kadar yava�latmakt�r. �stedi�imizi elde etmek i�in �e�itli yakla��mlar kullanabiliriz:
nice -n 20
getirerek, m�mk�n oldu�u kadar yava�latmak.
while (1);
) kullanarak, harcayarak sistem y�k�n� art�rmak.
Az rastlan�r ko�ullar�n ortaya ��kartt��� g�venlik a��klar�ndan faydalanma y�ntemi tekrar gerektirmektedir ve olduk�a s�k�c� bir i�lemdir. Ayn� zamanda da olduk�a kullan��l�d�r! �imdi bizi ��z�me g�t�recek en etkili y�ntemleri bulmaya �al��al�m.
Yukar�da anlatt���m�z sorun, bir nesne �zerinde iki i�lem aras�nda
ge�en zaman i�erisinde, bu nesnenin �zelliklerini de�i�tirebilmekte yatmaktad�r.
S�radan kullan�c� olarak /etc/shadow
dosyas�n� de�i�tirmek ve hatta
okumak olduk�a zor bir i�lemdir. Ger�ekte, de�i�iklik dosyan�n var olan a�a�
yap�s�ndaki ba�lant�s� ile fiziksel olarak dosyan�n kendisi aras�ndad�r.
rm
, mv
, ln
gibi sistem komutlar�n�n
bir�o�unun dosya i�eri�i �zerinde de�il, dosya ad� �zerinde i�lem yapmaktad�rlar.
rm
ve unlink()
sistem �a�r�s� ile dosya silme i�leminde bile,
dosyan�n i�eri�i, ancak, dosyaya son fiziksel ba�lant�s� kesildikten sonra silinmektedir.
Dolay�s�yla, daha �nceki programda yapt���m�z hata, stat()
ve
fopen()
i�lemleri aras�nda ge�en zaman diliminde, dosya ad� ile i�eri�i
aras�ndaki ili�kinin sabit kalaca��n� d���nmemizdir. Bu ili�kinin hi� te
sabit kalmad���n� anlamak i�in, dosyalardaki fiziksel ba�lant� �rne�ini ele alabiliriz.
Kendimize ait olan bir dizinde, bir sistem dosyas�na ba�lant� olu�tural�m.
Dosya ile ilgili olan dosyan�n sahibi ve eri�im haklar� de�i�meden kalacakt�r tabii.
ln
komutundaki -f
se�ene�i sayesinde, ba�lant� i�in verilecek ayn�
isimdeki bir dosya var olsa bile, ba�lant� yinede olu�turulmaktad�r:
$ ln -f /etc/fstab ./myfile $ ls -il /etc/fstab myfile 8570 -rw-r--r-- 2 root root 716 Jan 25 19:07 /etc/fstab 8570 -rw-r--r-- 2 root root 716 Jan 25 19:07 myfile $ cat myfile /dev/hda5 / ext2 defaults,mand 1 1 /dev/hda6 swap swap defaults 0 0 /dev/fd0 /mnt/floppy vfat noauto,user 0 0 /dev/hdc /mnt/cdrom iso9660 noauto,ro,user 0 0 /dev/hda1 /mnt/dos vfat noauto,user 0 0 /dev/hda7 /mnt/audio vfat noauto,user 0 0 /dev/hda8 /home/ccb/annexe ext2 noauto,user 0 0 none /dev/pts devpts gid=5,mode=620 0 0 none /proc proc defaults 0 0 $ ln -f /etc/host.conf ./myfile $ ls -il /etc/host.conf myfile 8198 -rw-r--r-- 2 root root 26 Mar 11 2000 /etc/host.conf 8198 -rw-r--r-- 2 root root 26 Mar 11 2000 myfile $ cat myfile order hosts,bind multi on $
/bin/ls
komutundaki -i
se�ene�i sayesinde, sat�r ba��nda
dosyan�n sahip oldu�u inode numaras� g�r�nt�lenmektedir. Dolay�s�yla, ayn� dosya
isminin iki farkl� inode numaras�n� i�aret etti�ini g�rmekteyiz.
Ger�ek �u ki biz, dosyan�n �zelliklerini denetleyen ve i�eri�ine ula�an fonksiyonlar�n,
ayn� i�eri�e ve inode numaras�na sahip dosyaya ula�s�nlar isteriz.
Ve bu m�mk�nd�r! �ekirde�in kendisi bize dosya eri�im numaras� (file descriptor)
verdi�nde, dosya ad� ve i�eri�i aras�ndaki ili�kinin sabit kalmas�n�
otomatik olarak sa�lamaktad�r. Okumak i�in bir dosyay� open()
sistem �a�r�s� (system call) ile a�t���m�zda, bir tamsay� geri g�ndermektedir.
Dosya eri�im numaras� olan bu tamsay�, dosya ad� ile i�eri�i
aras�ndaki ili�kiyi, sistemin tuttu�u i� tablolarda sa�lamaktad�r.
Daha sonra yap�lacak olan t�m okuma i�lemleri, dosya ad�na ne olursa olsun,
dosya a�ma i�lemi s�ras�ndaki i�erik neyse, onun �zerinden yap�lacakt�r.
Bunu biraz daha vurgulayal�m: dosya bir kere a��ld�ktan sonra, dosya ad� ile
ilgili yap�lacak t�m i�lemlerin, buna silmek te dahil, dosya i�eri�i �zerinde
hi� bir etkisi olmayacakt�r. Dosya eri�im numaras�na sahip olan s�re�ler oldu�u
s�rece dosyan�n, bulundu�u dizinden ad� silinse bile, i�eri�i disk �zerinden
silinmeyecektir. open()
ile close()
sistem �a�r�lar�
aras�nda ge�en zaman aral���nda, dosya i�eri�i ile olan ili�kinin
sabit kalaca��n� �ekirdek garanti etmektedir.
O zaman ��z�m�m�z� bulduk demektir! �lk �nce i�e dosyay� a�makla ba�lamal� ve
dosya �zelliklerini (haklar�n�), dosya eri�im numaras� arac�l�yla
daha sonra denetlemelidir. Bunun i�in stat()
gibi �al��an,
ancak dosya ad� yerine, dosya eri�im numaras� parametre olarak alan
fstat()
sistem �a�r�s�n� kullanabiliriz. Daha sonra dosya �zerinde
G� (IO=Input Output, G�=Giri� ��k��) yapmak i�in fopen()
gibi
�al��an, ancak dosya ad� yerine, dosya eri�im numaras� parametre olarak alan
fdopen()
fonksiyonunu kullanaca��z. Dolay�s�yla program, a�a��daki gibi
olmaktad�r:
1 /* ex_02.c */ 2 #include <fcntl.h> 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <unistd.h> 6 #include <sys/stat.h> 7 #include <sys/types.h> 8 9 int 10 main (int argc, char * argv []) 11 { 12 struct stat st; 13 int fd; 14 FILE * fp; 15 16 if (argc != 3) { 17 fprintf (stderr, "usage : %s file message\n", argv [0]); 18 exit(EXIT_FAILURE); 19 } 20 if ((fd = open (argv [1], O_WRONLY, 0)) < 0) { 21 fprintf (stderr, "Can't open %s\n", argv [1]); 22 exit(EXIT_FAILURE); 23 } 24 fstat (fd, & st); 25 if (st . st_uid != getuid ()) { 26 fprintf (stderr, "%s not owner !\n", argv [1]); 27 exit(EXIT_FAILURE); 28 } 29 if (! S_ISREG (st . st_mode)) { 30 fprintf (stderr, "%s not a normal file\n", argv[1]); 31 exit(EXIT_FAILURE); 32 } 33 if ((fp = fdopen (fd, "w")) == NULL) { 34 fprintf (stderr, "Can't open\n"); 35 exit(EXIT_FAILURE); 36 } 37 fprintf (fp, "%s", argv [2]); 38 fclose (fp); 39 fprintf (stderr, "Write Ok\n"); 40 exit(EXIT_SUCCESS); 41 }
Bu sefer 20. sat�rdan sonraki program�m�z�n �al��mas�n�, dosya ad� �zerinde yap�lan hi�bir de�i�iklik (silme, de�i�tirme, ba�lant� kurma) etkilemeyecektir ve orijinal fiziksel dosyan�n i�eri�i korumnu� olacakt�r.
Demekki, dosya �zerinde i�lem yaparken, dosyan�n ger�ek i�eri�i ile g�sterilimi aras�ndaki ili�kinin sabit kald���n� sa�lamak gerekir. Dolay�s�yla, tercihimiz, dosya ad� �zerine de�il de, daha �nceden a��lm�� ve dosya eri�im numaras� �zerinde i�lem yapan, a�a��daki sistem �a�r�lar�n� kullanmak olmal�d�r:
Sistem �a�r�s� | Kullan�m� |
fchdir (int fd) |
fd ile g�sterilen dizine gider. |
fchmod (int fd, mode_t mode) |
Dosya eri�im haklar�n� de�i�tir. |
fchown (int fd, uid_t uid, gid_t gif) |
Dosya sahibini de�i�tirir. |
fstat (int fd, struct stat * st) |
Fiziksel dosyan�n eri�im numaras� ile birlikte tutulan bilgilere ula��r. |
ftruncate (int fd, off_t length) |
Var olan dosyan�n i�eri�ini siler. |
fdopen (int fd, char * mode) |
Dosya �zerinde G� (IO) yap�lmas�n� sa�lamaktad�r. Bu bir sistem �a�r�s� de�il, stdio k�t�phanesinde tan�mlanm�� bir fonksiyondur. |
��e dosyay� open()
sistem �a�r�s� ile istenilen eri�im d�zeninde
a�makla (yeni dosya yarat�rken ���nc� parametreyi unutmay�n) ba�lamal�. Ge�ici
dosya yarat�rken open()
sistem �a�r�s� �zerinde ayr�nt�l� olarak
duraca��z.
Sistem �a�r�lar�n� kullan�rken, d�n�� de�erleri mutlaka denetlenmelidir.
Az rastlan�r ko�ullar ile ilgili olmasa da, d�n�� de�erlerini
denetlememenin �nemini, /bin/login
program�ndaki eski bir hatadan s�z ederek
g�sterelim.
Bu uygulama, /etc/passwd
dosyas�n� bulamad��� zaman, otomatik
olarak sisteme root olarak girilmesini sa�lamaktayd�. E�er, zarar g�rm��
bir dosya sistemini tamir etmek amac�yla olursa bu durum kabul edilebilirdi.
Di�er taraftan, dosyan�n ger�ekte var olup olmad���n� denetlemeden, sadece dosya
a��lam�yor diye, b�yle bir davran��ta bulunulmas� pek kabul edilebir
de�ildir. En b�y�k dosya eri�im say�s�na eri�tikten sonra,
/bin/login
program� �al��t�rlmas� sisteme root olarak girmeye
yeterli olmaktad�r. Sistem g�venli�i i�in d�nu� ve hata de�erlerini
denetlemenin �neminde s�z etmeyi bir yana b�rakal�m ve konumuza devam edelim..
Sistem g�venli�ini ilgilendiren bir program, bir dosyaya eri�irken sadece kendisinin eri�ti�ini kabul ederek hareket etmemelidir. Ayn� dosya �zerinde olu�abilecek ar rastlan�r ko�ullar� ortadan kald�rmak gerekmektedir. En �nemli tehlike, Set-UID root olan bir program� kullan�c� ayn� anda bir ka� adet �al��t�rarak veya ayn� daemon program�yla birden fazla ba�lant� kurmaya �al��arak, az rastlan�r ko�ul yarat�p, bu arada dosyan�n i�eri�ini daha �nceden �ng�r�lmemi� bir �ekilde de�i�tirmesinde ortaya ��kmaktad�r.
Bu durumun �n�ne ge�ebilmek i�in, bir dosya �zerine ayn� anda sadece bir program�n ula�abilece�i bir y�ntem geli�tirmelidir. Bu veritaban� sistemlerinde, birden fazla kullan�c�n�n ayn� dosya �zerinden sorgu yapmas� veya de�i�iklik yapmak istemesi sorunu ile ayn�d�r. Sorunumuzun ��z�m�, dosya kilitleme y�ntemidir.
Dosya �zerinde veya dosyan�n bir k�sm�nda bir yazma i�lemei olaca�� zaman, s�re�, �ekirdek taraf�ndan buray� kilitlemesini istemektedir. Kilit s�recin elinde bulundu�u s�rece, ba�ka hi� bir s�re� ayn� dosya veya dosyan�n ayn� k�sm� i�in kilit isteyemiyor. Dolay�s�yla, dosya �zerine bir yazma i�lemi yapmadan �nce, s�re� bu dosya i�in bir kilit elde etmekte ve yazma i�lemini ger�ekle�tirmektedir. Bu arada dosyay� ba�kas� de�i�tirememektedir.
Ger�ekte sistem daha ak�ll� davranmaktad�r. �ekirdek, dosya yazma ile dosyadan bilgi okuma ama�l� verilen kilitleri ayr� tutmaktad�r. Dolay�s�yla, dosya i�eri�i de�i�tirilmeyece�i i�in, birden fazla s�re�, dosya okuma kilidi elde edebilir. Ancak, ayn� anda sadece bir s�re� yazma kiliti alabilir ve bu arada ba�ka s�re�lere okuma kilidi dahi verilmez.
Birbiri ile uyumlu olmayan iki tip kilit vard�r. �lki BSD sistemlerinden gelmekte ve
flock()
sistem �a�r�s� ile elde edilmektedir. Sistem �a�r�s�na verilen
ilk parametre, kilitlemek istenilen dosyan�n, dosya eri�im numaras�d�r. �kinci
parametre ise, yap�lacak i�lemi nitelendiren bir sabittir. Sabitin alaca�� de�erler
�unlard�r : LOCK_SH
(okumak i�in kilitle), LOCK_EX
(yazmak i�in kilitle), LOCK_UN
(kiliti serbest b�rak). �stenilen
kilitleme �ekli elde edilene kadar program beklemektedir. Ancak, istenilirse,
LOCK_NB
se�ene�i, ikili VEYA |
ile birle�tirilebilir.
Bu durumda, kilit elde edilemedi�inde, sistem �a�r�s� geri d�nmektedir ve b�ylece d�n��
de�eri denetlenerek, program beklemekte kurtulabilir.
�kincisi kilitleme �ekli, System V sistemlerinden gelmektedir ve fcntl()
sistem �a�r�s� ile olmaktad�r. Ancak kullan�m� biraz kar���kt�r.
Ayn� �ekilde �al��masa da, lockf()
ad�nda bir k�t�phane fonksiyonu
da vard�r. fcntl()
sistem �a�r�s�n�n ilk parametresi,
i�lem yap�lacak dosyan�n eri�im numaras�d�r. �kinci parametre
yap�lacak i�lemi nitelendirmektedir : F_SETLK
kilit elde edilemezse
hemen geri d�nmektedir ve F_SETLKW
kilit elde edilene kadar
beklemektedir. F_GETLK
se�ene�i ile kilit hakk�nda bilgi edinmek m�mk�nd�r
(Bu bizim durmda bir anlam ifade etmemektedir.).
���nc� parametre ise, kilit hakk�nda bilgi edinebilece�imiz
struct flock
tipinde bir veri yap�s�na
i�aret eden bir i�aret�idir. flock
veri yap�s�n�n elemanlar� �unlard�r:
Ad | Tip | Anlam� |
l_type |
int |
Beklenen �al��ma �ekli :
F_RDLCK (okumak i�in kilitleme),
F_WRLCK (yazmak i�in kilitleme) ve
F_UNLCK (kiliti a�mak i�in). |
l_whence |
int |
l_start alan� ba�lang�c� (genelde
SEEK_SET ). |
l_start |
off_t |
Kilitin ba�lang�� yeri (genelde 0). |
l_len |
off_t |
Kilitin uzunlu�u, dosya sonuna kadar ise 0 . |
G�rd���n�z gibi fcntl()
ile dosyan�n bir k�sm�n� kilitlemek m�mk�nd�r.
Dolay�s�yla, flock()
sistem �a�r�s�na g�re daha fazla i�levi vard�r.
Parametre olarak kilitleme yapaca�� dosya isimlerini alan ve
kullan�c�n�n Enter tu�una basana kadar (kiliti a�mak i�in) bekleyen
�rnek bir program� ele alal�m.
1 /* ex_03.c */ 2 #include <fcntl.h> 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <sys/stat.h> 6 #include <sys/types.h> 7 #include <unistd.h> 8 9 int 10 main (int argc, char * argv []) 11 { 12 int i; 13 int fd; 14 char buffer [2]; 15 struct flock lock; 16 17 for (i = 1; i < argc; i ++) { 18 fd = open (argv [i], O_RDWR | O_CREAT, 0644); 19 if (fd < 0) { 20 fprintf (stderr, "Can't open %s\n", argv [i]); 21 exit(EXIT_FAILURE); 22 } 23 lock . l_type = F_WRLCK; 24 lock . l_whence = SEEK_SET; 25 lock . l_start = 0; 26 lock . l_len = 0; 27 if (fcntl (fd, F_SETLK, & lock) < 0) { 28 fprintf (stderr, "Can't lock %s\n", argv [i]); 29 exit(EXIT_FAILURE); 30 } 31 } 32 fprintf (stdout, "Kilitleri kald�rmak i�in Enter tu�una bas�n�z\n"); 33 fgets (buffer, 2, stdin); 34 exit(EXIT_SUCCESS); 35 }
�lk giri� ekran�ndan (console) program� �al��t�ral�m :
$ cc -Wall ex_03.c -o ex_03 $ ./ex_03 myfile Kilitleri kald�rmak i�in Enter tu�una bas�n�zBa�ka bir giri� ekran�ndan da...
$ ./ex_03 myfile Can't lock myfile $�lk giri� ekran�nda
Enter
tu�una basarak, kiliti a�a�yoruz.
lpd
uygulamas�n�n flock()
sistem �a�r�s�n� kullanarak
/var/lock/subsys/lpd
dosyas�n� sadece kendisi kullanacak �ekilde
kilitledi�i gibi, bu kilitleme �ekli az rastlan�r ko�ullar� �nlemektedir.
benzer bi�imde, pam'�n fcntl()
kullanarak kullan�c�
ile ilgili /etc/passwd
dosyas�ndaki bilgileri g�venli
bir �ekilde de�i�tirilebilir.
Ancak, dosya �zerinde okuma veya yazma yapmadan �nce, �ekirdekten gerekli eri�im iznini sa�layan programlar bu �ekilde davranmaktad�r. Dolay�s�yla biz i�birli�i kilitinden s�z ediyoruz demektir, yani okuma veya yazma yapmadan �nce �ekirdekten izin alma. Buna ra�men, bu �ekilde yaz�lmam�� bir program, ba�ka bir s�re� �ekirdekten yazmak i�in kilit alm�� olsa da, dosyan�n i�eri�ini de�i�tirebilir. ��te bu duruma bir �rnek. Bir dosya i�erisine birka� karakter yaz�p, daha �nceki program ile kilitliyoruz :
$ echo "FIRST" > myfile $ ./ex_03 myfile Kilitleri kald�rmak i�in Enter tu�una bas�n�zBa�ka bir giri� ekran�ndan dosyan�n i�eri�ini de�i�tirebiliriz:
$ echo "SECOND" > myfile $�lk giri� ekran�na d�necek olursak, "hasar�" g�rece�iz:
(Enter) $ cat myfile SECOND $
Bu sorunu ��zmek i�in Linux �ekirde�i, System V'den gelen bir kilitleme
y�ntemini sistem y�neticisinin hizmetine sunmaktad�r. Dolay�s�yla bu y�ntem,
flock()
ile de�il, ancak fcntl()
ile kullan�labilir.
Sistem y�neticisi i�ekirde�e, fcntl()
ile elde edilen kilitlerin
kesin olduklar�n�, belli eri�im haklar� kombinasyonu ile
s�yleyebilir. Ondan sonra bir s�re� bir dosya i�in yazmak ama�l� bir kilit
elde etmi�se, herhangi ba�ka bir s�re� (root bile) dosyay� de�i�tiremez.
Eri�im haklar� kombinasyonu ��yledir : Set-GID bit aktif hale getirilirken,
dosya sahibinin ait oldu�u gruptan, �al��t�rma biti kald�r�l�r. Bunun i�in
a�a��daki komut kullan�labilir :
$ chmod g+s-x myfile $Ancak, bu yeterli de�ildir. Bir dosya �zerine kesin kilit koyabilmek i�in, dosyan�n bulundu�u b�lme i�in mandatory ad� verilen bir se�ene�inin belirtilmi� olmas� gerekmektedir. Bu genellikle,
/etc/fstab
dosyas�nda, mand
se�ene�ini 4. s�t�na eklemekle veya a�a��daki komutlar� �al��t�rmak ile m�mk�nd�r :
# mount /dev/hda5 on / type ext2 (rw) [...] # mount / -o remount,mand # mount /dev/hda5 on / type ext2 (rw,mand) [...] #�imdi, ba�ka bir giri� ekran�ndan de�i�iklik yapman�n m�mk�n olmad���n� denetleyebiliriz:
$ ./ex_03 myfile Kilitleri kald�rmak i�in Enter tu�una bas�n�zBa�ka bir giri� ekran�ndan :
$ echo "THIRD" > myfile bash: myfile: Resource temporarily not available $�lk ekrana tekrar d�nelim :
(Enter) $ cat myfile SECOND $
Kesin kilit kullan�l�p kullanmayaca��na programc� de�il, sistem y�neticisi
karar vermektedir (s�zgelimi /etc/passwd
, veya /etc/shadow
dosyas� i�in). Ortam d�zg�n bir �ekilde ayarland�ktan sonra, dosya �zerindeki bilgilere
nas�l ula��laca��n� programc� denetlemektedir. Dolay�s�yla, dosya �zerinde yazma i�lemi
yap�l�rken, okuma i�leminin tehlikeli olup olmad���na programc� karar vermektedir.
Olduk�a s�k rastlanan bir durum, programlar�n disk �zerindeki dosyalarda ge�ici bilgi
tutmas� gerekmesidir. En �ok rastlanan durum, bir dosyan�n aras�na bir yere
bilgi eklemek gerekti�i zaman ortaya ��kmaktad�r. Bunun i�in dosyan�n bir kopyas�,
yeni bilgiler de eklenerek, yarat�lmaktad�r. unlink()
sistem �a�r�s�,
orijinal dosyay� silmektedir ve rename()
ile ge�ici dosyan�n ad�
de�i�tirilmektedir.
Ge�ici dosya a�ma i�lemi, e�er d�zg�n yap�lmazsa, hasta ruhlu bir kullan�c� i�in, az rastlanan ko�ullar yaratmaktad�r. Ge�ici dosyalar ile ilgili g�venlik a��klar� yak�nlarda, Apache, Linuxconf, getty_ps, wu-ftpd, rdist, gpm, inn vs gibi uygulamalarda ortaya ��km��t�r. Bu sorundan ka��nmak i�in, baz� noktalar� hat�rlatal�m.
Ge�ici dosya a�ma i�lemi genellikle, /tmp
dizininde yap�lmaktad�r.
Buras�n�n, sistem y�neticisi i�in anlam�, ge�ici bir s�reyle dosyalar�n tutuldu�u bir yerdir.
Dolay�s�yla, buras�n� zaman zaman temizleyen (silen), genellikle cron
da ayarlanan, programlar yaz�labilir veya dizini ayr� bir b�lmeye koyarak,
her sistem a��l���nda, yeniden bi�imlendirilebilir.
Sistem y�neticisi genellikle, de�ici dosyalar�n nerede yer alaca��n�,
<paths.h
> ve <stdio.h
> dosyalar�ndaiki
_PATH_TMP
ve P_tmpdir
simgesel sabitlerde tan�mlamaktad�r.
Asl�nda, /tmp
yerine ba�ka bir dizin kullanmak pek ak�ll�ca bir
davran�� de�ildir. Nedenine gelince, bu dizini kullanan t�m programlar�, buna C
k�t�phanesi de dahil olmak �zere, yeniden derlemek gerekecektir. Ancak,
GlibC k�t�phaneleri i�in TMPDIR
�evre de�i�keni tan�mlanabilir.
Dolay�s�yla, kullan�c�lar, /tmp
dizini yerine, kendilerine ait dizinlerde
ge�ici doya yaratabilirler. �ok b�y�k ge�ici dosya kullanan uygulamalar i�in ve
de /tmp
i�in ayr�lm�� b�lme k���k oldu�unda, bu durum ka��n�lmazd�r.
/tmp
sistem dizini sahip oldu�u eri�im haklar�ndan dolay� �zel bir
yerdir :
$ ls -ld /tmp drwxrwxrwt 7 root root 31744 Feb 14 09:47 /tmp $
t
karakteri, sekizli say� taban�na g�re 01000, ile belirtilen
Sticky-Bit'in dizin �zerinde �zel bir anlam� vard�r. Buna g�re,
sadece dizin sahibi, bu durumda root veya dosyan�n sahibi, dosyay�
silebilir. Dizin i�inde, sistem y�neticisinin yapaca�� bir sonraki temizleme
i�lemine kadar, her kullan�c� g�venli bir �ekilde dosya yarat�p saklayabilir.
Ancak, ge�ici dosyalar�n konuldu�u dizin beraberinde ba�ka sorunlar getirebilir.
S�zgelimi, en basitinden, Set-UID root olan ve kullan�c� ile haberle�en bir uygulamay�
ele alal�m. Elektronik ileti ta��ma program�n� ele alal�m.
Sistem kapan��� s�ras�nda programa,
i�lerini ani bir �ekilde bitirmesi anlam�na gelen, SIGTERM veya SIGQUIT
sinyalleri g�nderilirse, program kullan�c�n�n o anda yazmakta oldu�u, ancak hen�z g�ndermedi�i
e-iletisini kay�t edecektir. Program�n eski s�r�mleri bunu /tmp/dead.letter
ad� alt�nda kay�t etmektedirler. S�radan kullan�c�lar /tmp
dizinde dosya
yaratabildikleri i�in, /etc/passwd
dosyas�na dead.letter
ad� alt�nda bir fiziksel ba�lant� olu�turup, e-ileti programlar�n� �al��t�rarak
yazmaya devam ettikleri mesaj�n yerine "root::1:99999:::::
" de yer ald���
�ifre dosyas�n�n i�eri�ini elde etmi� olurlar.
Bu davran���n ilk sorunu, dosya ad�n�n �nceden biliniyor olmas�d�r.
Program� ilk incelidi�imizde, /tmp/dead.letter
dosya ad�n� hemen ke�if edebiliyoruz. Dolay�s�yla ilk yap�lmas� gereken,
�al��an programa �zg� dosya ad� olu�turmak olmal�d�r. Bu ama�la,
ge�ici ve bize �zg� dosya ad� olu�turan bir �ok k�t�phane fonksiyonu vard�r.
Ge�ici dosya ad� olu�turan b�yle bir fonksiyonun oldu�unu kabul edelim. Ancak, yaz�l�m serbest olarak da��t�ld���ndan ve hatta C k�t�phanesinin bile kaynak programlar�na ula�abildi�imizden, bizar daha zor olsa da, bu dosya ad�n� da �nceden ��renmek m�mk�nd�r. Dolay�s�yla sald�rgan, C k�t�phanesinin olu�turdu�u dosya ad� ile ba�ka bir dosya aras�nda ba�lant� kurabilir. Bu durumda bizim ilk tepkimiz, dosyay� a�madan �nce b�yle bir dosya olup olmad���n� denetlemek olmal�d�r. Bunu i�in a�a��daki gibi bir program par�as� kullanabiliriz:
if ((fd = open (filename, O_RDWR)) != -1) { fprintf (stderr, "%s already exists\n", filename); exit(EXIT_FAILURE); } fd = open (filename, O_RDWR | O_CREAT, 0644); ...
A��kt�r ki b�yle bir program par�as� ile, az rastlan�r ko�ullar�n
ortaya ��kart��� g�venlik a���� yaratm�� oluruz. Kullan�c�, open()
fonksiyonunun ilk �a��r�lmas� ile ikincisi aras�nda, /etc/passwd
dosyas�na ba�lant� yaratabilir. �ki i�lem, aralar�nda ba�ka bir i�lem
girmeyecek �ekilde atomik olarak veya tek olarak yap�lmak zorundad�r.
Bu open()
sistem �a�r�s�na verilen �zel bir se�enek ile m�mk�nd�r.
O_EXCL ve O_CREAT se�enekleri kullan�ld���nda fonksiyon, dosyan�n var olup
olmad���n� denetlemekte, varsa hata vermekte, ancak denetleme ve yaratma i�lemi kesintisiz
olarak (atomik) yap�lmaktad�r.
Bu arada, fopen()
fonksiyonuna bir Gnu uzant�s� olan 'x
'
se�ene�i ile de bu i�lem yap�labilmektedir :
FILE * fp; if ((fp = fopen (filename, "r+x")) == NULL) { perror ("Can't create the file."); exit (EXIT_FAILURE); }
Ge�ici dosyalar�n dosya eri�im haklar� da �nem ta��maktad�r. 644 (dosya sahibi okuyup yazabilir, di�er kullan�c�lar okuyabilir) eri�im haklar�na sahip bir ge�ici dosyaya �nemli bilgiler yaz�lmas� sa�mal�k olur.
#include <sys/types.h> #include <sys/stat.h> mode_t umask(mode_t mask);Fonksiyonu ile dosya yaratma s�ras�ndaki eri�im haklar� d�zenlenebilir. B�ylece, fonksiyon
umask(077)
olarak �al��t�r�ld���nda,
bundan sonra yarat�lacak dosya 600 eri�im haklar�na (dosya sahibi okuma ve yazma,
di�er kullan�c�lar hi�bir hakka sahip de�il) sahip olacakt�r.
Genellikle, ge�ici dosya yaratma i�lemi �� ad�mdan olu�maktad�r:
O_CREAT | O_EXCL
ve m�mk�n en �ok k�s�tlanm�� dosya eri�im haklar�yla
dosyay� a�mak.
Ge�ici dosyaya nas�l sahip olabiliriz?
#include <stdio.h> char *tmpnam(char *s); char *tempnam(const char *dir, const char *prefix);Fonksiyonlar�, rastgele yarat�lm�� dosya i�in bir i�aret�i g�ndermektedir.
�lk fonksiyona NULL
parametresi vererek, statik bir katar adresi elde
edebiliriz. Buras�n�n i�eri�i, bir sonraki tmpnam(NULL)
ile
de�i�tirilmektedir. E�er parametre bir karakter katar� ise, bunun i�in katar�n
boyutu en az L-tmpnam
byte olmal�d�r, olu�turulan isim buraya
kopyalanmaktad�r. Katar ta�malar�na dikkat! _POSIX_THREADS
veya
_POSIX_THREAD_SAFE_FUNCTIONS
sabitleri tan�ml� olduklar� zaman,
olu�abilecek sorunlar hakk�nda fonksiyonun man
sayfas�nda uyar�lar
vard�r.
tempnam()
fonksiyonu, karakter katar�na bir i�aret�i
geri g�ndermektedir. dir
dizini "uygun" ("uygun" kelimesinin
anlam�n� fonksiyonun man
sayfas�nda anlat�lmaktad�r)
olarak verilmelidir. Fonksiyon dosya ad�n� geri g�ndermeden �nce, b�yle bir
dosya olup olmad���n� denetlemektedir. Ancak, fonksiyonun man
sayfas�nda bunun kullan�m� tavsiye edilmemi�tir. Fonksiyonun farkl� uyarlamalar�na
g�re "uygun" kelimesi farkl� anlamlara gelebilir.
Gnome, fonksiyonun a�a��daki gibi kullan�lmas�n� tavsiye etmektedir:
char *filename; int fd; do { filename = tempnam (NULL, "foo"); fd = open (filename, O_CREAT | O_EXCL | O_TRUNC | O_RDWR, 0600); free (filename); } while (fd == -1);Buradaki d�ng� riskleri azaltmakta, ama anyn� zamanda ba�kalar�n� yaratmaktad�r. Ge�ici dosyan�n yarat�laca�� b�lme dolu oldu�u veya sistemde a��lm�� dosya say�s� en fazla de�ere ula�t��� zaman ne olacakt�r?
#include <stdio.h> FILE *tmpfile (void);Fonksiyonu tekil ada sahip bir dosya yaratarak a�maktad�r. Bu dosya kapan�� s�ras�nda otomatik olarak silinmektedir.
GlibC-2.1.3 ile birlikte bu fonksiyonlar tmpnam()
deki gibi bir
y�ntem kullanarak dosya yaratarak a�maktad�rlar. Daha sonra dosya silinmektedir,
ancak Linux, dosyay� kullanan t�m s�re�ler onu serbest b�rakt���nda, yani
close()
sistem �a�r�s� �al��t�r�ld��� zaman, dosya sistemden ger�ekte
silinmektedir.
FILE * fp_tmp; if ((fp_tmp = tmpfile()) == NULL) { fprintf (stderr, "Can't create a temporary file\n"); exit (EXIT_FAILURE); } /* ... ge�ici dosyan�n kullan�m� ... */ fclose (fp_tmp); /* sistemden ger�ekte silindi�i yer */
Basit kullan�mlarda, hatta ba�ka s�rece devredeceksek bile, dosya ad�na gereksinim duymay�z,
sadece ge�ici alan� okuma ve veri saklamak i�in kullan�r�z.
Dolay�s�yla, ge�ici dosyan�n ad�na gereksimimiz olmamaktad�r ve i�eri�ine ula�mam�z
yeterlidir.
tmpfile()
fonksiyonu bunu ger�ekle�tirmektedir.
Fonskiyonun man
sayfas�nda hi� bir�ey yazmamaktad�r, ama
Secure-Programs-HOWTO nas�l dosyas�nda bu fonksiyonun kullan�m�n� tavsiye etmektedir.
Yazara g�re, fonskiyonun �zellikleri aras�nda dosya yartma ile ilgli bir garanti
verilmemi�tir ve kendisi t�m var olan fakl� uyarlamalar� denetleme firsati
bulamam��t�r. Buna ra�men, bu kullan�lan en etkin fonksiyondur.
Son olarak,
#include <stdlib.h> char *mktemp(char *template); int mkstemp(char *template);fonksiyonlar�, "
XXXXXX
" ile verilen bir modele g�re
tekil isim olu�turmaktad�r. Tekil dosya ad� elde edilecek �ekilde
'X' ler de�i�tirilmektedir.
mktemp()
fonksiyonun s�r�mlerine g�re, ilk be� 'X' s�recin
numaras� ile de�i�tirilerek, sadece bir 'X' rastgele
olu�turulmaktad�r, dolay�syla geriye sadece bir karakter tahmin etmek kal�yor.
Fonksiyonun baz� s�r�mlerinde ise, alt� adet olan 'X' lerin say�s�n� art�rmak m�mk�nd�r.
mkstemp()
, Secure-Programs-HOWTO nas�l kayna��nda tavsiye edilen
fonksiyondur. ��te kullan�m y�ntemi:
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> void failure(msg) { fprintf(stderr, "%s\n", msg); exit(1); } /* * Ge�ici bir dosya yarat�r ve geri g�nderir. * Yaratt�ktan sonra, dosya silinmektedir, dolay�s�yla * dizin listelendi�inde g�r�nmemektedir. */ FILE *create_tempfile(char *temp_filename_pattern) { int temp_fd; mode_t old_mode; FILE *temp_file; /* Dosyay� k�s�tl� haklar ile yarat */ old_mode = umask(077); temp_fd = mkstemp(temp_filename_pattern); (void) umask(old_mode); if (temp_fd == -1) { failure("Ge�ici dosya a��lamad�"); } if (!(temp_file = fdopen(temp_fd, "w+b"))) { failure("Ge�ici dosyan�n eri�im numaras� yarat�lamad�."); } if (unlink(temp_filename_pattern) == -1) { failure("Couldn't unlink temporary file"); } return temp_file; }
Bu fonksiyonlar ta��nabilirlik ile genelle�tirme aras�ndaki sorunlar�
g�stermektedir. Yani, standart k�t�phane fonksiyonlar� gerekli
genelle�tirmeyi sa�lamaktad�r, ancak onlar�n uyarlanma �ekilleri
sisteme g�re farkl�l�k g�stermektedir (ta��nabilirlik).
S�zgelimi, tmpfile()
fonksiyonu ge�ici dosyalar� farkl� �ekilde
a�maktad�r (baz� s�r�mler O_EXCL
se�ene�ini kullanmamaktad�r) veya
mkstemp()
fonksiyonunun farkl� uyarlamalar� 'X' leri farkl� �ekilde
kullanmaktad�r.
Ayn� kaynak kullan�ld��� durumdaki az rastlan�r ko�ullar �zerinde durduk.
�ki i�lemin, denetimin �ekirdekte olmad��� s�rece
ard���k olarak yap�ld���n� varsaymamak gerekir. E�er, farkl� threadlerdeki ortak
de�i�kenler, shmget()
ile payla�t�r�lan ortak bellek alanlar� gibi,
az rastlan�r ko�ullar g�venlik a��klar� olu�turuyorsa, ba�ka kaynaklara dayanarak
bunlar� ihmal etmemek gerekir. Bulunmas� zor hatalardan ka��nmak i�in,
eri�im denetleme y�ntemleri (s�zgelimi semaphore'lar) kullan�lmal�d�r.
|
G�rsely�re sayfalar�n�n bak�m�, LinuxFocus Edit�rleri taraf�ndan yap�lmaktad�r
© Frédéric Raynal, Christophe Blaess, Christophe Grenier, FDL LinuxFocus.org Buray� klikleyerek hatalar� rapor edebilir ya da yorumlar�n�z� LinuxFocus'a g�nderebilirsiniz |
�eviri bilgisi:
|
2001-08-13, generated by lfparser version 2.17